如何和将原始request的Header中的值传递给openfeign请求的Header? 以及又如何获取openfeign请求中Header中的值
- 如何和将原始request的Header中的值传递给openfeign请求的Header
- 参考 [https://www.jb51.net/article/282522.htm](https://www.jb51.net/article/282522.htm)
- 借助 @RequestHeader注解
- 通过实现 RequestInterceptor 接口
- 示例(实现RequestInterceptor )
- 如何获取openfeign请求中Header中的值
如何和将原始request的Header中的值传递给openfeign请求的Header
参考 https://www.jb51.net/article/282522.htm
借助 @RequestHeader注解
通过实现 RequestInterceptor 接口
示例(实现RequestInterceptor )
主要代码:
import javax.servlet.http.HttpServletRequest;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import feign.RequestInterceptor;
import feign.RequestTemplate;
import io.micrometer.core.instrument.util.StringUtils;
import io.seata.core.context.RootContext;@Configuration
public class ComonConfig {@Beanpublic RequestInterceptor requestInterceptor() {return new RequestInterceptor() {@Overridepublic void apply(RequestTemplate requestTemplate) {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest(); // 老 request// 从Seata获取XID,并将其添加到Feign请求header中String xid = RootContext.getXID();if (xid != null) {requestTemplate.header("TX_XID", xid);}requestTemplate.header("Cookie", request.getHeader("Cookie")); // 新requestrequestTemplate.header("Platform", request.getHeader("Platform")); String pageSizeDefault = "20";String pageNumDefalut = "1";String pageSize = request.getParameter("pageSize");String pageNum = request.getParameter("pageNum");if (StringUtils.isNotEmpty(pageSize)) {pageSizeDefault = pageSize;}if (StringUtils.isNotEmpty(pageNum)) {pageNumDefalut = pageNum;}requestTemplate.header("pageSize", pageSizeDefault);requestTemplate.header("pageNum", pageNumDefalut);
// requestTemplate.header("Accept", "application/json;charset=UTF-8");
// requestTemplate.header("Content-Type", "application/json;charset=UTF-8");}};}
}
以上解释: 首先,这是一个拦截器用于拦截openfeign的请求;然后,在apply方法中通过Spring包装的请求获取原始请求,并从请求中获取到Header,如名称为‘Platform’的Header,如下:
ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
request.getHeader("Platform");
最后,将取出来的Header的值,设置到openfeign请求RequestTemplate 的Header中去如下:
requestTemplate.header("Platform", request.getHeader("Platform"))
设置好了,那如何取出来openfeign请求中的Header中的值?,如下
如何获取openfeign请求中Header中的值
还是使用Spring管理的request来取!有两种方式
- 直接通过RequestContextHolder来获取
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();request.getHeader("Platform");
- 注入方式
import javax.servlet.http.HttpServletRequest;@Autowiredprivate HttpServletRequest request;// 直接使用request.getHeader("Platform");即可