2013-12-10 51 views
3

我想爲web服務上的每個請求使用兩個攔截器。一個用於傳出通信,另一個用於響應。是否可以代理一個輸入的請求?

我正在使用ClientHttpRequestInterceptor這是工作的傳出。我設置它如下:

//Rest template 
RestTemplate tpl = api.getRestTemplate(); 
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>(); 
interceptors.add(new OutgoingRequestInterceptor()); 

tpl.setInterceptors(interceptors); 

但是,我想這樣的攔截器爲傳入(響應)。我檢查了Spring框架源代碼,我找不到任何東西。

任何提示?

編輯:

也許我很困惑或在我腦子裏有什麼錯。我今天有點不舒服。

我已經在我的攔截器類下面的代碼:

@Override 
public ClientHttpResponse intercept(HttpRequest request, byte[] bytes, ClientHttpRequestExecution requestExecution) throws IOException 
{ 
    SLog.d("intercepted!!"+request.getURI()+". Bytes: "+bytes); 
    try 
    { 
     Thread.sleep(5000); 
    } 
    catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 
    ClientHttpResponse response = requestExecution.execute(request, bytes); 

    SLog.d("Response Headers: " + response.getHeaders()); 


    return response; 
} 

問題:正在爲傳出,傳入,或兩者的代碼? 因爲日誌:request.getUri()正在返回目標網址。

然後,在Response對象上,我得到由WebService發送的標頭。

所以我確信,響應實際上是服務器的響應。但是...怎麼樣?它在實際發送請求之前觸發嗎?

回答

0

好的。經過一些棘手的調試後,我明白了。

儘管攔截器類被稱爲ClientHttpRequestInterceptor,但它攔截了兩者。來自客戶端的請求,並從服務器拒絕。

這個攔截器類就像一個包裝器。

enter image description here

所以......

  1. 這種方法是整體要求的包裝。從BEFORE請求到請求完成後。
  2. 這部分代碼在發送到webservice之前被觸發
  3. 這部分代碼實際上與WEBSERVICE聯繫,所以它在那裏「暫停」,直到它從Web服務獲得響應。
  4. 我們返回生成的響應。請注意,如果您使用的是InputStream的方法response.getBody(),則會消耗它,所以之後它將爲空。我說因爲你不能直接登錄。你必須先鏡像它。
相關問題