1

下面是我用来在我的 Android 应用程序中发送 SOAP 请求的代码,它适用于除一个之外的所有请求。此代码抛出IOException : Content-length exceeded on wr.flush();when there are Chinese characters in requestBodyvariable。

这种情况下的内容长度是409

            URL url = new URL(Constants.HOST_NAME);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // Modify connection settings
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
            connection.setRequestProperty("SOAPAction", soapAction);

            String requestBody = new String(soapRequest.getBytes(),"UTF-8");
            int lngth = requestBody.length();
            connection.setRequestProperty("Content-Length", (""+lngth));

            // Enable reading and writing through this connection
            connection.setDoInput(true);
            connection.setDoOutput(true);

            // Connect to server
            connection.connect();

            OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
            wr.write(requestBody);
            wr.flush();
            wr.close();

任何线索当字符串中有中文字符时出了什么问题?

编辑:我已经删除了 'content-lenght' 标题字段并且它可以工作,但是为什么呢?

4

3 回答 3

3

此代码将请求的 Content-Length 属性设置为消息的字符串表示形式中的字符数:

String requestBody = new String(soapRequest.getBytes(),"UTF-8");
int lngth = requestBody.length();
connection.setRequestProperty("Content-Length", (""+lngth));

但是,您在写入之前将该字符串表示形式转换回字节:

OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");

因此,您最终会写入比您声称的更多的字节。对于任何非 ASCII 字符,您都会遇到同样的问题。相反,你应该做这样的事情(复制和粘贴,所以可能有语法错误):

byte[] message = soapRequest.getBytes();
int lngth = message.length;
connection.setRequestProperty("Content-Length", (""+lngth));

// ...

connection.getOutputStream().write(message);
于 2011-01-19T14:57:15.463 回答
1

为了简化另一个答案: Content-Length 必须是以字节为单位的长度,并且您正在以 chars 指定长度(Java 的 16 位 char 类型)。一般来说,这些是不同的。由于 UTF-8 是一种可变字节长度编码,因此超出基本 7 位 ASCII 范围的任何内容都存在差异。另一个答案显示了编写代码的正确方法。

于 2011-01-21T07:35:22.280 回答
0

我的猜测是您还没有将中文转换为utf-8。如果您支持用户在您的字段中输入双宽字符集和扩展字符集,则需要确保将您的输入从这些字符集(ASCII、UNICODE 或 UCS)转换为 UTF-8。

一旦你确定了你正在使用的字符编码,你可以使用类似的东西:

FileInputStream(inputFile), "inputencoding");
Writer output = new OutputStreamWriter(new FileOutputStream(outputFile), "outputencoding");

参考

在创建用于读取/写入的流以在两者之间进行转换时。

另一种选择是研究设置控制http请求语言的请求属性。我对此知之甚少。

于 2011-01-19T14:41:27.643 回答