1

以下は、AndroidアプリでSOAPリクエストを送信するために使用しているコードで、1つを除くすべてのリクエストで正常に機能します。このコードはIOExceptionをスローします:変数に漢字がある場合にContent-lengthを超えました。wr.flush();requestBody

その場合のコンテンツの長さは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範囲を超えるものには違いがあります。もう1つの答えは、コードを書く適切な方法を示しています。

于 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");

参照

2つの間で変換するための読み取り/書き込み用のストリームを作成するとき。

もう1つの方法は、httpリクエストの言語を制御するリクエストプロパティの設定を調べることです。私はそれについてあまり知りません。

于 2011-01-19T14:41:27.643 に答える