2

私はAndroidでHTTPUrlConnectionを作成し、以下に示すように投稿用に準備しています

urlConnection = (HttpURLConnection) url.openConnection();

urlConnection.setRequestProperty("content-type", "application/json");
byte [] encoded = Base64.encode((username+":"+password).getBytes("UTF-8"), Base64.DEFAULT); 
//Basic Authorization               
urlConnection.setRequestProperty("Authorization", "Basic "+ new String(encoded, "UTF-8"));
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);

//This gets implicitly set when DoOutput is True, but still let it be               
urlConnection.setRequestMethod("POST");

//Required for POST not to return 404 when used on with a host:port combination
//http://stackoverflow.com/questions/5379247/filenotfoundexception-while-getting-the-inputstream-object-from-httpurlconnectio
urlConnection.setRequestProperty("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20100101 Firefox/17.0");
urlConnection.setRequestProperty("Accept","*/*");

次に、JSONを準備しOutputStream、接続のに書き込みます

JSONObject jsonObject = new JSONObject();
jsonObject.put("key1", "value1");
jsonObject.put("key2", "value2");



outputStreamWriter = urlConnection.getOutputStream ();
outputStreamWriter.write(jsonObject.toString().getBytes());


finally {
    if (outputStreamWriter != null) try { outputStreamWriter.close(); } catch (IOException logOrIgnore) {}
            }

リクエストを実行すると、サーバーが無効なjsonである空のPOSTデータを受信したため、ステータスが500になります。

同じことがウェブブラウザとカールからも機能します。GETは、同じパラメーターを使用してAndroidで動作します。私は何が欠けていますか?POSTリクエストのパラメータの設定方法に問題がありますか?

4

1 に答える 1

1

これを機能させることができました。以下のコードからのスニペット

送信するデータを作成し、必要なエスケープされた引用符に注意してください

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);

nameValuePairs.add(new BasicNameValuePair("\A\"", "\"/api/v1/a/1/\""));

nameValuePairs.add(new BasicNameValuePair("\"B\"", "\"/api/v1/b/1/\""));

nameValuePairs.add(new BasicNameValuePair("\"C\"", "\"Hello from Android\""));

クライアントを作成し、ヘッダーを設定します

HttpClient httpclient = new DefaultHttpClient();

HttpPost httppost = new HttpPost(urlToPost);

httppost.setHeader("content-type", "application/json");

Authorizationヘッダーの設定

String encoded = "Basic " + Base64.encodeToString((username+":"+password).getBytes("UTF-8"), Base64.URL_SAFE|Base64.NO_WRAP);

httppost.setHeader("Authorization",encoded);

データを文字列化し、POSTリクエストでHTTPパラメータとして設定します

StringEntity entity = new StringEntity(getQueryJSON(nameValuePairs));

httppost.setEntity(entity);

HttpResponse response = httpclient.execute(httppost);

if(response!=null){

InputStream in = response.getEntity().getContent(); //Get the data in the entity

readStream(in);

}

JSONを文字列にエンコードするユーティリティ関数 privateStringgetQueryJSON(List params)throws UnsupportedEncodingException

{

    StringBuilder result = new StringBuilder();

    boolean first = true;

    for (NameValuePair pair : params)

    {

    if (first){

        first = false;

        result.append("{");

    }else

        result.append(",");


    result.append(pair.getName());

    result.append(":");

    result.append(pair.getValue());


    }

    result.append("}");

    return result.toString();

}
于 2013-03-28T08:14:13.683 に答える