欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-16 09:58:50
前沿项目中我们经常会使用http工具向外部的rest接口发送请求,大家一般使用okhttp,或者java的httpclient发起,今天给大家介绍一款轻量级声明式的http库(feignclient)...

前沿

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

以上就是轻量级声明式的http库——feign的使用的详细内容,更多关于feign的使用的资料请关注其它相关文章!

相关标签: Feign http