2012-11-08 21 views
6

JAX-WS WebService çağrısında tam http isteği ve yanıtını kaydetmem gerekiyor. İstek için istek başlıklarına ve vücuda ve yanıt, cevap başlıkları ve gövdesine ihtiyacım var. Oturum açma jax-ws http istek ve Yanıt

bazı araştırma sonra ben özelliğiyle bu bilgileri alabilirsiniz fark ettik:

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

ve ihtiyacım bilgileri gösterir ama konsola döker ve ben depolamak gerekir bir iç istek kimliği ile veritabanı.

Ben bir işleyici uygulamak için denedim:

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

} 

ancak bu durumda, ben http istek başlıklarını ve beden alabilirsiniz ama cevap olarak, sadece vücut olsun, http yanıt başlıkları daima boş.

Bunu nasıl arşivleyeceğiniz hakkında bir fikriniz var mı? Amaç, tam http istek ve yanıtını bir veritabanında saklayabilmektir.

Teşekkürler!

cevap

2

Ayrıca ben bunları bir tür bir Java EE uygulama sunucusu içinden web hizmeti veren konum (ve tek başına bir istemciden) farz ediyorum

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

deneyebilirsiniz. Bir web/Java EE kabı bağlamı dışında HttpServletRequest ve HttpServletResponse gibi Java EE altyapısına erişemezsiniz.

Sen Ben ciddiye içinde tam yanıt başlıkları üzerinde ellerini almak mümkün olacak şüphe

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. 
       } 

ile (web kapsamında) fiili servlet tepki nesne üzerinde ellerini almak için deneyebilirsiniz

bir işleyici olsa. Sorunun beni gerçekten etkiledi ve bu kısmı araştırmak için epey zaman harcadım. Gördüğüm tüm kod örneklerinde, metro site'daki örnek bile bu işlevselliği uygulama girişiminde bulunmuyor ve bunun nedeninin basit olduğunu düşünüyorum. Bir işleyicinin çağrıldığı noktada, konteyner, giden mesajdaki bir http başlığını damgalamak için yeterli kesin bilgiye sahip olmayabilir. Bir şeyler ekleyebilirsin ama bu da şüpheli.

+0

Cevabınız için teşekkür ederiz. Bir Tomcat uygulama sunucusundaki Spring 3'ü kullanarak web servisini yapıyorum. İlk teklifin, onu konsola bırakacaksın, değil mi? Bir veritabanında saklayabilmem gerekiyor ve ikinci seçenekle ilgili olarak, bunu deneyeceğim. Teşekkürler! – drublik

+0

@drublik emin, nasıl çalıştığını bize bildirin. Bir – kolossus

+0

cevabını merak ettim ama cevabınız için teşekkürler HttpServletResponse "getHeaderNames()" yöntemine sahip değil. Aslında, başlıkları almak için herhangi bir yöntem yoktur, sadece ayarlanmış gibi görünüyor. Bu işlev sadece HttpServletRequest'tedir. – drublik