Java 如何使用Feign发送HTTP请求
在往常的HTTP调用中,一直都是使用的官方提供的RestTemplate来进行远程调用,该调用方式将组装代码冗余到正常业务代码中,不够优雅,因此在接触到Feign后,考虑使其作为一个HTTP发送基础,来进行远程调用。
下面就让我们来看一下,其是如何使用的。
引入依赖
首先,我们需要将Feign的基础依赖引入项目,因为我们只使用Feign的remote功能,因此,只引入基础依赖。
此外在项目中,我们还自定义了了JSON转换和log设置,因此还需要引入这些的第三方依赖,如下所示。
io.github.openfeign feign-core 10.10.1 io.github.openfeign feign-gson 10.10.1 io.github.openfeign feign-slf4j 10.10.1
发送路径和方法设置
然后,因为Feign是一种申明式的调用,因此我们需要配置发送的接口路径和发送接口定义,看下面的例子。
@RequestLine("GET/user/getone?arkOrgId={arkOrgId}&userId={userId}")
JSONObjectgetOneStaff(@Param("arkOrgId")StringarkOrgId,@Param("userId")StringuserId);
@RequestLine("POST/user/add")
@Headers("Content-Type:application/json")
@Body("{body}")
JSONObjectsaveStaff(@Param("body")SaveEmployeeDTOsaveEmployeeDTO);
在代码实例中,我们定义了两种发送的实例,一种是GET请求,一种是POST请求,下面,我们分别来看一下其中的代码的作用是什么。
- @RequestLine:定义发送方式和发送接口定义,其中用GET和POST来定义发送方式,然后空格后,写上serveltpath(contextpath和域名或ip端口号在其他地方配置);
- {}:用来作为占位符,动态填充需要的参数;
- @Param:用来匹配URI中的占位符;
- @Headers("Content-Type:application/json"):构建请求表头,在POST请求中,需要声明该请求的发送格式为json;
- @Body:POST请求,需要标注请求体;
- JSONObject:在本实例中,采用是一个通用的json对象来接收,方便统一,在自己的代码中,也可以定义一个接受实体类来接受,作用是一样的。
POST请求,需要在实体中重写toString()方法,使其在发送时调用该方法后,是一个JSON字符串,详细见后文Tips中写的。
定义发送客户端
@Configuration
publicclassFeignConfig{
publicstaticfinalStringDATE_TIME_FORMAT="yyyy-MM-ddHH:mm:ss";
@Value("${staff.base.url}")
privateStringstaffBaseUrl;
@Bean
publicStaffFeignServicestaffFeignService(){
GsonBuilderbuilder=newGsonBuilder();
builder.setDateFormat(DATE_TIME_FORMAT);
returnFeign.builder()
.retryer(closeFeignRetry())
.decoder(newGsonDecoder(builder.create()))
.encoder(newGsonEncoder())
.logger(newSlf4jLogger())
.logLevel(Logger.Level.FULL)
.target(StaffFeignService.class,staffBaseUrl);
}
/**
*关闭feign的失败重试功能
*/
@Bean
publicRetryercloseFeignRetry(){
returnRetryer.NEVER_RETRY;
}
@Bean
publicRequest.Optionsoptions(){
returnnewRequest.Options(15000,30000);
}
}
紧接着,我们来定义发送客户端。
首先,我们采用@Value来动态添加路由,这样,就可以根据在配置文件中的属性来添加contextpath,从而做到可拓展。
然后,feign的很多配置都是可以根据自身项目需要在DIY的,因此在这里,我们配置了编解码采用GSON的编解码器,日志级别设置全打印。通过该设置来生成一个Feign客户端。
Feign官方文档,在官方文档中,有详细的配置说明,根据自身需要使用,即可。
使用
@Autowired StaffFeignServicestaffFeignService; //get请求 JSONObjectsaveSingleQrCode=staffFeignService.saveSingleQrCode(userId); //post请求 SaveMultiQrCodesDTOsaveMultiQrCodesDTO=newSaveMultiQrCodesDTO();; JSONObjectsaveMultiQrCodes=staffFeignService.saveMultiQrCodes(saveMultiQrCodesDTO);
通过该方式,即可发送对应请求。
Tips
记录一些在使用中的重点,需要注意。
重写toString()方法
在发送JSON时,需要重写toString()方法,否则会导致接受方,无法用json进行解析。
@Override
publicStringtoString(){
returnJSON.toJSONString(this);
}
异步客户端
有时候,我们使用异步发送,从而不影响我们的主体业务,Feign也支持该种配置。
@Bean
publicIHermesFeignServicehermesFeignService(){
GsonBuilderbuilder=newGsonBuilder();
builder.setDateFormat(DATE_TIME_FORMAT);
returnAsyncFeign.asyncBuilder()
.decoder(newGsonDecoder(builder.create()))
.encoder(newGsonEncoder(builder.create()))
.logger(newSlf4jLogger())
.logLevel(Logger.Level.FULL)
.target(IHermesFeignService.class,hermesBaseUrl);
}
重点,就是在构建Feign时,采用AsyncFeign.asyncBuilder()来进行构建。
以上就是Java如何使用Feign发送HTTP请求的详细内容,更多关于使用Feign发送HTTP请求的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。