2017-01-08 1 views
0

私のサーバーのような、すべての要求のための基本的なJSONの構造体を返します。successが真または偽とすることができ、データはアプリが必要になる場合がありますデータへerrorsから、物事の数を返すことができRetrofitでエラーを処理する方法は?

{ 
    "success": false, 
    "data": { 
     "errors": { 
      "email": [ 
       "This is not an email." 
      ], 
      "password": [ 
       "The password must be at least 6 characters." 
      ] 
     } 
    } 
} 

Retrofitを使用してこの応答(成功とエラーの両方)を処理するにはどうすればよいですか?

Retrofit APIコールを変更/追加する必要があるのは何ですか?

Call<BasicResponse> call = apiService.login(emailString, passwordString); 
call.enqueue(new Callback<BasicResponse>() { 
    @Override 
    public void onResponse(Call<BasicResponse> call, Response<BasicResponse> response) { 
     // 
    } 

    @Override 
    public void onFailure(Call<BasicResponse> call, Throwable t) { 
     // 
    } 
}); 

答えて

0

あなたのモデルで作業することをお勧めします。ここにはいくつかのオプションがありますが、最終的にはAPIの応答コードとモデルの構造について説明します。

最初にモデルを外しましょう。エラーのあるオブジェクトを処理できる方法の1つは、これをモデルのフィールドとして含めることです。

"data": { 
    "errors": { 
     "email": [ 
      "This is not an email." 
     ], 
     "password": [ 
      "The password must be at least 6 characters." 
     ] 
    } 
} 

"errors": { 
     "email": [ 
      "This is not an email." 
     ], 
     "password": [ 
      "The password must be at least 6 characters." 
     ] 
    } 

は今、あなたはJSONオブジェクトを表現するデータオブジェクトを持っていると言う:これはエラーがあなたのJSONにオブジェクトを表し

public class Errors { 
    // ... 
} 

:あなたはエラーオブジェクトを持っていると言いますあなたは簡単に次のようなことができます:

public class Data { 
    @SerializedName("success") 
    @Expose 
    private boolean success; 
    @SerializedName("errors") 
    @Expose 
    private Errors errors; 
    // Here you can then add other models, i.e: 
    // @SerializedName("user") 
    // @Expose 
    // private User user; 
} 

ご覧のとおり、残りのモデルをDataオブジェクトに追加することができます。応答が成功すると、errorsはヌルになり、successになります。応答がうまくいかない場合は、反対のシナリオがあります。これを確認する詳細およびその他の方法については、answerを確認できます。

ここで、エラー応答を処理する部分について説明します。

コールが成功した場合は、onResponseコールで終了します。つまり、オブジェクトとのやりとりを開始する前に、Data.successの値をチェックする必要があります。 false フィールドにアクセスしてNullPointerExceptionを生成せずにアクセスでき、trueのデータが正しく取得されていることがわかっている場合は、

onFailureは、ソケットのタイムアウトの例に例外がある場合、または要求をシリアル化してデシリアライズする場合にのみ呼び出されます。

+0

'onFailure'コールバックが受け入れるエラーコードは何ですか?今のところ私のサーバはエラーがあれば '400'で応答しますが、' onResponse'コールバックで処理します。 –

+0

私は謝罪しましたが、2x http以外のすべてのステータスに対して "onFailure"を呼び出すという印象を受けましたが、実際には "onResponse"を呼び出します。実際に通話を成功させるので、すべてのステータスコードに対してこれを行います。私は私の答えを編集します。 – Fred

関連する問題