加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – jax-ws将内容类型更改为Content-Type,因为服务器超级敏

发布时间:2020-12-14 16:19:32 所属栏目:Java 来源:网络整理
导读:我必须连接到只能理解Content-Type(capital-T)而不是Content-type的执行不良的服务器.如何让我的JAX-WS客户端发送Content-Type? 我试过了: MapString,ListString headers = (MapString,ListString)((BindingProvider)port).getRequestContext().get(Messag
我必须连接到只能理解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);

但标题为空.我究竟做错了什么?

解决方法

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中找到的代码不会访问未来HTTP请求的HTTP标头(此时尚未创建),它允许您设置其他HTTP标头以进行请求(这将被添加到HTTP请求).

所以,不要期望以下代码不返回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

你注意到了区别:只有X-Client-Version头文件的第一个字符被保留在上面,其余的被降低了!

实际上,如果您检查用于表示HTTP请求(和响应)标题的类c.s.x.w.t.Headers,则会在添加时对其进行“规范化”(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请求头),实际上在“c.s.x.w.t.Headers”实例中添加了“Content-Type”作为关键字,由于前面提到的实现细节,密钥将被修改.

我可能是错的,但是如果没有修补代码,我看不出有什么可以改变的.奇怪的是,我不认为这个“规范化”的东西是符合RFC的(没有检查哪些RFC对标题的说法).我很惊讶.其实你应该是raise an issue.

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

>自己修补代码并重建JAX-WS RI(具有这种方法的所有缺点).>为您的客户端尝试另一个JAX-WS实现,如CFX.>让请求通过某种自定义代理来即时修改标题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读