轻量级声明式的Http库 Feign的独立使用
发布时间:2021-11-17 15:21 所属栏目:13 来源:互联网
导读:前沿 项目中我们经常会使用HTTP工具向外部的REST接口发送请求,大家一般使用Okhttp,或者java的HttpClient发起,今天给大家介绍一款轻量级声明式的Http库(FeignClient),使用起来会使我们的项目代码更整洁,利于维护! 快速开始 Feign是spring cloud中服务消
前沿 项目中我们经常会使用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 (编辑:ASP站长网) |
相关内容
网友评论
推荐文章
热点阅读