1、引入pom
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>11.1</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>11.1</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-gson</artifactId>
<version>11.1</version>
</dependency>
2、定义一个Service
package com.knight.services;
import com.knight.entity.OrderRequest;
import com.knight.response.OrderResponse;
import feign.Headers;
import feign.RequestLine;
public interface CashierService {
@RequestLine("POST /api/order/create")
@Headers("Content-Type: application/json")
OrderResponse create(OrderRequest order);
}
3、定义一个客户端获取类
package com.knight.util;
import feign.Feign;
import feign.gson.GsonDecoder;
import feign.gson.GsonEncoder;
import feign.okhttp.OkHttpClient;
public class Client {
private static String url = "http://www.xxx.com";
public static <T> T create(Class<T> t) {
return Feign.builder()
.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
.client(new OkHttpClient()) //这里使用okhttp客户端
.target(t, url);
}
}
4、定义一个ServiceBean初始化所有的service
package com.knight.services;
import com.knight.util.Client;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ServiceBean {
@Bean
public CashierService getCashierService() {
return Client.create(CashierService.class);
}
}
5、定义一个Controller
package com.knight.controller;
import com.knight.entity.OrderRequest;
import com.knight.response.OrderResponse;
import com.knight.services.CashierService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class GatewayController {
@Resource
private CashierService cashierService;
@PostMapping(value = "/create")
public OrderResponse create(@RequestBody OrderRequest order) {
return cashierService.create(order);
}
}
6、附加Response和Request
package com.knight.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderResponse implements Serializable {
private String code;
private String message;
private Object data;
}
package com.knight.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderRequest implements Serializable {
private String reference;
private Amount amount;
private Product product;
@Data
@AllArgsConstructor
@NoArgsConstructor
static class Amount {
private Double total;
private String currency;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
static class Product {
private String name;
private String code;
private Double price;
private Integer quantity;
private String description;
}
private String returnUrl;
private String callbackUrl;
private String userClientIP;
private String remark;
private Integer expireAt;
}
7、请求参数及结果
request:
{
"reference": "xxx",
"amount": {
"total": 20,
"currency": "ABC"
},
"product": {
"code": "A123",
"name": "Iphone X",
"price": 10,
"quantity": 2,
"description": "description"
},
"returnUrl": "http://www.baidu.com",
"callbackUrl": "http://www.xxx.com/callback",
"userClientIP": "1.1.1.1",
"remark": "mark",
"expireAt": 10
}
response:
{
"code":"00000",
"message":"SUCCESSFUL",
"data":{
"reference":"xxx",
"orderNo":"xxx",
"cashierUrl":"https://www.xxx.com"
}
}
8、配置文件
feign:
httpclient: #这里还可以配置其他参数,具体参数参见FeignHttpClientProperties
enabled: false
connection-timeout: 2000
okhttp:
enabled: true