2016-08-30 15 views
4

私はネットワークコールのためにAndroidクライアントにokhttpを実装しました。okhttp get failure response

エラー応答を取得すると、エラーコードとメッセージに関連するテキストがメッセージとして表示されますが、サーバーが送信するカスタムエラー応答は表示されません。 実装されたコードの私の失敗の応答で私が得るメッセージはちょうど "悪い要求"です。

ブラウザからの同じ応答は次のとおりです。 enter image description here

サーバーから返されたエラーメッセージはどうすればわかりますか?

私のコードは

private void executeCall(Request request, final ResponseListener listener) { 
     mOKHttpClient.newCall(request) 
        .enqueue(new Callback() { 
         @Override 
         public void onFailure(Call call, IOException e) {        
          postFailure(listener, (String) call.request() 
                   .tag(),e.toString()); 
         } 

         @Override 
         public void onResponse(Call call, final Response response) throws IOException { 
          if(response.isSuccessful()) { 
           String responseString = response.body().string();         
           postSuccess(listener, (String)call.request().tag(), responseString); 
          } 
          else {         
           postFailure(listener, (String)call.request().tag(),response.code()+","+response.message()); 
          } 
         } 
        }); 
    } 

ここで障害が発生した場合の私の応答です。 enter image description here

+0

リクエストがサーバーに失敗したときには可能かもしれない失敗を送信コード400となっているため、あなたには悪い要求が表示されています。したがって、失敗応答でもステータス200とメッセージを設定する必要があります。サーバからの応答を受け取ります。 – Vickyexpert

答えて

3

response.message()がHTTPステータスメッセージを返すので、エラー応答をbody()で捕捉する必要があります。

は、あなたが提供するスクリーンショットでは:

ステータスは、あなたのケースではBad RequestですHTTPステータスメッセージのためのあなたのケースで400response.message()でHTTPステータスコードのためresponse.code()ようOkHttpで分解されます。

応答の本体(成功または失敗)はresponse.body()です。 Stringとしたい場合は、response.body().string()に電話してください。

あなたが応答からMessageオブジェクトを読みたいので、次のように実行しよう:コメントを1として

@Override 
public void onResponse(Call call, final Response response) throws IOException { 
    if(response.isSuccessful()) { 
     String responseString = response.body().string();         
     postSuccess(listener, (String)call.request().tag(), responseString); 
    } 
    else {    
     String errorBodyString = response.body().string();     
     postFailure(listener, (String)call.request().tag(),response.code()+","+errorBodyString); 
    } 
} 

JSONObject = new JSONObject (response.body().string()); 
String messageString =object.getString("Message"); 
+0

response.body.string()はokhttp3.internal.httpのようなものを返します。 RealResponseBody @ 528ae030 – ViVekH

+0

いいえ、 'response.body'はそれをあなたに与えません。そしてそれは明らかに記憶の参照を見ます。再度検査し、 'response.body()。string()'を呼び出すことを試みてください。 –

+0

私は同じことを返しました、なぜ私は考え出しました。 私は、JSONオブジェクトとしてアクセスしなければならなかった、 が更新されたコード http://pastebin.com/Lp7eBnb2 を参照してくださいも このSOポストは私が http://stackoverflow.com/a/36857049/3518278をそれを把握する助け あなたの回答を更新しましたil accept it。 – ViVekH