Spring Cloud Feign实现自定义复杂对象传参

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Feign实现自定义复杂对象传参相关的知识,希望对你有一定的参考价值。

参考技术A

现我们服务提供端有如下的根据用户查询条件获取满足条件的用户列表controller接口

我们在使用Feign构建远程服务请求客户端的时候,会发现Feign官方版本是不支持GET请求传递自定义的对象,当我们的请求参数很多的时候,我们只能选择以下两种方式:

那么我们希望能有一种方式 保持跟controller完全一致只需要传递自定义的对象 ,既让服务提供端开发人员爽,也让服务消费端开发人员爽,两全其美。既然Feign官方不支持,那我们就自己动手撸源码,自己来实现。

对比之前的@RequestParam和Map用法,方法参数变少了,User对象复用了,对服务提供端和消费端都更方便了

最近在调研spring cloud版本升级,发现新版的Feign也支持了自定义对象传参,实现方式大同小异

Spring Cloud Alibaba - 15 微服务之间使用Feign实现参数的透传

文章目录


业务场景

服务A 获取到Token值后,要传递给 服务B进行校验 。

在微服务架构下如何实现呢?

实现

自定义拦截器

artisan-feign-api 子模块 增加 拦截器


import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2022/2/4 0:52
 * @mark: show me the code , change the world
 */


public class ArtisanRequestInterceptor implements RequestInterceptor 

    @Override
    public void apply(RequestTemplate requestTemplate) 
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        requestTemplate.header("token", request.getHeader("token"));
    

    

然后实例化


暴漏接口

因为是从header中获取参数 ,所以

@RequestHeader("token") String token

服务实现

服务提供者 artisan-cloud-feign-product


服务调用者

artisan-cloud-feign-order 写个测试接口,测测吧

验证


观察下OORDER的日志

源码

https://github.com/yangshangwei/SpringCloudAlibabMaster

以上是关于Spring Cloud Feign实现自定义复杂对象传参的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Alibaba全家桶——微服务调用组件Feign

如何使用 Spring Cloud Netflix Feign 设置自定义 Jackson ObjectMapper

Spring Cloud Alibaba - 14 OpenFeign自定义配置 + 调用优化 + 超时时间

如何设置自定义 Feign 客户端连接超时?

spring cloud 服务A调用服务B自定义token消失,记录

Spring Cloud Feign 请求添加headers