gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:22:35 26 4
gpt4 key购买 nike

我必须连接到一个实现不佳的服务器,它只理解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.1Content-type: text/xml;charset="utf-8"X-client-version: 1.0-RCSoapaction: ""Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2User-Agent: JAX-WS RI 2.1.6 in JDK 6Host: localhost:8080Connection: keep-aliveContent-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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com