2012-11-08 20 views
6

Potrzebuję zarejestrować pełne żądanie HTTP i odpowiedź w wywołaniu WebService JAX-WS. Do żądania potrzebuję nagłówków żądania i treść oraz odpowiedzi, nagłówków odpowiedzi i treści.Żądanie i odpowiedź HTTP jax-ws

Po pewnym badania, odkryłem, że mogę uzyskać te informacje z właściwością:

-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true 

i pokazać informację, że muszę, ale zrzuca go do konsoli i trzeba przechowywać go w baza danych z wewnętrznym identyfikatorem żądania.

Próbowałem zaimplementować Handler:

public class LoggingHandler implements SOAPHandler<SOAPMessageContext> { 

    @Override 
    public boolean handleMessage(SOAPMessageContext context) { 
     Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
     if (outbound) { 
      System.out.println("SOAP outbound!!!!!"); 
      Map<String, List<String>> responseHeaders = (Map<String, List<String>>) context 
        .get(SOAPMessageContext.HTTP_RESPONSE_HEADERS); 
      try { 
       String headers = getHeaders(responseHeaders); 
       System.out.println(headers); 
       String body = getBody(context.getMessage()); 
       System.out.println(body); 
      } catch (Exception ex) { 
       // TODO: What do I have to do in this case? 
      } 
     } else { 
      System.out.println("SOAP inbound!!!!!"); 
      Map<String, List<String>> requestHeaders = (Map<String, List<String>>) context 
        .get(SOAPMessageContext.HTTP_REQUEST_HEADERS); 
      try { 
       String headers = getHeaders(requestHeaders); 
       System.out.println(headers); 
       String body = getBody(context.getMessage()); 
       System.out.println(body); 
      } catch (Exception ex) { 
       // TODO: What do I have to do in this case? 
      } 
     } 
     return true; 
    } 

    private String getBody(SOAPMessage message) throws SOAPException, IOException { 
     OutputStream stream = new ByteArrayOutputStream(); 
     message.writeTo(stream); 
     return stream.toString(); 
    } 

    public String getFullHttpRequest(HttpServletRequest request) throws IOException { 
     InputStream in = request.getInputStream(); 
     String encoding = request.getCharacterEncoding(); 
     encoding = encoding == null ? "UTF-8" : encoding; 
     String body = IOUtils.toString(in, encoding); 
     return body; 
    } 

    private String getHeaders(Map<String, List<String>> headers) throws IOException { 
     StringBuffer result = new StringBuffer(); 
     if (headers != null) { 
      for (Entry<String, List<String>> header : headers.entrySet()) { 
       if (header.getValue().isEmpty()) { 
        // I don't think this is legal, but let's just dump it, 
        // as the point of the dump is to uncover problems. 
        result.append(header.getValue()); 
       } else { 
        for (String value : header.getValue()) { 
         result.append(header.getKey() + ": " + value); 
        } 
       } 
       result.append("\n"); 
      } 
     } 
     return result.toString(); 
    } 

} 

ale w tym przypadku, mogę nagłówków żądania HTTP i ciało, ale w odpowiedzi, mam tylko ciało, nagłówki odpowiedzi HTTP są zawsze pusty.

Każdy pomysł, jak to archiwizować? Celem jest przechowywanie pełnego żądania HTTP i odpowiedzi w bazie danych.

Dzięki!

Odpowiedz

2

Można również spróbować

-Dcom.sun.xml.ws.transport.http.HttpAdapter.dump=true 

Jestem zakładając jesteś dostarczanie usługi WWW z poziomu serwera aplikacji Java EE jakiegoś (a nie z samodzielnego klienta). Nie można uzyskać dostępu do infrastruktury Java EE, takiej jak HttpServletRequest i HttpServletResponse poza kontekstem kontenera WWW/Java EE.

Można spróbować dostać się w ręce na rzeczywistym obiekcie odpowiedzi servlet (w kontekście internetowej) z

HttpServletResponse response = (HttpServletResponse) messageContext.get(SOAPMessageContext.SERVLET_RESPONSE); //messageContext is the SOAPMessageContext 
    List<String> responseHeaderNames = (List<String>)response.getHeaderNames(); 
     for(String headerName : responseHeaderNames){ 
      //Do whatever you want with it. 
       } 

poważnie wątpię, że będziesz w stanie dostać się w ręce pełnych nagłówków odpowiedzi w terminie ale obsługa. Twoje pytanie naprawdę mnie zaintrygowało i poświęciłem sporo czasu na zbadanie tej części. We wszystkich próbkach kodu, które widziałem, nawet przykład na próbie metro site nie zaimplementował tej funkcji i myślę, że powód jest prosty. W momencie wywołania procedury obsługi kontener może nie mieć wystarczającej ilości informacji ostatecznych, aby wytopić nagłówek http komunikatu wychodzącego. Możesz dodawać rzeczy, ale to też jest wątpliwe.

+0

Dziękuję za odpowiedź. Dostarczam usługę internetową przy użyciu Spring 3 na serwerze aplikacji Tomcat. Twoja pierwsza propozycja, po prostu zrzuci ją na konsolę, prawda? Muszę być w stanie przechowywać go w bazie danych i odnośnie drugiej opcji, spróbuję. Dzięki! – drublik

+0

@drublik z pewnością, daj nam znać, jak to działa. Ciekawy jestem za jedną odpowiedź: – kolossus

+0

dzięki za odpowiedź, ale HttpServletResponse nie ma metody "getHeaderNames()". W rzeczywistości wydaje się, że nie ma żadnej metody na uzyskanie nagłówków, a jedynie ustawienie. Ta funkcja jest tylko w HttpServletRequest. – drublik

Powiązane problemy