网站首页> 后端开发> Java> Java 如何使用Feign发送HTTP请求

Java 如何使用Feign发送HTTP请求

时间:2020-11-23 16:17:06 阅读:957次 来源:互联网

在往常的 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}")
  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() 来进行构建。

以上就是Java 如何使用Feign发送HTTP请求的详细内容。

本文地址:https://www.manongw.com/article/328.html

文章来源:转载于博客园,转载网址为https://www.cnblogs.com/JRookie/p/14023522.html?utm_source=tuicool&utm_medium=referral

版权申明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 ezhongheng@126.com 举报,一经查实,本站将立刻删除。

相关文章
  • 本文主要介绍了IDEA创建Servlet并配置web.xml的实现的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...
    2020-10-23 10:52
  • 本文主要介绍了Java Servlet请求重定向的方法的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...
    2020-11-10 16:09
  • 本文主要介绍了史上最通俗理解的Java死锁代码演示的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...
    2020-10-19 22:27
  • 本文主要介绍了关于Java8中map()和flatMap()的一些事的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...
    2020-10-25 16:12
  • 本文主要介绍了springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...
    2020-10-26 18:52
  • 本文主要介绍了Spring如何基于aop实现操作日志功能的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...
    2020-11-10 10:29
  • 本文主要介绍了Java Servlet 运行原理分析的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...
    2020-11-10 16:31
  • 本文主要介绍了Kafka单节点伪分布式集群搭建实现过程详解的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...
    2020-11-12 12:08
  • 本文主要介绍了Spring Cloud Alibaba 之 Nacos教程详解的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...
    2020-11-06 19:59
  • 本文主要介绍了基于springboot实现文件上传的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...
    2020-11-09 09:24