2012-11-08 13 views
6

मुझे पूर्ण http अनुरोध और जेएक्स-डब्ल्यूएस वेब सेवा कॉल में प्रतिक्रिया लॉग इन करने की आवश्यकता है। अनुरोध के लिए मुझे अनुरोध हेडर और शरीर और प्रतिक्रिया के लिए, प्रतिक्रिया शीर्षलेख और शरीर की आवश्यकता है।लॉग जैक्स-डब्ल्यूएस http अनुरोध और प्रतिक्रिया

कुछ शोध करने के बाद, मैंने पाया कि मैं संपत्ति के साथ इस बारे में जानकारी प्राप्त कर सकते हैं:

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

और जानकारी है कि मैं जरूरत दिखाने लेकिन यह कंसोल के लिए यह उदासीनता और मैं में संग्रहीत करना होगा एक आंतरिक अनुरोध आईडी के साथ डेटाबेस।

मैं एक हैंडलर को लागू करने की कोशिश की है:

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

} 

लेकिन इस मामले में, मैं http अनुरोध हेडर और शरीर प्राप्त कर सकते हैं, लेकिन जवाब में, मैं सिर्फ शरीर मिलता है, http प्रतिक्रिया हेडर हमेशा से रहे हैं खाली।

इस बारे में कोई विचार कैसे प्राप्त किया जाए? उद्देश्य डेटाबेस में पूर्ण http अनुरोध और प्रतिक्रिया को स्टोर करने में सक्षम होना है।

धन्यवाद !!

उत्तर

2

तुम भी

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

की कोशिश कर सकते मैं आप (और एक स्टैंडअलोन ग्राहक से नहीं) किसी प्रकार की जावा ईई अनुप्रयोग सर्वर के भीतर से अपने वेब सेवा प्रदान कर रहे हैं संभालने हूँ। वेब/जावा ईई कंटेनर के संदर्भ के बाहर आपको जावा ईई इंफ्रास्ट्रक्चर जैसे HttpServletRequest और HttpServletResponse तक पहुंच नहीं हो सकती है।

आप अपने हाथ (एक वेब संदर्भ में) के साथ वास्तविक सर्वलेट प्रतिक्रिया ऑब्जेक्ट पर प्राप्त करने

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

मैं गंभीरता से संदेह है कि आप के भीतर पूर्ण प्रतिक्रिया हेडर पर अपने हाथों को प्राप्त करने में सक्षम हो जाएगा की कोशिश कर सकते हालांकि एक हैंडलर। आपका प्रश्न वास्तव में मुझे चिंतित करता है और मैंने उस भाग का शोध करने में काफी समय बिताया है। मैंने देखा है कि सभी कोड नमूने में, metro site पर इस कार्यक्षमता को लागू करने का प्रयास भी नहीं है और मुझे लगता है कि कारण सरल है। उस बिंदु पर जहां एक हैंडलर लगाया जाता है, कंटेनर में आउटबाउंड संदेश पर http शीर्षलेख मुद्रित करने के लिए पर्याप्त निश्चित जानकारी नहीं हो सकती है। आप सामान जोड़ने में सक्षम हो सकते हैं लेकिन यह भी संदिग्ध है।

+0

आपके उत्तर के लिए धन्यवाद। मैं टॉमकैट एप्लिकेशन सर्वर में स्प्रिंग 3 का उपयोग कर webservice प्रदान कर रहा हूं। आपका पहला प्रस्ताव, इसे सिर्फ कंसोल पर डंप करेगा, है ना? मुझे इसे डेटाबेस में और दूसरे विकल्प के बारे में स्टोर करने में सक्षम होना चाहिए, मैं इसे आज़मा दूंगा। धन्यवाद! – drublik

+0

@drublik सुनिश्चित करें, हमें बताएं कि यह कैसे काम करता है। मैं आपके उत्तर के लिए – kolossus

+0

धन्यवाद के लिए उत्सुक हूं लेकिन HttpServletResponse में "getHeaderNames()" विधि नहीं है। वास्तव में, ऐसा लगता है कि इसमें हेडर प्राप्त करने के लिए कोई तरीका नहीं है, केवल सेट करने के लिए। यह फ़ंक्शन केवल HttpServletRequest में है। – drublik

संबंधित मुद्दे