如何单独使用OpenFeign实现HTTP请求接口调用

Java技术 潘老师 3年前 (2021-06-15) 5027 ℃ (0) 扫码查看

关于什么是OpenFeign在讲Spring Cloud时的文章中介绍过,具体可以参考(21到24小节):

OpenFeign概述—SpringCloud(H版)微服务学习教程(21)

文章目录 一、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中方法时,就可以直接使用对象作为参数和返回值。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/3247.html
喜欢 (9)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】