【问题标题】:Send SOAP Request with XML Parameter UTF-8 Java使用 XML 参数 UTF-8 Java 发送 SOAP 请求
【发布时间】: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 看到的值。

标签: java soap utf-8


【解决方案1】:

我改成这样:

reader = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));

我的问题得到了解决。

谢谢!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2011-12-12
    • 2011-09-25
    相关资源
    最近更新 更多