2012-11-08 73 views
6

Tôi cần đăng nhập yêu cầu và đáp ứng http đầy đủ trong một cuộc gọi WebService JAX-WS. Đối với yêu cầu, tôi cần tiêu đề yêu cầu và nội dung cũng như cho phản hồi, tiêu đề phản hồi và nội dung.Đăng nhập jax-ws http yêu cầu và phản hồi

Sau khi một số nghiên cứu, tôi đã thấy rằng tôi có thể nhận được thông tin này với bất động sản:

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

và hiển thị các thông tin mà tôi cần nhưng nó bãi nó vào giao diện điều khiển và tôi cần phải lưu trữ nó trong cơ sở dữ liệu với một id yêu cầu nội bộ.

Tôi đã cố gắng thực hiện một 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(); 
    } 

} 

nhưng trong trường hợp này, tôi có thể lấy tiêu đề yêu cầu http và cơ thể nhưng trong phản ứng, tôi chỉ nhận được cơ thể, tiêu đề phản ứng http luôn trống.

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này? Mục tiêu là để có thể lưu trữ toàn bộ yêu cầu và đáp ứng http trong cơ sở dữ liệu.

Cảm ơn !!

Trả lời

2

Bạn cũng có thể thử

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

Tôi giả sử bạn đang cung cấp dịch vụ web của bạn từ bên trong một máy chủ ứng dụng Java EE của một số loại (chứ không phải từ một khách hàng độc lập). Bạn không thể có quyền truy cập vào cơ sở hạ tầng Java EE như HttpServletRequestHttpServletResponse bên ngoài ngữ cảnh của một thùng chứa web/Java EE.

Bạn có thể thử để có được bàn tay của bạn trên các đối tượng phản ứng servlet thực tế (trong một bối cảnh web) với

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

tôi nghiêm túc nghi ngờ rằng bạn sẽ có thể để có được bàn tay của bạn trên các tiêu đề phản ứng đầy đủ trong vòng một xử lý mặc dù. Câu hỏi của bạn thực sự hấp dẫn tôi và tôi đã dành khá nhiều thời gian để nghiên cứu phần đó. Trong tất cả các mẫu mã tôi đã thấy, thậm chí không phải ví dụ về nỗ lực metro site để triển khai chức năng này và tôi nghĩ lý do rất đơn giản. Tại thời điểm mà trình xử lý được gọi, vùng chứa có thể không có đủ thông tin xác định để đóng tiêu đề http vào thư gửi đi. Bạn có thể thêm nội dung nhưng điều đó cũng đáng ngờ.

+0

Cảm ơn bạn đã trả lời. Tôi đang cung cấp webservice bằng cách sử dụng Spring 3 trong một máy chủ ứng dụng Tomcat. Đề nghị đầu tiên của bạn, sẽ chỉ đổ nó vào giao diện điều khiển, phải không? Tôi cần để có thể lưu trữ nó trong một cơ sở dữ liệu và liên quan đến các tùy chọn thứ hai, tôi sẽ cung cấp cho nó một thử. Cảm ơn! – drublik

+0

@drublik chắc chắn, hãy cho chúng tôi biết cách hoạt động của nó. Tôi tò mò cho một trong những – kolossus

+0

cảm ơn bạn đã trả lời nhưng HttpServletResponse không có phương thức "getHeaderNames()". Trong thực tế, có vẻ như nó không có bất kỳ phương pháp để có được tiêu đề, chỉ để thiết lập. Hàm này chỉ có trong HttpServletRequest. – drublik

Các vấn đề liên quan