章
目
录
关于什么是OpenFeign在讲Spring Cloud时的文章中介绍过,具体可以参考(21到24小节):
文章目录 一、OpenFeign是什么 二、OpenFeign功能 三、Feign和OpenFeign的区别 […]
不过以上对OpenFeign的使用都是基于Spring Cloud整合之后的,如果我们想单独使用OpenFeign来实现HTTP请求调用第三方接口,我们该如何去实现呢?这里我们的举列应用场景就是实现一个java项目(非web项目),封装底层http请求接口,打包成sdk可供其他项目使用。以下是实现该案例的步骤:
第1步:新建Maven项目
我们首先新建一个Maven项目(基于quick-start)如下,然后再pom.xml中导入相关依赖如下:
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>9.7.0</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-gson</artifactId>
<version>9.7.0</version>
</dependency>
具体的版本可根据自己的需要进行选择。
第2步:实现基于Feign的底层HTTP请求类
接着我们新建一个http包,我们在包中新建一个HTTP类,这里我们使用OkHttp来实现,具体代码如下:
public class OkHttpFeign extends Feign {
private static final Builder BUILDER = build();
private static final OkHttpClient OK_HTTP_CLIENT = new OkHttpClient();
public OkHttpFeign() {
}
public static Builder build() {
return Feign.build().client(OK_HTTP_CLIENT);
}
public static <T> T target(Class<T> apiType, String host) {
return BUILDER.target(apiType, host);
}
}
注意在Feign.build()时我们还可以指定一些其他参数,比如编码、请求选项、重试策略等,如下:
public static Builder build() {
return Feign.builder()
.decoder(new StringDecoder())
.options(new Request.Options(1000, 3500))
.retryer(new Retryer.Default(5000, 5000, 3))
.client(OK_HTTP_CLIENT);
}
第3步:封装api接口实现类
接下来,我们需要针对不同的api接口来实现对应的封装,比如我们这里针对如下登录接口进行封装:
#请求地址传两个参数-用户名和密码(JSON格式) http://localhost:8080/user/login
我们新建一个UserService接口,并新建对应的实现类UserServiceImpl其具体实现代码如下:
1)UserService接口
public interface UserService {
/**
* 登录接口
*/
@RequestLine("POST /user/login")
@Headers({"Content-Type: application/json;charset=UTF-8"})
String login(String loginInfo);
}
2)UserServiceImpl实现类:
public class UserServiceImpl implements UserService {
private String host;
public UserServiceImpl(String host) {
this.host = host;
}
/**
* 登录实现
*/
@Override
public String login(String loginInfo) {
UserService userService= OkHttpFeign.target(UserService.class, this.host);
return userService.login(loginInfo);
}
}
第4步:调用接口
接下来我们可以将封装好的项目打成sdk给其他项目引用,在其他项目中我们可以直接调用如下:
UserService userService = new UserServiceImpl("http://localhost:8080");
// 构建json格式字符串
JSONObject loginInfo = new JSONObject();
loginInfo.put("username","admin");
loginInfo.put("password","123456");
// 调用接口,获取响应
String result = userService.login(loginInfo.toJSONString());
到这里,我们就实现了OpenFeign的独立使用,可以实现对底层http的封装,来实现对远程api接口的调用。如果你不想每次都传输JSON对象格式的字符串,而是想直接传输实体类,那么可以将封装的OkHttpFeign修改为OkHttpJsonFeign,具体代码如下:
import feign.Feign.Builder;
import feign.codec.Decoder;
import feign.codec.Encoder;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
public class OkHttpJsonFeign extends OkHttpFeign {
private static final Builder BUILDER = build();
private static final Encoder ENCODER = new JacksonEncoder();
private static final Decoder DECODER = new JacksonDecoder();
public OkHttpJsonFeign() {
}
public static Builder build() {
return OkHttpFeign.build().encoder(ENCODER).decoder(DECODER);
}
public static <T> T target(Class<T> apiType, String host) {
return BUILDER.target(apiType, host);
}
}
然后使用OkHttpJsonFeign去调用就可以了,这样的定义Service中方法时,就可以直接使用对象作为参数和返回值。






