请求被CDATA包裹起来

时间:2012-02-21 20:15:28

标签: java wcf soap

我正在为WCF开发一个java客户端,并且模板非常好用。我最初使用eclipse的Web服务客户端项目,但后来发现Android平台上不支持所需的库。我当时打算使用kso​​ap,但它给了我很多问题,所以我得到了一份工作肥皂请求的副本

<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内部服务器错误,所以我不确定我是否更接近。任何建议仍然非常感谢

1 个答案:

答案 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的图像共享客户端。