Java 如何使用Feign发送HTTP请求
作者:iceWang丶 时间:2023-05-10 15:04:08
在往常的 HTTP 调用中,一直都是使用的官方提供的 RestTemplate 来进行远程调用,该调用方式将组装代码冗余到正常业务代码中,不够优雅,因此在接触到 Feign 后,考虑使其作为一个 HTTP 发送基础,来进行远程调用。
下面就让我们来看一下,其是如何使用的。
引入依赖
首先,我们需要将 Feign 的基础依赖引入项目,因为我们只使用 Feign 的 remote 功能,因此,只引入基础依赖。
此外在项目中,我们还自定义了了 JSON 转换和 log 设置,因此还需要引入这些的第三方依赖,如下所示。
<!-- feign -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>10.10.1</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-gson</artifactId>
<version>10.10.1</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-slf4j</artifactId>
<version>10.10.1</version>
</dependency>
发送路径和方法设置
然后,因为 Feign 是一种申明式的调用,因此我们需要配置发送的接口路径和发送接口定义,看下面的例子。
@RequestLine("GET /user/getone?arkOrgId={arkOrgId}&userId={userId}")
JSONObject getOneStaff(@Param("arkOrgId") String arkOrgId,@Param("userId") String userId);
@RequestLine("POST /user/add")
@Headers("Content-Type: application/json")
@Body("{body}")
JSONObject saveStaff(@Param("body") SaveEmployeeDTO saveEmployeeDTO);
在代码实例中,我们定义了两种发送的实例,一种是 GET 请求,一种是 POST 请求,下面,我们分别来看一下其中的代码的作用是什么。
@RequestLine:定义发送方式和发送接口定义,其中用 GET 和 POST 来定义发送方式,然后空格后,写上 servelt path(context path 和域名或ip端口号在其他地方配置);
{}:用来作为占位符,动态填充需要的参数;
@Param:用来匹配 URI 中的占位符;
@Headers("Content-Type: application/json"):构建请求表头,在 POST 请求中,需要声明该请求的发送格式为 json;
@Body:POST 请求,需要标注请求体;
JSONObject:在本实例中,采用是一个通用的 json 对象来接收,方便统一,在自己的代码中,也可以定义一个接受实体类来接受,作用是一样的。
POST 请求,需要在实体中重写 toString() 方法,使其在发送时调用该方法后,是一个 JSON 字符串,详细见后文 Tips 中写的。
定义发送客户端
@Configuration
public class FeignConfig {
public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
@Value("${staff.base.url}")
private String staffBaseUrl;
@Bean
public StaffFeignService staffFeignService() {
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat(DATE_TIME_FORMAT);
return Feign.builder()
.retryer(closeFeignRetry())
.decoder(new GsonDecoder(builder.create()))
.encoder(new GsonEncoder())
.logger(new Slf4jLogger())
.logLevel(Logger.Level.FULL)
.target(StaffFeignService.class, staffBaseUrl);
}
/**
* 关闭feign的失败重试功能
*/
@Bean
public Retryer closeFeignRetry() {
return Retryer.NEVER_RETRY;
}
@Bean
public Request.Options options() {
return new Request.Options(15000, 30000);
}
}
紧接着,我们来定义发送客户端。
首先,我们采用 @Value 来动态添加路由,这样,就可以根据在配置文件中的属性来添加 context path,从而做到可拓展。
然后,feign 的很多配置都是可以根据自身项目需要在 DIY 的,因此在这里,我们配置了编解码采用 GSON 的编解码器,日志级别设置全打印。通过该设置来生成一个 Feign 客户端。
Feign 官方文档,在官方文档中,有详细的配置说明,根据自身需要使用,即可。
使用
@Autowired
StaffFeignService staffFeignService;
// get 请求
JSONObject saveSingleQrCode = staffFeignService.saveSingleQrCode(userId);
// post 请求
SaveMultiQrCodesDTO saveMultiQrCodesDTO = new SaveMultiQrCodesDTO();;
JSONObject saveMultiQrCodes = staffFeignService.saveMultiQrCodes(saveMultiQrCodesDTO);
通过该方式,即可发送对应请求。
Tips
记录一些在使用中的重点,需要注意。
重写 toString() 方法
在发送 JSON 时,需要重写 toString() 方法,否则会导致接受方,无法用 json 进行解析。
@Override
public String toString() {
return JSON.toJSONString(this);
}
异步客户端
有时候,我们使用异步发送,从而不影响我们的主体业务,Feign 也支持该种配置。
@Bean
public IHermesFeignService hermesFeignService() {
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat(DATE_TIME_FORMAT);
return AsyncFeign.asyncBuilder()
.decoder(new GsonDecoder(builder.create()))
.encoder(new GsonEncoder(builder.create()))
.logger(new Slf4jLogger())
.logLevel(Logger.Level.FULL)
.target(IHermesFeignService.class, hermesBaseUrl);
}
重点,就是在构建 Feign 时,采用 AsyncFeign.asyncBuilder() 来进行构建。
来源:https://www.cnblogs.com/JRookie/p/14023522.html?utm_source=tuicool&utm_medium=referral
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
使用java springboot设计实现的图书管理系统(建议收藏)
![](https://img.aspxhome.com/file/2023/8/59928_0s.jpg)
java实现的各种排序算法代码示例
自定义类加载器以及打破双亲委派模型解析
![](https://img.aspxhome.com/file/2023/0/57400_0s.png)
如何为Spring Cloud Gateway加上全局过滤器
基于web项目log日志指定输出文件位置配置方法
![](https://img.aspxhome.com/file/2023/7/83037_0s.jpg)
详谈Android编译命令
Java如何优雅替换if-else语句
![](https://img.aspxhome.com/file/2023/8/71868_0s.jpg)
java整合SSM框架的图文教程
![](https://img.aspxhome.com/file/2023/8/67168_0s.jpg)
java客户端Jedis操作Redis Sentinel 连接池的实现方法
Java获取时间打印到控制台代码实例
![](https://img.aspxhome.com/file/2023/7/96087_0s.png)
Android中Blade的使用方法
Android实现底部导航栏功能(选项卡)
![](https://img.aspxhome.com/file/2023/0/138430_0s.png)
Android中Uri和Path之间的转换的示例代码
如何在Unity中检测死循环和卡死
SpringMvc MultipartFile实现图片文件上传示例
![](https://img.aspxhome.com/file/2023/5/113455_0s.png)
Java实现解出世界最难九宫格问题
JAVA 生成随机数并根据后台概率灵活生成的实例代码
Java Jedis NOAUTH Authentication required问题解决方法
![](https://img.aspxhome.com/file/2023/6/69876_0s.png)