Feign 系列(01)最简使用姿态

Posted binarylei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Feign 系列(01)最简使用姿态相关的知识,希望对你有一定的参考价值。

Feign 系列(01)最简使用姿态

Spring Cloud 系列目录(https://www.cnblogs.com/binarylei/p/11563952.html#feign)

更多使用案例见 Feign Github 官网

1. 引入 maven 依赖

<dependencies>
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-core</artifactId>
        <version>10.4.0</version>
    </dependency>
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-gson</artifactId>
        <version>10.4.0</version>
    </dependency>
</dependencies>

2. 基本用法

interface GitHub 
  @RequestLine("GET /repos/owner/repo/contributors")
  List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo);

  @RequestLine("POST /repos/owner/repo/issues")
  void createIssue(Issue issue, @Param("owner") String owner, @Param("repo") String repo);



public static class Contributor 
  String login;
  int contributions;


public static class Issue 
  String title;
  String body;
  List<String> assignees;
  int milestone;
  List<String> labels;


public class MyApp 
  public static void main(String... args) 
    GitHub github = Feign.builder()
                         .decoder(new GsonDecoder())
                         .target(GitHub.class, "https://api.github.com");
  
    // Fetch and print a list of the contributors to this library.
    List<Contributor> contributors = github.contributors("OpenFeign", "feign");
    for (Contributor contributor : contributors) 
      System.out.println(contributor.login + " (" + contributor.contributions + ")");
    
  

总结: Feign.target() 实际上是创建了一个 GitHub 的动态代理。

3. Feign 声明式注解

Feign 通过 Contract 接口将方法上标注的注解解析成 MethodMetadata,最终将参数解析成 Http 请求的请求行、请求行、请求体,然后使用 HttpClient 发送请求。

Annotation Interface Target Usage
@RequestLine Method 定义HttpMethod 和 UriTemplate. UriTemplate 中使用 包裹的表达式,可以通过在方法参数上使用@Param 自动注入
@Param Parameter 定义模板变量,模板变量的值可以使用名称的方式使用模板注入解析
@Headers Method, Type 定义头部模板变量,使用@Param 注解提供参数值的注入。如果该注解添加在接口类上,则所有的请求都会携带对应的Header信息;如果在方法上,则只会添加到对应的方法请求上
@QueryMap Parameter 定义一个Map或 POJO,参数值将会被转换成URL上的 query 字符串上
@HeaderMap Parameter Map ->Http Headers
@Body Method Defines a Template, similar to a UriTemplate and HeaderTemplate, that uses @Param annotated values to resolve the corresponding Expressions.

注解的基本使用方法如下:

public interface FeignService 
  // @Headers
  @RequestLine("GET /api/documents/contentType")
  @Headers("Accept: contentType")
  String getDocumentByType(@Param("contentType") String type);
  
  // @QueryMap: Map or POJO
  @RequestLine("GET /find")
  V find(@QueryMap Map<String, Object> queryMap);
  @RequestLine("GET /find")
  V find(@QueryMap CustomPojo customPojo);
  
  // @HeaderMap: Map
  @RequestLine("POST /")
  void post(@HeaderMap Map<String, Object> headerMap);
    
  // @Body
  @RequestLine("POST /")
  @Headers("Content-Type: application/xml")
  @Body("<login \\"user_name\\"=\\"user_name\\" \\"password\\"=\\"password\\"/>")
  void xml(@Param("user_name") String user, @Param("password") String password);

  @RequestLine("POST /")
  @Headers("Content-Type: application/json")
  @Body("%7B\\"user_name\\": \\"user_name\\", \\"password\\": \\"password\\"%7D")
  void json(@Param("user_name") String user, @Param("password") String password);

每天用心记录一点点。内容也许不重要,但习惯很重要!

以上是关于Feign 系列(01)最简使用姿态的主要内容,如果未能解决你的问题,请参考以下文章

Eureka 系列(02)客户端源码分析

SpringCloud系列六:Feign接口转换调用服务(Feign 基本使用Feign 相关配置)

SpringCloud系列研究---Eureka服务消费Feign

Spring Cloud Alibaba系列使用feign进行服务调用

Spring Cloud Alibaba系列使用feign进行服务调用

我爱java系列---微服务中feign拦截器的使用