轻量级声明式的Http库——Feign的独立使用

作者:coding途中 时间:2022-06-05 04:36:19 

目录
  • 前沿

  • 快速开始

    • 引入依赖

    • 定义接口

    • 配置类

    • 开始调用

  • json序列化

    • 接口层面指定header:

    • 指定Encoder跟Decoder

  • 使用 *

    • 注解详解

      • @RequestLine("GET /messages/detail")

      • @Param("name")

      • @Headers({"Accept:/", "Accept-Language: zh-cn"})

      • @Body("{name}")

      • @QueryMap

      • @HeaderMap

    前沿

    项目中我们经常会使用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

    同上,只是用在Header上而已

    来源:https://www.cnblogs.com/1ssqq1lxr/p/14713083.html

    标签:Feign,http,库
    0
    投稿

    猜你喜欢

  • C#获取真实IP地址实现方法

    2022-01-05 11:35:49
  • Java JDBC连接数据库常见操作总结

    2021-12-01 23:01:40
  • 详解Java如何判断ResultSet结果集是否为空

    2023-08-22 10:51:14
  • Android应用内悬浮窗Activity的简单实现

    2023-07-28 04:03:00
  • Java overload和override的区别分析

    2023-10-12 15:16:17
  • SpringBoot使用Kaptcha实现验证码的生成与验证功能

    2022-11-30 15:57:44
  • 解析Java内存分配和回收策略以及MinorGC、MajorGC、FullGC

    2023-02-06 08:22:19
  • SpringBoot瘦身打包部署的实现

    2021-09-09 16:54:21
  • java获取注册ip实例

    2023-11-03 23:01:12
  • Spring利用@Validated注解实现参数校验详解

    2023-08-26 12:06:26
  • SpringBoot整合screw实现数据库文档自动生成的示例代码

    2023-11-29 05:30:15
  • maven依赖版本没有按照最短路径原则生效的解决方案

    2023-04-04 20:49:09
  • 在Java中判断两个Long对象是否相等

    2022-09-01 11:22:10
  • 基于Java汇总Spock框架Mock静态资源经验

    2023-11-25 04:42:29
  • Android上传文件到服务端并显示进度条

    2023-06-23 07:48:33
  • 简单记事本java源码实例

    2023-11-26 02:03:17
  • 利用Distinct()内置方法对List集合的去重问题详解

    2023-01-31 00:45:30
  • JAVA8 Stream流中的reduce()方法详解

    2023-09-01 21:10:33
  • Java数据结构专题解析之栈和队列的实现

    2022-11-20 01:24:21
  • java的泛型你真的了解吗

    2022-07-25 09:40:06
  • asp之家 软件编程 m.aspxhome.com