关于什么是OpenFeign在讲Spring Cloud时的文章中介绍过,具体可以参考(21到24小节):
OpenFeign概述—SpringCloud(H版)微服务学习教程(21)
一、OpenFeign是什么 Feign是一个声明式的Web Service客户端。它的出现使开发Web Se […]
不过以上对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
中方法时,就可以直接使用对象作为参数和返回值。