2010-03-03 33 views
10

Tôi phải kết nối với máy chủ được triển khai kém chỉ hiểu Content-Type (vốn-T) và không Content-type. Làm thế nào tôi có thể yêu cầu khách hàng JAX-WS gửi Content-Type?jax-ws thay đổi Kiểu nội dung thành Kiểu nội dung vì máy chủ nhạy cảm

Tôi đã thử:

Map<String, List<String>> headers = (Map<String, List<String>>) 
((BindingProvider)port).getRequestContext().get(MessageContext.HTTP_REQUEST_HEADERS); 

Nhưng headersnull. Tôi đang làm gì sai?

Trả lời

14

Tôi phải kết nối với máy chủ được triển khai kém mà chỉ hiểu Content-Type (capital-T) chứ không phải Content-type. Làm thế nào tôi có thể yêu cầu khách hàng jax-ws của mình gửi Content-Type?

Tôi đã đào câu hỏi này thêm một chút và, thật đáng buồn, tôi sợ câu trả lời là: bạn không thể. Hãy để tôi chia sẻ những phát hiện của tôi.

Thứ nhất, mã mà bạn sẽ tìm thấy trong https://jax-ws.dev.java.net/guide/HTTP_headers.htmlkhông cung cấp cho bạn truy cập vào các tiêu đề HTTP của yêu cầu HTTP tương lai (mà chưa được tạo ra vào thời điểm này), nó cho phép bạn thiết lập thêm Tiêu đề HTTP để thực hiện yêu cầu (sẽ được thêm vào yêu cầu HTTP sau).

Vì vậy, tôi không mong đợi đoạn mã sau để không trở null nếu bạn không put bất cứ điều gì trước (và trên thực tế, bạn sẽ chỉ có được những gì bạn put trong đó):

((BindingProvider)port).getRequestContext().get(MessageContext.HTTP_REQUEST_HEADERS); 

Sau đó, tôi đã làm một thử nghiệm nhỏ dựa trên mã được cung cấp trong cùng một liên kết:

AddNumbersImplService service = new AddNumbersImplService(); 
AddNumbersImpl port = service.getAddNumbersImplPort(); 

((BindingProvider)port).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, 
    Collections.singletonMap("X-Client-Version",Collections.singletonList("1.0-RC"))); 

port.addNumbers(3, 5); 

Và đây là những gì tôi nhìn thấy trong yêu cầu HTTP khi chạy mã khách hàng:

 
POST /q2372336/addnumbers HTTP/1.1 
Content-type: text/xml;charset="utf-8" 
X-client-version: 1.0-RC 
Soapaction: "" 
Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 
User-Agent: JAX-WS RI 2.1.6 in JDK 6 
Host: localhost:8080 
Connection: keep-alive 
Content-Length: 249 

Bạn có nhận thấy sự khác biệt: chỉ char đầu tiên của tiêu đề X-Client-Version được giữ nguyên phía trên, phần còn lại được hạ xuống!

Và quả thực, nếu bạn đánh dấu vào lớp c.s.x.w.t.Headers được sử dụng để đại diện cho HTTP yêu cầu (và phản ứng) tiêu đề, bạn sẽ thấy rằng nó là "bình thường hóa" phím khi chúng được thêm vào (trong normalize(String)):

/* Normalize the key by converting to following form. 
* First char upper case, rest lower case. 
* key is presumed to be ASCII 
*/ 
private String normalize (String key) { 
    ... 
} 

Vì vậy, trong khi lớp c.s.x.w.t.h.c.HttpTransportPipe (sự hiểu biết của tôi là đây là nơi yêu cầu HTTP được tạo, đây cũng là nơi các tiêu đề được thêm trước đó sẽ được thêm vào tiêu đề yêu cầu HTTP thực sự thêm "Content-Type" làm khóa trong trường hợp c.s.x.w.t.Headers, khóa sẽ được sửa đổi vì chi tiết triển khai được đề cập trước đây.

Tôi có thể sai nhưng tôi không thấy điều này có thể thay đổi như thế nào mà không cần vá mã. Và phần lẻ là tôi không nghĩ rằng công cụ "bình thường hóa" này thực sự tuân thủ RFC (không kiểm tra những gì RFC nói về trường hợp tiêu đề). Tôi ngạc nhiên. Trên thực tế, bạn nên raise an issue.

Vì vậy, tôi thấy ba tùy chọn ở đây (kể từ khi chờ đợi một giải pháp có thể không là một lựa chọn):

  • vá mã bản thân và xây dựng lại JAX-WS RI (với tất cả các nhược điểm của phương pháp này).
  • Thử thực hiện JAX-WS khác như CFX cho khách hàng của bạn.
  • Cho phép yêu cầu đi qua một số loại proxy tùy chỉnh để sửa đổi tiêu đề khi đang di chuyển.
+0

Tôi đã sử dụng các proxy tùy chỉnh bây giờ ... Xấu xí như địa ngục và muốn loại bỏ mofo xấu xí này khỏi mã của tôi. Oh well. C'est la qua –

+1

@EsbenP Nếu bạn nêu vấn đề này, vui lòng cập nhật câu hỏi bằng liên kết. Tôi thực sự muốn nhận được một số phản hồi từ các nhà phát triển RI JAX-WS về vấn đề này. –

3

Bạn có thể sửa đổi tiêu đề HTTP từ RequestContext. Nếu bạn có quyền truy cập vào đối tượng cổng, bạn có thể đưa nó vào một javax.xml.ws.BindingProvider, nó sẽ cho phép bạn truy cập vào RequestContext.

Bạn cũng có thể muốn xóa tiêu đề "Loại nội dung" không được chấp nhận.

Trang này cho thấy làm thế nào để làm điều đó một cách chi tiết hơn một chút: https://jax-ws.dev.java.net/guide/HTTP_headers.html

Hãy cho tôi biết nếu bạn cần mẫu mã hơn, hoặc nếu bạn dán một số mã của bạn tôi có thể cho bạn thấy làm thế nào để sửa đổi nó.

+0

thấy chỉnh sửa của tôi .... –

+0

vào liên kết bị hỏng, tôi cũng cố gắng msg.getMimeHeaders() sau đó removeHeader hoặc addHeader thậm chí removeAllHeaders gì hoạt động, vector ủng hộ các tiêu đề dường như bất biến –

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