如何在Java中使用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 请求,下面,我们分别来看一下其中的代码的作用是什么。
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() 来进行构建。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。