轻量级声明式的Http库——Feign的独立使用
前沿
项目中我们经常会使用http工具向外部的rest接口发送请求,大家一般使用okhttp,或者java的httpclient发起,今天给大家介绍一款轻量级声明式的http库(feignclient),使用起来会使我们的项目代码更整洁,利于维护!
快速开始
feign是spring cloud中服务消费端的调用框架,通常与ribbon,hystrix等组合使用。 但是在某些项目中,由于遗留原因,整个系统并不是spring cloud项目,甚至不是spring项目,而使用者关注的重点仅仅是简化http调用代码的编写。 如果采用httpclient或者okhttp这样相对较重的框架,对初学者来说编码量与学习曲线都会是一个挑战,而使用spring中resttemplate,又没有配置化的解决方案,由此想到是否可以脱离spring cloud,独立使用feign。
引入依赖
<dependency> <groupid>com.netflix.feign</groupid> <artifactid>feign-core</artifactid> <version>8.18.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.netflix.feign/feign-gson --> <dependency> <groupid>com.netflix.feign</groupid> <artifactid>feign-gson</artifactid> <version>8.18.0</version> </dependency>
定义接口
public interface outerservice { @requestline("get /requesr/list?name={name}") @headers("authorization: basic {token}") string request(@param(value = "name") string name,@param(value = "token") string token); }
通过@requestline指定http请求方式及url地址,@param指定参数,可以在url或者header中使用{参数名}去填充请求参数。
配置类
outerservice service = feign.builder() .options(new options(1000, 3500)) .retryer(new retryer.default(5000, 5000, 3)) .target(outerservice.class, http://127.0.0.1:8085);
开始调用
service.request("test","ad12hj3bhj1b23hj1b2");
json序列化
在项目中,我们发起的http请求往往都是json格式,feign同样提供基于json的对象转换工具,方便我们直接以对象形式交互。
接口层面指定header:
@headers({"content-type: application/json","accept: application/json"})
指定encoder跟decoder
## 指定gson序列化。也可以使用jackson序列化(引入其依赖) outerservice service = feign.builder() .encoder(new gsonencoder()) .decoder(new gsondecoder()) .options(new options(1000, 3500)) .retryer(new retryer.default(5000, 5000, 3)) .target(outerservice.class, http://127.0.0.1:8085);
支持我们完成声明式http接口调用
使用拦截器
在配置代理类时可以自定义拦截器
outerservice service = feign.builder() .encoder(new gsonencoder()) .decoder(new gsondecoder()) .requestinterceptor(template -> { // template 可以获取/修改body,header等信息 }) .options(new options(1000, 3500)) .retryer(new retryer.default(5000, 5000, 3)) .target(outerservice.class, http://127.0.0.1:8085);
注解详解
@requestline("get /messages/detail")
指定请求方式跟请求url
## get请求 @requestline("get /messages/detail?msg_ids={msgids}") ## post请求 @requestline("post /messages/detail?msg_ids={msgids}")
@param("name")
绑定参数别名,可以在requestline/body/headers等注解中通过{参数名}去获取值。
@headers({"accept:/", "accept-language: zh-cn"})
指定请求header
@body("{name}")
指定请求返回body值为请求参数name
@querymap
只能标注在方法参数上。用于传递多个查询值,拼接在url后面,只能标注在map类型的参数前面,否则报错。
@headermap
同上,只是用在header上而已
以上就是轻量级声明式的http库——feign的使用的详细内容,更多关于feign的使用的资料请关注其它相关文章!
下一篇: 李荣浩:我太难了!