jax-ws изменяет Content-type на Content-Type, потому что сервер сверхчувствителен - PullRequest
11 голосов
/ 03 марта 2010

Мне нужно подключиться к плохо внедренному серверу, который понимает только Content-Type (прописной-T), а не Content-type. Как я могу попросить моего клиента JAX-WS отправить Content-Type?

Я пробовал:

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

Но headers - это null. Что я делаю не так?

Ответы [ 2 ]

15 голосов
/ 15 марта 2010

Мне нужно подключиться к плохо внедренному серверу, который понимает только Content-Type (прописной-T), а не Content-type. Как я могу попросить моего клиента jax-ws отправить Content-Type?

Я выкопал этот вопрос немного больше и, к сожалению, боюсь, ответ: ты не можешь. Позвольте мне поделиться своими выводами.

Во-первых, код, который вы найдете в https://jax -ws.dev.java.net / guide / HTTP_headers.html , не предоставляет вам доступ к HTTP заголовки будущего HTTP-запроса (который не был создан на данный момент), он позволяет вам установить дополнительные HTTP-заголовки для выполнения запроса (который будет добавлен к HTTP-запросу позже).

Итак, не ожидайте, что следующий код не вернет null, если вы ничего не put ранее (и на самом деле, вы получите только то, что у вас там put):

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

Затем я провел небольшой тест на основе кода, приведенного в той же ссылке:

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

И вот что я вижу в HTTP-запросе при запуске клиентского кода:

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

Замечаете ли вы разницу: только первый символ заголовка X-Client-Version хранится в верхнем регистре, а остальные опускаются!

И действительно, если вы проверите класс c.s.x.w.t.Headers, который используется для представления заголовков HTTP-запроса (и ответа), вы увидите, что он «нормализует» ключи при их добавлении (в 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) {
     ...
 }

Итак, хотя класс c.s.x.w.t.h.c.HttpTransportPipe (насколько я понимаю, именно здесь создается HTTP-запрос, в него также добавляются ранее добавленные заголовки, добавляемые в заголовки HTTP-запроса) "Content-Type" в качестве ключа в экземпляре c.s.x.w.t.Headers ключ будет изменен из-за ранее упомянутой детали реализации.

Возможно, я ошибаюсь, но я не понимаю, как это можно изменить без исправления кода. И странным является то, что я не думаю, что этот «нормализующий» материал действительно соответствует RFC (хотя я и не проверял, что говорят RFC о случае заголовков). Я удивлен. На самом деле, вы должны поднять вопрос .

Итак, я вижу здесь три варианта (поскольку ожидание исправления может не быть вариантом):

  • Заплатите код самостоятельно и пересоберите JAX-WS RI (со всеми недостатками этого подхода).
  • Попробуйте другую реализацию JAX-WS, такую ​​как CFX, для своего клиента.
  • Пусть запрос проходит через какой-то пользовательский прокси для изменения заголовка на лету.
3 голосов
/ 12 марта 2010

Вы можете изменить заголовки HTTP из RequestContext. Если у вас есть доступ к объекту порта, вы можете привести его к javax.xml.ws.BindingProvider, который предоставит вам доступ к RequestContext.

Возможно, вы также захотите удалить неприемлемый заголовок «Content-type».

На этой странице показано, как это сделать, более подробно: https://jax -ws.dev.java.net / guide / HTTP_headers.html

Дайте мне знать, если вам нужно больше примеров кода или если вы вставите часть своего кода, я покажу вам, как его изменить.

...