java - jax-ws 将 Content-type 更改为 Content-Type 因为服务器非常敏感

标签 java http header client jax-ws

我必须连接到一个实现不佳的服务器,它只理解Content-Type (capital-T) 而不是Content-type。我怎样才能让我的 JAX-WS 客户端发送 Content-Type

我试过:

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

但是 headersnull。我做错了什么?

最佳答案

I have to connect to a poorly implemented server that only understands Content-Type(capital-T) and not Content-type. How can I ask my jax-ws client to send Content-Type?

我对这个问题进行了深入研究,遗憾的是,恐怕答案是:你不能。让我分享我的发现。

首先,您将在 https://jax-ws.dev.java.net/guide/HTTP_headers.html 中找到代码不会让您访问 future HTTP 请求的 HTTP header (此时尚未创建),它允许您设置其他 HTTP header 以发出请求 (稍后将添加到 HTTP 请求中)。

所以,如果您之前没有put任何东西,不要指望下面的代码不会返回null(实际上,您只会得到您放在那里):

((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

Do you notice the difference: only the first char of the X-Client-Version header is kept upper cased, the rest is lowered!

And indeed, if you check the class c.s.x.w.t.Headers that is used to represent HTTP request (and response) headers, you'll see that it "normalizes" keys when they are added (in 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请求的地方,这也是之前添加的headers将添加到HTTP请求头的地方)实际上添加了"Content-Type" 作为 c.s.x.w.t.Headers 中的键例如,由于前面提到的实现细节, key 将被修改。

我可能是错的,但我不明白如何在不修补代码的情况下改变它。奇怪的是,我不认为这种“规范化”的东西真的符合 RFC(虽然没有检查 RFC 关于 header 大小写的内容)。我很惊讶。实际上,你应该 raise an issue .

所以我在这里看到三个选项(因为等待修复可能不是一个选项):

  • 自己修补代码并重新构建 JAX-WS RI(具有此方法的所有缺点)。
  • 为您的客户尝试另一个 JAX-WS 实现,例如 CFX。
  • 让请求通过某种自定义代理来动态修改 header 。

关于java - jax-ws 将 Content-type 更改为 Content-Type 因为服务器非常敏感,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2372336/

相关文章:

java - 使用 MongoDB react 驱动程序阻止 react 应用程序中的操作

java - java中如何将多个元素放入byte[]

swift - 如何使用TableView滚动来隐藏UITableView标题和导航栏?

javascript - 仅提供请求的内容范围

java - 时间序列数据 - 计算两组的出现次数

java - 设计类层次结构——Java中的多重继承

c# - 集成测试 - 此操作需要 IIS 集成管道模式

css - 调整大小的标题不再是 100%

java - Java ResourceBundle.getBundle 如何加载属性文件?

http - 使用自签名证书实现 tls.Config.GetCertificate