1

最近、Android で http POST リクエストを介してデータを送受信するときに奇妙な問題に遭遇しました。

Android アプリとサーバー間のトラフィックを監視するようにFiddlerを設定するのに苦労したので、POST 要求をシミュレートするための簡単な Web フォームを作成しました。

<form action="http://www.my.server.org/my_script.php" method="POST">
  <input name="deviceID" type="text" width=30> Device ID <br>
  <input name="lang" type="text" width=30> Language (en / cs) <br>
  <input name="lastUpdated" type="text" width=30> Last Updated (yyyy-MM-dd hh:mm) <br>
  <button type="submit">Send</button>
</form>

このフォームを使用してリクエストを送信すると、200 OK ステータス コードと目的の XML ファイルを含むレスポンスが返されます。

Android アプリにある Java コードと同等だと思いました。

private static final String POST_PARAM_LAST_UPDATED = "lastUpdated";
private static final String POST_PARAM_DEVICE_ID = "deviceId";
private static final String POST_PARAM_LANG = "lang";

...

// Create a POST Header and add POST Parameters
HttpPost httpPost = new HttpPost(URL_ARTICLES);
List<NameValuePair> postParameters = new ArrayList<NameValuePair>(3);
postParameters.add(new BasicNameValuePair(POST_PARAM_DEVICE_ID, deviceId));
postParameters.add(new BasicNameValuePair(POST_PARAM_LANG, lang));
postParameters.add(new BasicNameValuePair(POST_PARAM_LAST_UPDATED, lastUpdated));
httpPost.setEntity(new UrlEncodedFormEntity(postParameters));

// Create new HttpClient and execute HTTP Post Request
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(httpPost);

// Get and parse the response
List<Article> parsedArticles = new ArrayList<Article>();
HttpEntity entity = response.getEntity();
if (entity != null) {
  parsedArticles = Parser.parseArticles(entity.getContent());
}

ただし、同じパラメーター値 (Web フォームに入力した値と同じ) を入力しても、この場合の応答は 204 NO CONTENT であり、明らかに XML ファイルはありません。

この 2 つの方法が同等ではなく、応答が異なる理由を教えてください。それはエンコーディングの何かですか、それとも何が欠けていますか?

残念ながら、サーバーにアクセスできず、Fiddler と PC に接続されているエミュレーター/デバイスが連携を拒否したため、Android の送受信データをデバッグできません。

AndroidHttpClientまた、代わりに ofを使用する必要があるかどうかも疑問DefaultHttpClientに思いましたが、この場合は何も変わらないと思います。

前もって感謝します!

4

1 に答える 1

0

マキシムのコメントにより、何が問題なのかがわかりました。

これは、POST_PARAM_DEVICE_ID 定数内の愚かな小文字 1 文字でした。その値は「deviceId」でした (Web フォームのように「deviceID」である必要があります)。

開発者の皆さん、文字列キーを定義するときは注意してください。大文字と小文字が区別されます。

于 2013-01-20T09:54:52.050 に答える