3

私の Web サーバーは 422 unprocessable entity エラーで応答し、エラーのリストを含む json 応答をレンダリングします。

{"name":["has already been taken"]}

何らかの理由で、My android アプリは、応答に json が含まれていることを認めることを拒否しています。

HttpResponse response = HttpRequest.httpPostJSONObject(this, Urls.getUrlForAccountTeams(this), tm.getJsonObject(), token);
int code = response.getStatusLine().getStatusCode();
if (code == 422){
    String responseJson = EntityUtils.toString(response.getEntity());
    JSONObject responseEntity = new JSONObject(responseJson);
    Log.i(TAG, "Created account errors " + responseEntity.toString());
}

上記のログ メッセージからの次の出力は、

I/ServiceRefreshData(  780): Server response 422
I/ServiceRefreshData(  780): Created account errors {}

Androidアプリが送信しているのとまったく同じメッセージを投稿することでcurlを使用してこれをエミュレートすると、上記のようにjsonが取得され{"name":["has already been taken"]}、これはまさにAndroidアプリで期待しているものです

json を取得する方法についてのアイデア。成功したjson応答の解析に問題はありません

json を送信するリクエストは、post リクエストの結果に org.apache.http.HttpResponse を使用します

    public static HttpResponse httpPostJSONObject(Context context, String url, JSONObject data, String token) throws ClientProtocolException, IOException{
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        setHeaders(httppost, token);
        StringEntity se = new StringEntity(data.toString());

        httppost.setEntity(se);
        return httpclient.execute(httppost);
    }

UPDATEさらに明確にするために、私のsetHeadersメソッドは次のようになります

private static void setHeaders(HttpRequestBase httpget, String token) {
    httpget.addHeader("Accept", "application/json");
    httpget.addHeader("Content-Type", "application/json; charset=UTF-8");
    if(token != null){
        httpget.addHeader("Authorization", "Token token="+token);
    }
}

完全を期すために、このjsonを生成している私のWebサーバー(Rails 3.2.12)のコードは

respond_to do |format|
  if @team.save
    format.html { redirect_to @team, notice: 'Team was successfully created.' }
    format.json { render json: @team, status: :created, location: [:api, @team] }
  else
    format.html { render action: "new" }
    format.json { render json: @team.errors, status: :unprocessable_entity }
  end
end

コメントごとにデバッグ情報を追加して更新ログメッセージを変更した結果、データを送信する方法は次のようになります

        try {
            HttpResponse response = HttpRequest.httpPostJSONObject(this, Urls.getUrlForAccountTeams(this), tm.getJsonObject(), token);
            int code = response.getStatusLine().getStatusCode();
            Log.i(TAG, "Server response " + code);
            if (code == 422){
                String responseJson = EntityUtils.toString(response.getEntity());
                JSONObject responseEntity = new JSONObject(responseJson);
                Log.i(TAG, "Created account errors Response Entity " + responseEntity.toString());
                Log.i(TAG, "Created account errors Response " + response.toString());
                Log.i(TAG, "Created account errors ResponseJson " + responseJson.toString());
            }
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

そして生産する

I/ServiceRefreshData(  814): Server response 422
I/ServiceRefreshData(  814): Created account errors Response Entity {}
I/ServiceRefreshData(  814): Created account errors Response org.apache.http.message.BasicHttpResponse@44ec4978
I/ServiceRefreshData(  814): Created account errors ResponseJson {}
4

2 に答える 2

0

さて、次のようなヘッダーを指定する必要があると思います:

HttpPost httppost = new HttpPost(url);
httppost.setHeader("Accept", "application/json");
httppost.setHeader("Content-type", "application/json");
于 2013-02-26T16:06:42.197 に答える
0

PC を再起動した後、問題は解消されました。私はこのエピソード全体に本当に困惑しています。私は自分のコードが正しいと確信していましたが、ログ出力はそうではないことを証明していました。これは、まったく計り知れないキャッシングの問題に帰することしかできません。

助けてくれた人たちに感謝します。

于 2013-02-26T17:43:46.143 に答える