2016-11-29 72 views
0

我的Spring Boot應用程序將接收一個請求,其部分處理流程是將其他RESTful微服務的其他請求發送出去並按響應,然後再將其發送回請求者。帶入站請求頭的自動出站RestTemplate的HttpEntity

流程是這樣的:

Requester -> My Controller -> My Service -> Upstream Service 
      [ My Spring Boot Scope ] 

我用RestTemplate火關向上遊業務的請求。

該申請人發送包含一些標題,如AuthorizationCorrelationID,我需要抓住並複製到出站RestTemplate的要求,我想找個進行更有效的方式入站請求。

我在想什麼的是定義自動連接Request -scoped HttpEntity豆是RequestConfiguration類將讀取輸入標題和其注入HttpEntity豆-scoped。但我不知道如何閱讀Configuration類本身的請求標題。我不想在控制器層面這樣做,因爲這意味着每個執行控制器的團隊成員都需要這樣做。

這可能實現嗎?

回答

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; 
    } 
} 
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(); 
+0

嗯,我很中性使用的HttpClient或RestTemplate,然而我實際上需要的是一個地方要做到這一點,爲此,我想通過在請求範圍的注入做應用程序配置類。我們有相當數量的微服務,並希望避免告訴每個團隊成員自己實現這一點。謝謝。 – feicipet

+0

配置屬性中的API密鑰或憑據? –