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.
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 –
@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. –