【发布时间】:2018-11-24 21:31:39
【问题描述】:
我正在这里就我的问题寻求建议。我在 Java 中有一个带有以下代码的 SOAP 请求:
private static SOAPMessage createSOAPRequest(String shellType, String filterCondition,
Map<String, String> AndySiteToSync) throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
SOAPMessage soapMessage = messageFactory.createMessage();
createSoapEnvelope(soapMessage, shellType, filterCondition, AndySiteToSync);
MimeHeaders headers = soapMessage.getMimeHeaders();
soapMessage.saveChanges();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
soapMessage.writeTo(stream);
return soapMessage;
}
我在 XML 上有以下结构。
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:gen="http://general.service.webservices.skire.com">
<soap:Header/>
<soap:Body>
<gen:updateShell>
<!--Optional:-->
<gen:shortname>xxx</gen:shortname>
<!--Optional:-->
<gen:authcode>xxx</gen:authcode>
<!--Optional:-->
<gen:shellType>xxx</gen:shellType>
<!--Optional:-->
<gen:shellXML>
<![CDATA[
<List_Wrapper>
<_shell>
<paraminside>letterwithutf8_ññ</uuu_longitude>
</_shell>
</List_Wrapper>
]]>
</gen:shellXML>
</gen:updateShell>
</soap:Body>
</soap:Envelope>
对于没有 ñ 或 áéíóú 的字符非常有效,但是当我传递带有 ñ 的参数时,我会看到结果 ñ。当我打印输入 xml 时,它用正确的字符显示 XML 很好,但是当我发送请求时,结果显示不正确的字符 (ñ)
我将相同的输入 XML 粘贴到 SOAPUI 中,结果很好,ñ 字符引入良好。问题是当我使用 Java 发送请求时。 我认为这是消息的编码。所以我在 saveChanges 之前添加了这些行:
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("Content-Type", "application/soap+xml;charset=UTF-8");
另外测试: headers.setHeader("Content-Type", "application/soap+xml;charset=UTF-8");
这些标头与 SOAPUI 相同,但“操作”除外 我确保标题可以打印出来。
for (int iii = 0; iii < headers.getHeader("Content-Type").length; iii++) {
System.out.println((headers.getHeader("Content-Type"))[iii]);
}
我得到了响应 application/soap+xml;charset=UTF-8
我这样创建连接:
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(....))
SOAPUI
POST https://xxxxxxxxxxxxxxxxx/WebServices HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/soap+xml;charset=UTF-8;action="urn:xxxxxxx"
Content-Length: 4381
Host: xxxxxxxxxxxxxxxx
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
谢谢。
=============================================
感谢 Andreas,我做了更多测试,编码问题出现在 SOAP 请求之前,我使用以下代码从 json 格式的 URL 获取信息:
JSONArray jsonDataFinal = new JSONArray();
JSONArray jsonData = (JSONArray) parser.parse(readUrl(URL));
然后:
List<Map<String,String>> mergeArray = new ArrayList<Map<String,String>>();
Map<String, String> mergeObj = null;
for (Object o : sitesArray)
{
if((siteAndy.get("xxxx")) == null) mergeObj.put("xxxx", "");
else mergeObj.put("xxxx", ((String) siteAndy.get("xxxx")).trim());
}
什么时候应该使用 utf-8 编码?
谢谢
【问题讨论】:
-
soapMessage.writeTo(stream);的目的是什么??你写信给ByteArrayOutputStream然后就丢弃它??没有意义。 -
您是否确定在编写soap消息时发生编码问题,而不是在您获取字符串值的较早时间点?
-
@Andreas 忘了删除那些行,你是对的。谢谢。是的,我敢肯定,我将输入 XML 打印在一个文件中,并且它看起来正确,具有正确的值。
-
我也用静态输入 XML 做了一个测试,也遇到了同样的问题。
-
您“在文件中打印输入的 XML”?你用什么编码来写文件? 查看文件时您使用了什么编码? 确定字符串正确的最佳方法是设置断点并查看 Java 看到的值。