使用Feign调用api时传递请求头信息
使用Feign调用api时传递请求头信息

使用Feign调用api时传递请求头信息

Feign请求不会传递请求头

在服务之间互相调用的时候, 如果被调用方(微服务B或者第三方api)需要验证特殊请求头信息, 则需要服务调用方(微服务A)将请求头通过feign传递给被调用方.

例如: 通过网关进行服务调用时, 如果不传递请求头,将会是一次全新的http请求, 丢失所有请求头信息.
可以实现feign提供的RequestInterceptor接口来处理这种情况

##########################################################

为服务调用方的feignClient设置请求头

  • 指定要调用的目标url, 指定调用失败的回退处理逻辑, 并指定feign配置类
package cn.zack.feign;

import cn.zack.config.TestFeignConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "testFeign", url = "http://127.0.0.1:8081",fallback = TestFeignFallback.class, configuration = TestFeignConfig.class)
public interface TestFeign {
	@GetMapping(path = "/fun1")
	String getFun1();
}
  • fallback回退处理逻辑(或者通过fallbackFactory进行回退)
package cn.zack.feign;

import org.springframework.stereotype.Component;

@Component
public class TestFeignFallback implements TestFeign {

	@Override
	public String getFun1() {
		return "fail";
	}
}
  • 配置feign传递请求头信息
package cn.zack.config;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.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
/**实现RequestInterceptor接口来配置feign*/
public class TestFeignConfig implements RequestInterceptor {
	@Override
	public void apply(RequestTemplate requestTemplate) {
		ServletRequestAttributes attributes = (ServletRequestAttributes) 
		RequestContextHolder.getRequestAttributes();
		HttpServletRequest request = attributes.getRequest();
		// 传递此请求的全部请求头
		Enumeration<String> headerNames = request.getHeaderNames();
		while (headerNames.hasMoreElements()){
			String nextElement = headerNames.nextElement();
			requestTemplate.header(nextElement,request.getHeader(nextElement));
		}
	}
}