微服务如何通过feign.RequestInterceptor传递参数

网友投稿 530 2022-08-23


微服务如何通过feign.RequestInterceptor传递参数

目录微服务通过feign.RequestInterceptor传递参数创建自定义请求拦截器具体获取逻辑如下feign的拦截器RequestInterceptor首先创建自定义的RequestInterceptor然后定义一个feign的接口类再创建一个controller运行程序测试一下接口查看程序打印

微服务通过feign.RequestInterceptor传递参数

Feign 支持请求拦截器,在发送请求前,可以对发送的模板进行操作,例如设置请求头等属性,自定请求拦截器需要实现 feign.RequestInterceptor 接口,该接口的方法 apply 有参数 template ,该参数类型为 RequestTemplate,我们可以根据实际情况对请求信息进行调整,示例如下:

创建自定义请求拦截器

在发送请求前增加了一个请求头信息,进行身份校验。

import feign.RequestInterceptoQjKVNPMr;

import feign.RequestTemplate;

public class MyRequestInterceptor implements RequestInterceptor{

public void apply(RequestTemplatetemplate){

template.header("Authorization","123");

}

}

服务端可以通过HttpServletRequest获取到前面传递的参数

具体获取逻辑如下

RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();

if (requestAttributes != null) {

HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();

request.getHeader("Authorization");

}

feign的拦截器RequestInterceptor

SpringCloud的微服务使用Feign进行服务间调用的时候可以使用RequestInterceptor统一拦截请求来完成设置header等相关请求,但RequestInterceptor和ClientHttpRequestInterceptor有点不同,它拿不到原本的请求,所以要通过其他方法来获取原本的请求

首先创建自定义的RequestInterceptor

这里通过RequestContextHolder获取到当前的request

@Slf4j

@Component

public class MyFeignInterceptor implements RequestInterceptor {

@Override

public void apply(RequestTemplate template) {

ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();

log.info("===request: {}", template.url());

template.header("aaaa", "bbbb");

}

}

然后定义一个feign的接口类

@FeignClient(name = "SPRING-CLOUD-CLIENT-DEMO")

public interface ClientFeign {

@GetMapping("/demo/get")

String weight(@RequestParam String param);

}

再创建一个controller

@Slf4j

@RestController

@RequestMapping("/interceptor")

public class InterceptorController {

@Autowired

private ClientFeign clientFeign;

@GetMapping("/feign")

public String feign(@RequestParam String param) {

return clientFeign.weight(param);

}

}

运行程序测试一下接口

查看程序打印

可以看到进入了我们自定义的RequestInterceptor

INFO 25936 --- [ctor-http-nio-3] c.m.d.g.interceptor.MyFeignInterceptor   : ===request: /demo/weight?param=a

再查看feign调用的程序日志,可以看到设置的header信息

INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : aaaa: a  INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : websession: ECF4D97D02EEAFDDA3C15A7F1F050F61  INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : header: aaaa, bbbb  INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : header: accept, */*  INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : header: user-agent, java/1.8.0_191  INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : header: host, 39.108.15.147:8801  INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : header: connection, keep-alive


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python数据类型及常用方法(python中常见的数据类型)
下一篇:Pytest学习-yaml+parametrize接口实战(pytest yaml参数化)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~