2015-02-07 3 views
1

Я пытаюсь зарегистрировать все исходящие запросы Http в моем веб-приложении, основанном на весне. Есть ли перехватчик для этой цели? Я хочу зарегистрировать все исходящие содержимое и заголовки, прежде чем он покинет приложение. Я использую spring-ws для отправки запросов SOAP. Поэтому в основном я хочу регистрировать не только запрос SOAP xml (как упоминается здесь How can I make Spring WebServices log all SOAP requests?), но и HTTP-запрос в целом.Spring: протоколирование исходящих HTTP-запросов

+1

Считаете ли вы использование aop? – SMA

ответ

3

Intercept запрос/ответ с использованием ClientInterceptor на WebServiceGatewaySupport:

// soapClient extends WebServiceGatewaySupport 
soapClient.setInterceptors(new ClientInterceptor[]{new ClientInterceptor() { 
     @Override 
     public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { 
      ByteArrayOutputStream os = new ByteArrayOutputStream(); 
      try { 
       messageContext.getRequest().writeTo(os); 
      } catch (IOException e) { 
       throw new WebServiceIOException(e.getMessage(), e); 
      } 

      String request = new String(os.toByteArray()); 
      logger.trace("Request Envelope: " + request); 
      return true; 
     } 

     @Override 
     public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException { 
      ByteArrayOutputStream os = new ByteArrayOutputStream(); 
      try { 
       messageContext.getResponse().writeTo(os); 
      } catch (IOException e) { 
       throw new WebServiceIOException(e.getMessage(), e); 
      } 

      String response = new String(os.toByteArray()); 
      logger.trace("Response Envelope: " + response); 
      return true; 
     } 
     ... 

Чтобы получить заголовки, а вам нужен экземпляр TransportOutputStream. К сожалению, класс является абстрактным, поэтому вам нужен подкласс. Вот как это может выглядеть:

class ByteArrayTransportOutputStream extends TransportOutputStream { 

    private ByteArrayOutputStream outputStream; 

    @Override 
    public void addHeader(String name, String value) throws IOException { 
     createOutputStream(); 
     String header = name + ": " + value + "\n"; 
     outputStream.write(header.getBytes()); 
    } 

    public byte[] toByteArray() { 
     return outputStream.toByteArray(); 
    } 

    @Override 
    protected OutputStream createOutputStream() throws IOException { 
     if (outputStream == null) { 
      outputStream = new ByteArrayOutputStream(); 
     } 
     return outputStream; 
    } 
} 
+0

Я уже пробовал этот. Он регистрирует только SOAP-запрос xml. Не HTTP-запрос вместе с заголовками http. – nebula

+0

Вы можете передать 'TransportOutputStream' вместо' ByteArrayOutputStream'. Согласно Javadoc 'WebServiceMessage # writeTo': если данный поток является экземпляром {@link * org.springframework.ws.transport.TransportOutputStream}, соответствующие заголовки также будут записаны. – fateddy

+0

Как получить экземпляр «TransportOutputStream» здесь? – nebula

Смежные вопросы