使用Feign发送HTTP请求
使用Feign发送HTTP请求
在往常的 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()
来进行构建。
公众号截图
文章在公众号「iceWang」第一手更新,有兴趣的朋友可以关注公众号,第一时间看到笔者分享的各项知识点,谢谢!笔芯!
使用Feign发送HTTP请求的更多相关文章
- Feign发送Get请求时,采用POJO对象传递参数的最终解决方案 Request method 'POST' not supported (附带其余好几个坑)
yml: feign: httpclient: enabled: true properties: #feign feign.httpclient.enabled=true <!-- https ...
- feign发送get请求时用复杂类传参
如题,网上都有做法,只有有些人说的不清楚.而我自己也遇到了其他坑这里记录一下 1.就是网上说的做法: 客户端:application.yml加上配置: feign: httpclient: enabl ...
- feignclient发送get请求,传递参数为对象
feignclient发送get请求,传递参数为对象.此时不能使用在地址栏传递参数的方式,需要将参数放到请求体中. 第一步: 修改application.yml中配置feign发送请求使用apache ...
- spring cloud 之 Feign 使用HTTP请求远程服务
一.Feign 简介 在spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLCo ...
- Java发送Http请求并获取状态码
通过Java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page ...
- AngularJs的$http发送POST请求,php无法接收Post的数据解决方案
最近在使用AngularJs+Php开发中遇到php后台无法接收到来自AngularJs的数据,在网上也有许多解决方法,却都点到即止.多番摸索后记录下解决方法:tips:当前使用的AngularJ ...
- Ajax发送POST请求SpringMVC页面跳转失败
问题描述:因为使用的是SpringMVC框架,所以想使用ModelAndView进行页面跳转.思路是发送POST请求,然后controller层中直接返回相应ModelAndView,但是这种方法不可 ...
- 使用HttpClient来异步发送POST请求并解析GZIP回应
.NET 4.5(C#): 使用HttpClient来异步发送POST请求并解析GZIP回应 在新的C# 5.0和.NET 4.5环境下,微软为C#加入了async/await,同时还加入新的Syst ...
- 在发送ajax请求时加时间戳或者随机数去除js缓存
在发送ajax请求的时候,为了保证每次的都与服务器交互,就要传递一个参数每次都不一样,这里就用了时间戳 大家在系统开发中都可能会在js中用到ajax或者dwr,因为IE的缓存,使得我们在填入相同的值的 ...
随机推荐
- java 调用WebService【转】
1.客户单编程方式(和第一种方式一样) //文件名:HelloService.java import javax.jws.WebMethod; import javax.jws.WebParam; i ...
- 解决加密PDF文档无法复制文字的问题
有的时候在网络上搜索到一篇心仪的PDF文档,想复制其中内容时提示无法复制. 如果只想摘抄其中部分文字内容,可以使用Firefox浏览器打开这篇加密文档. Firefox浏览器自带PDF插件,打开后即可 ...
- Linux配置阿里epl源
去阿里云 有源仓库 阿里云镜像官方站点 https://developer.aliyun.com/mirror/ 先备份本机上的源 mv /etc/yum.repos.d/CentOS-Base.re ...
- 编译安装tree命令
查看当前的tree [12:33:33 root@C8[ ~]#rpm -qi tree Name : tree Version : 1.7.0 Release : 15.el8 Architectu ...
- Java实现:抛开jieba等工具,写HMM+维特比算法进行词性标注
一.前言:词性标注 二.经典维特比算法(Viterbi) 三.算法实现 四.完整代码 五.效果演示: 六.总结 一.前言:词性标注 词性标注(Part-Of-Speech tagging, POS t ...
- Docker学习笔记之-通过Xshell连接 CentOS服务
上一节演示如何在虚拟机中安装 CentOS服务,Docker学习笔记之-在虚拟机VM上安装CentOS 7.8 本节主要演示如何通过 Xshell软件链接CentOS服务,本例以虚拟机作为演示,直接在 ...
- ASP.NET CORE 开发微信公众号(一、测试号管理)
一.注册账号 百度微信公众平台,点击进入. 二.公众平台测试账号 点击进入平台后居然是小程序,我也很费解.以前是找到开发->开发者工具->公众平台测试账号,现在毛都没有了. 不过可以点击这 ...
- Hexo相关配置
date: 2018-11-16 18:27:14 updated: 2018-11-16 20:06:16 1.配置Hexo基本信息 title: 猫熊小才天の书院 #博客标题 subtitle: ...
- sql布尔盲注和时间盲注的二分脚本
布尔盲注: import requests url = "http://challenge-f0b629835417963e.sandbox.ctfhub.com:10080/" ...
- C2. Pokémon Army (hard version) 解析(思維)
Codeforce 1420 C2. Pokémon Army (hard version) 解析(思維) 今天我們來看看CF1420C2 題目連結 題目 略,請直接看原題. 前言 根本想不到這個等價 ...