2013-12-10 16 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(),则会消耗它,所以之后它将为空。我说因为你不能直接登录。你必须先镜像它。
相关问题