使用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的缓存,使得我们在填入相同的值的 ...
随机推荐
- 《Kafka笔记》4、Kafka架构,与其他组件集成
目录 1 kafka架构进阶 1.1 Kafka底层数据的同步机制(面试常问) 1.1.1 高水位截断的同步方式可能带来数据丢失(Kafka 0.11版本前的问题) 1.1.2 解决高水位截断数据丢失 ...
- Sentinel流控规则
流控规则 注:Sentinel的监控页面一开始是没有东西,需要对监控的服务发起请求后才会出现 资源名:唯一名称,默认请求路径 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,指定对哪个 ...
- spring与struts2整合出现错误HTTP Status 500 - Unable to instantiate Action
在进行spring和struts2整合的时候因为大意遇到了一个问题,费了半天神终于找到了问题所在,故分享出来望广大博友引以为戒!! 我们都知道在spring和struts2整合时,spring接管了a ...
- spring基础学习
ClassXmlAplicationContext和FileSystemXmlApplicationContext的区别 https://www.cnblogs.com/sxdcgaq808 ...
- zk配置文件详解
zookeeper的默认配置文件为zookeeper/conf/zoo_sample.cfg,需要将其修改为zoo.cfg.其中各配置项的含义,解释如下: 1.tickTime:CS通信心跳数 Zoo ...
- react hooks子给父传值
子给父传值需要通过事件方法来传值,这里我们子组件是触发了一个点击事件传值: <Button onClick={()=>setshowregister(false)}>注册</B ...
- requests库响应消息体的四种格式
1.r.text 文本响应内容,返回字符串类型,获取网页html时用: 2.r.content 字节响应内容,返回字节类型,下载图片或者文件时用: 3.r.json json解码响应内容,返回字典 ...
- pause容器作用
1.概念 Pause容器 全称infrastucture container(又叫infra)基础容器. 作为init pod存在,其他pod都会从pause 容器中fork出来. 每个Pod里运行着 ...
- Java中final修饰的方法是否可以被重写
这是一次阿里面试里被问到的题目,在我的印象中,final修饰的方法是不能被子类重写的.如果在子类中重写final修饰的方法,在编译阶段就会提示Error.但是回答的时候还是有点心虚的,因为final变 ...
- C语言经典100例-ex001
系列文章<C语言经典100例>持续创作中,欢迎大家的关注和支持. 喜欢的同学记得点赞.转发.收藏哦- 后续C语言经典100例将会以pdf和代码的形式发放到公众号 欢迎关注:计算广告生态 即 ...