OpenFeign调用微服务使用RequestInterceptor或@RequestHeader传递http请求头信息

这篇具有很好参考价值的文章主要介绍了OpenFeign调用微服务使用RequestInterceptor或@RequestHeader传递http请求头信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记录:391

场景:基于Spring Cloud OpenFeign调用微服务Restful接口时,请求头从A服务传递到B服务,可以使用RequestInterceptor接口或者@RequestHeader注解传递请求头信息。

版本:JDK 1.8,SpringBoot 2.6.3,springCloud 2021.0.1

1.使用RequestInterceptor传递请求头信息

1.1关于RequestInterceptor

RequestInterceptor是一个接口,全路径:feign.RequestInterceptor。

RequestInterceptor本质上就是一个拦截器,拦截时机是在OpenFeign调用Restful接口前拦截,因此可以设置请求信息。

使用RequestInterceptor,需实现它的apply(RequestTemplate var1)。换句话说,就是在apply方法中向RequestTemplate对象中注入请求头,

1.2实现RequestInterceptor接口

(1)代码

@Slf4j
@Configuration
public class FeignConfiguration implements RequestInterceptor {
  @Override
  public void apply(RequestTemplate requestTemplate) {
    // 1.从前端过来的请求头取信息
    RequestAttributes reqAttributes = RequestContextHolder.currentRequestAttributes();
    HttpServletRequest request = ((ServletRequestAttributes) reqAttributes).getRequest();
    String cityCode = request.getHeader("cityCode");
    requestTemplate.header("cityCode", cityCode);
    // 2.设置自定义请求头信息
    requestTemplate.header("cityNo", "0571");
  }
}

(2)解析

feign.RequestTemplate,feign的请求模板类,包括请求相关信息。

org.springframework.web.context.request.RequestContextHolder,取请求头工具类。

org.springframework.web.context.request.RequestAttributes,包含请求属性信息,是接口,需转换为实现类:org.springframework.web.context.request.ServletRequestAttributes。再取值。

1.3在OpenFeign接口应用RequestInterceptor

在OpenFeign接口应用RequestInterceptor,也就是引入RequestInterceptor接口实现类FeignConfiguration。

(1)代码

@FeignClient(contextId = "cityFeignService",
        value = "hub-example-301-nacos",
        fallbackFactory = CityFeignServiceFallbackFactory.class,
        configuration = {FeignConfiguration.class})
public interface CityFeignService {
    @PostMapping("/hub-301-nacos/hub/example/city/queryCityByCityId")
    ResultObj<CityDTO> queryCityByCityId(String cityId);
}

(2)解析

@FeignClient,feign客户端标识注解。

contextId,指定接口唯一标识。

fallbackFactory,指定接口回调函数。

configuration = {FeignConfiguration.class},就是执行feign接口调用时的配置信息,本例就是拦截请求头并设置请求头信息。

value = "hub-example-301-nacos",提供Restful接口的微服务名称,必须已经注册,本例使用Nacos注册。

1.4微服提供的Restful接口

(1)代码

@RestController
@RequestMapping("/hub/example/city")
@RefreshScope
@Slf4j
public class CityController {
    @Autowired
    private HttpServletRequest request;
    @PostMapping("/queryCityByCityId")
    public ResultObj<CityDTO> queryCityByCityId(String cityId) {
        log.info("cityCode = " + request.getHeader("cityCode"));
        log.info("cityNo = " + request.getHeader("cityNo"));
        CityDTO cityDTO = new CityDTO();
        cityDTO.setCityId(cityId != null ? Long.parseLong(cityId) : 1L);
        cityDTO.setCityName("杭州");
        cityDTO.setUpdateTime(new Date());
        return ResultObj.data(200, cityDTO, "执行成功");
    }
}

(2)解析

微服务提供的Restful接口和普通接口一致,无需改动。

注入javax.servlet.http.HttpServletRequest,是为了取出请求头信息做验证。

2.使用@RequestHeader传递请求头信息

2.1关于@RequestHeader

注解RequestHeader全路径:org.springframework.web.bind.annotation.RequestHeader。

注解RequestHeader,由Spring框架做拦截和配置。

2.2在OpenFeign接口应用@RequestHeader

在OpenFeign接口应用@RequestHeader,是把注解作用在OpenFeign接口方法参数上。

(1)代码

@FeignClient(contextId = "cityFeignService",
        value = "hub-example-301-nacos",
        fallbackFactory = CityFeignServiceFallbackFactory.class,
        configuration = {FeignConfiguration.class})
public interface CityFeignService {
    @PostMapping("/hub-301-nacos/hub/example/city/queryCityByCityName")
    ResultObj<CityDTO> queryCityByCityName(@RequestParam("cityName") String cityName, 
                                      @RequestHeader MultiValueMap<String, String> headers);
}

(2)解析

@RequestHeader,在方法上加上@RequestHead标记此参数是请求头信息。

MultiValueMap<String, String> headers,请求头传入的数据类型。

(3)注意

当使用@RequestHeader注解时,OpenFeign方法的其它参数必须使用@RequestParam指定参数名称,否则微服务会接收不到值。

@RequestParam("cityName") String cityName,双引号中的cityName必须和要被调用的Restful接口形参名称一致。

2.3调用OpenFeign接口

使用@RequestHeader传递参数时,需在调用OpenFeign接口前置手动组装参数MultiValueMap类型参数。

(1)代码

@Service
public class CityServiceImpl implements CityService {
  @Autowired
  private CityFeignService cityFeignService;
  @Override
  public ResultObj<CityDTO> queryCityByCityName(String cityName) {
    // 传入请求头
    MultiValueMap<String, String> headers = new HttpHeaders();
    headers.add("cityNo", "0571");
    return cityFeignService.queryCityByCityName(cityName, headers);
  }
}

