zoukankan      html  css  js  c++  java
  • 【SpringBoot】通过Feign调用传递Header中参数

    如何通过Feign传递Header参数

    问题描述

    我们在SpringCloud中使用Feign请求另一个服务的Api接口时,有将Header中参数传递下去的需求,如果不做特殊处理,就会将Header中的参数丢失。

    解决方案

    方案一:通过 @RequestHeader(name = "headerName") 来传递

    例如:Feign定义如下

    @FeignClient(name = "service-name")
    public interface XXXFeignClient {
        @RequestMapping(value = "/user/getUserTicket", method = RequestMethod.GET)
        String getUserTicket(@RequestParam("id") String id);
    }

    假设在服务service-name中的/user/getUserTicket接口需要从Header中取Referer数据,那么我们可以将上面代码进行改造:

    @FeignClient(name = "service-name")
    public interface XXXFeignClient {
        @RequestMapping(value = "/user/getUserTicket", method = RequestMethod.GET)
        String getUserTicket(@RequestParam("id") String id, @RequestHeader(name = "Referer") String referer);
    }

    然后在调用的时候将referer参数传递进去即可,如

        public String getTicketById(@RequestParam("id") String id, HttpServletRequest request) {
            String referer = request.getHeader("Referer");
            return xxxFeignClient.getUserTicket(id, referer);
    }

    方案二:通过实现 RequestInterceptor 接口

     首先,自定义实现RequestInterceptor接口的apply方法,如下

    import org.springframework.stereotype.Configuration;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    import javax.servlet.http.HttpServletRequest;
    import java.util.Enumeration;
    @Configuration
    public class FeignConfiguration implements RequestInterceptor {
        @Override
        public void apply(RequestTemplate requestTemplate) {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                    .getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            Enumeration<String> headerNames = request.getHeaderNames();
            if (headerNames != null) {
                while (headerNames.hasMoreElements()) {
                    String name = headerNames.nextElement();
                    String values = request.getHeader(name);
                    requestTemplate.header(name, values);
                }
            }
        }
    }

     然后将自定义的配置类配置到Feign中,就可以实现该Feign中接口Header参数的传递

        @FeignClient(value = "service-name" ,configuration = FeignConfiguration.class)
        public interface XXXFeignClient {
        }
    ____________________________特此,勉励____________________________
    本文作者cheng2839
    本文链接https://www.cnblogs.com/cheng2839
    关于博主:评论和私信会在第一时间回复。
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    Linux文档目录结构
    Git
    Scrapy爬虫框架(架构图与解析)
    爬虫(总目录)
    Django模型(Meta Optins)
    Django模型(字段关系)
    Django模型(模型类)
    Django模型(索引)
    Django模型(字段选项)
    Django模型(字段类型)
  • 原文地址:https://www.cnblogs.com/cheng2839/p/14715057.html
Copyright © 2011-2022 走看看