我的Spring Boot应用程序将接收请求,其部分处理流程是将其他请求发送到其他RESTful微服务并按下响应,然后再将其发送回请求者。
流程如下:
Requester -> My Controller -> My Service -> Upstream Service
[ My Spring Boot Scope ]
我使用RestTemplate
来启动对上游服务的请求。
请求者发送的入站请求将包含一些标头,例如Authorization
和CorrelationID
,我需要抓取并复制到出站RestTemplate
请求中,我希望找到一种更有效的表现方式。
我正在考虑的是定义一个自动装配的Request
- 作用域HttpEntity
bean Request
- 作用于我的Configuration
类,它将读取传入的标题并将其注入HttpEntity
bean。但我无法弄清楚如何阅读Configuration
类本身的请求标头。我不想在控制器级别这样做,因为这意味着实现控制器的每个团队成员都需要这样做。
这可能实现吗?
答案 0 :(得分:0)
对于您的场景,最好使用Apache Http客户端,从您可以插入到apache http客户端的入站参数(授权等)。
post.setHeader("Host", "accounts.google.com");
post.setHeader("User-Agent", USER_AGENT);
post.setHeader("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
post.setHeader("Accept-Language", "en-US,en;q=0.5");
post.setHeader("Cookie", getCookies());
post.setHeader("Connection", "keep-alive");
post.setHeader("Referer", "https://accounts.google.com/ServiceLoginAuth");
post.setHeader("Content-Type", "application/x-www-form-urlencoded");
post.setEntity(new UrlEncodedFormEntity(postParams));
HttpResponse response = client.execute(post);
int responseCode = response.getStatusLine().getStatusCode();
答案 1 :(得分:0)
我已设法通过以下代码完成此操作。关键是必须将Scope设置为使用配置的ScopedProxyMode进行请求。
@Configuration
public class ApplicationConfig {
private static final List<String> ALLOW_HEADER_LIST = Arrays.asList("correlationid", "userid", "accept-language", "loginid", "channelid");
@Bean
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public HttpHeaders httpHeaders() {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpServletRequest curRequest = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
Enumeration<String> headerNames = curRequest.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String header = headerNames.nextElement();
String value = curRequest.getHeader(header);
if (ALLOW_HEADER_LIST.contains(header.toLowerCase())) {
log.info("Adding header {} with value {}", header, value);
httpHeaders.add(header, value);
} else log.debug("Header {} with value {} is not required to be copied", header, value);
}
}
return httpHeaders;
}
}