我正在为WCF开发一个java客户端,并且模板非常好用。我最初使用eclipse的Web服务客户端项目,但后来发现Android平台上不支持所需的库。我当时打算使用ksoap,但它给了我很多问题,所以我得到了一份工作肥皂请求的副本
<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服务器的绑定配置中使用Text作为messageEncoding
有没有人对如何让我的java客户端正确发送数据而不是cdata包装器有任何建议?
由于 Nick Long
编辑: 我改变了这一行
connection.setRequestProperty("content-type", "text/html; charset=utf8");
到这个
connection.setRequestProperty("content-type", "text/xml");
像它可能应该开始一样。我现在得到500内部服务器错误,所以我不确定我是否更接近。任何建议仍然非常感谢
答案 0 :(得分:0)
我做的第一个改变是:
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的图像共享客户端。