(2)解析

一般是在Service服务层注入OpenFeign接口,在调用接口方法前先组装参数。

2.4微服提供的Restful接口

(1)代码

@RestController
@RequestMapping("/hub/example/city")
@RefreshScope
@Slf4j
public class CityController {
  @Autowired
  private HttpServletRequest request;
  @PostMapping("/queryCityByCityName")
  public ResultObj<CityDTO> queryCityByCityName(String cityName) {
    log.info("cityNo = " + request.getHeader("cityNo"));
    log.info("cityName = " + cityName);
    CityDTO cityDTO = new CityDTO();
    cityDTO.setCityId(1L);
    cityDTO.setCityName(cityName);
    cityDTO.setUpdateTime(new Date());
    log.info("cityDTO: " + cityDTO.toString());
    return ResultObj.data(200, cityDTO, "执行成功");
  }
}

(2)解析

微服务提供的Restful接口和普通接口一致,无需改动。

注入javax.servlet.http.HttpServletRequest,是为了取出请求头信息做验证。

3.几个类

类全路径:

java.util.Map。
org.springframework.util.MultiValueMap。
org.springframework.http.HttpHeaders。

继承关系:

public interface Map<K,V>。
public interface MultiValueMap<K, V> extends Map<K, List<V>>。
public class HttpHeaders implements MultiValueMap<String, String>, Serializable。

以上,感谢。

2023年3月24日文章来源地址https://www.toymoban.com/news/detail-628651.html

到了这里,关于OpenFeign调用微服务使用RequestInterceptor或@RequestHeader传递http请求头信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud微服务之间如何进行用户信息传递(涉及:Gateway、OpenFeign组件)

    在业务微服务中通过工具类获取当前用户信息 网关微服务(Gateway)往业务微服务传递用户信息 业务微服务之间通过OpenFeign传递用户信息 只要把上面两处打通,然后业务微服务在通过拦截器获取到用户信息,之后再将用户信息存在ThreadLocal中,这样我们就可以实现在业务微服

    2024年02月13日
    浏览(39)
  • @RequestHeader使用

      请求头参数的设置 在Postman的 Headers 中添加请求头参数,不过貌似不能加中文

    2024年02月13日
    浏览(21)
  • 远程调用(OpenFeign)

           何为远程调用?例如:单体服务时,A模块的功能涉及到引用B模块的功能,那我们需要在A模块中注入B模块的相关服务类并调用其方法;那么同样的逻辑在微服务体系下,就会变成了A服务的功能需要调用B服务的功能,这就形成了服务间调用,也称为远程调用。      

    2024年01月15日
    浏览(26)
  • OpenFeign远程调用

    先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: •代码可读性差,编程体验不统一 •参数复杂URL难以维护 Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign 其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。 F

    2024年01月24日
    浏览(27)
  • day07-OpenFeign-服务调用

    https://github.com/spring-cloud/spring-cloud-openfeign OpenFeign是一个声明式WebService客户端,使用OpenFeign让编写Web Service客户端更加简单 它的使用方法是定义一个服务端口然后在上面添加注解 OpenFeign也支持可插拔式的编码器和解码器 SpringCloud对OpenFeign进行了封装使其支持SpringMVC标准注解和

    2023年04月11日
    浏览(27)
  • 微服务远程调用openFeign整合

    ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 微服务探索之旅 ✨特色专栏: MySQL学习 🥭本文内容:微服务远程调用openFeign整合 🖥️个人小站 :个人博客,欢迎大家访问 📚个人知识库:

    2024年02月09日
    浏览(29)
  • 声明式调用 —— SpringCloud OpenFeign

    Spring Cloud Feign 是一个 HTTP 请求调用的轻量级框架,可以以 Java 接口注解的方式调用 HTTP 请求,而不用通过封装 HTTP 请求报文的方式直接调用 Feign 通过处理注解,将请求模板化,当实际调用的时候传入参数,根据参数再应用到请求上,进而转化成真正的请求 本小节介绍如何通

    2024年02月08日
    浏览(41)
  • 微服务之OpenFeign服务接口调用

    OpenFeign客户端是一个web声明式http远程调用工具,直接可以根据服务名称去注册中心拿到指定的服务IP集合,提供了接口和注解方式进行调用,内嵌集成了Ribbon本地负载均衡器。 Feign是一个 声明性web服务客户端 。它使编写web服务客户端变得更容易。 使用Feign创建一个接口并对

    2024年04月16日
    浏览(27)
  • python:使用RESTful API(flask)调用python程序传递参数,实现Web端调用python程序

    现有一个用python写的程序(或者是一个或几个的函数接口),需要在Web前端调用python写的函数。如果直接用前端java来调用会很不方便,而且会出现各种麻烦的问题,下面给出如何在web前端调用python的接口。 使用python的RESTful API库将python写的函数封装为Web端可调用的接口,在

    2024年01月20日
    浏览(32)
  • SpringCloud入门(微服务调用 OpenFeign)——从RestTemplate到OpenFeign & OpenFeign的相关配置 & 源码的分析和请求流程拆解

    在之前的博客中,我们介绍了RestTemplate的使用,博客文章如下连接。但是在使用RestTemplate的时候,需要把生产者的路径拼出来,非常繁琐,另外参数的传递的也比较繁琐,解决方案就是使用openFeign。 SpringCloud入门(RestTemplate + Ribbon)——微服务调用的方式 RestTemplate的使用 使

    2024年04月11日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包