gpt4 book ai didi

java - 请求被 CDATA 包裹

转载 作者:行者123 更新时间:2023-11-29 09:16:02 25 4
gpt4 key购买 nike

我正在为 WCF 开发一个 Java 客户端,并且模板运行良好。我最初使用的是 eclipse 的 Web 服务客户端项目,但后来发现 android 平台不支持所需的库。当时我打算使用 ksoap,但它给了我很多问题,所以我得到了一份工作 soap 请求的副本

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/ITransferService/getInt</Action>
</s:Header>
<s:Body>
<getInt xmlns="http://tempuri.org/">
<i>42</i>
</getInt>
</s:Body>
</s:Envelope>

并决定制作一个模板,该模板可以接受值并将其粘贴在 42 所在的位置。当我打印出来时,它看起来应该很好用,但当我跟踪时我注意到我的请求被包裹在 CDATA 标签中。

<MessageLogTraceRecord><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/ITransferService/getInt</Action>
</s:Header>
<s:Body>
<getInt xmlns="http://tempuri.org/">
<i>100</i>
</getInt>
</s:Body>
</s:Envelope>
]]></MessageLogTraceRecord>

我不确定为什么它包含在 CDATA 中,我正在使用 HttpURLConnection 建立和发送连接。处理该问题的代码如下所示。

private static void sendRequest(String request) throws Exception
{
URL u = new URL(DEFAULT_SERVER);
URLConnection uc = u.openConnection();
HttpURLConnection connection = (HttpURLConnection)uc;

connection.setRequestProperty("content-type", "text/html; charset=utf8");

connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("SOAPAction",SOAP_ACTION);

OutputStream out = connection.getOutputStream();
Writer wout = new OutputStreamWriter(out);

wout.write(request);
wout.flush();
wout.close();
System.out.println(connection.getResponseMessage());
}

请求变量就是上面显示的内容,至少是包裹在 CDATA 标签中的内容。当我调用 System.out.println(connection.getResponseMessage());然后它告诉我不支持的媒体类型。我在 WCF 服务器的绑定(bind)配置中使用 Text 作为 messageEncoding

对于如何让我的 Java 客户端正确发送数据而不是在 cdata 包装器中,有人有什么建议吗?

谢谢尼克朗

编辑:我改变了这一行

connection.setRequestProperty("content-type", "text/html; charset=utf8");

对此

connection.setRequestProperty("content-type", "text/xml");

一开始就应该这样。我现在收到 500 内部服务器错误,所以我不确定我是否更接近了。任何建议仍然非常感谢

最佳答案

我做的第一个改变是:

connection.setRequestProperty("content-type", "text/html; charset=utf8");

对此

connection.setRequestProperty("content-type", "text/xml");

这就是摆脱 415 错误的原因。之后我遇到了 500 错误。我所做的修复是我采用了这条线

<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/ITransferService/getInt</Action>

并删除它,使我的模板成为这样:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
</s:Header>
<s:Body>
<getInt xmlns="http://tempuri.org/">
<i>%val%</i>
</getInt>
</s:Body>
</s:Envelope>

我相信(如果我错了,请有人纠正我)我收到 500 错误的原因是我有这行和我删除的行:

connection.setRequestProperty("SOAPAction",SOAP_ACTION);

进行这些更改后,我的客户端运行良好,我已经能够将它带到 android 的图像共享客户端。

关于java - 请求被 CDATA 包裹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9384502/

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