2017-01-10 20 views
1

Retrofit2 + RxJavaを使用しています。私はリクエストサーバーが2つの応答Succesとエラーのいずれかを返すことができますが、どちらの場合もHTTP STATUS CODE = 200です。レスポンスボディでErronを取得すると、onEextを呼び出すonErrorが呼び出されます。Retrofit2エラー処理

Observable<CreateAuth> createAuthObservable = endApiServiceProvider.createAuth(phone); 
     Subscription subscription = createAuthObservable 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(createAuth -> { 
          hideProgress(); 
          successAuth(phone); 

         }, 
         throwable -> { 
          //todo correct handle error 
          hideProgress(); 
          if (throwable instanceof IOException) { 
           showError("Network error. Please check your internet connection"); 
          } 
         }); 

マイエンドポイントインターフェイス

@GET("/api/new.php") 
Observable<CreateAuth> createAuth(@Query("username") String uname); 

大成功応答(HTTPコード200)とCreateAuth.java POJO構造として

{ 
"val": true, 
"message": "Success!" 
} 

エラー応答(HTTPコード200)とErrorResponse.java以下以下のPOJO構造

{ 
    "error_type": "wrong_c", 
    "error_additional": "Illegal char in name!" 
} 
+0

Mann、200ステータスコードは、応答がOKであることを示します。この問題はリクエストの本文と関連している可能性があります。 –

+1

成功とエラー応答の両方でHTTP 200を受信した場合、Retrofitでは自動的にエラーが発生しません。 Retrofitに関する限り、その要求は成功した。返されたものを分析し、適切に処理する必要があります。たとえば、同じ基本クラスを拡張し、共通の 'isError'フラグを持つCreateAuthとErrorResponseの両方を持つ必要があります。または、エラー時に4xx応答を戻すようにエンドポイントを再構成します。 –

+0

@MichaelDodd、このような状況に対処できるインターセプタを書く方法はありますか? –

答えて

4

これはクライアントサイドのコードではなくサーバー側の問題だと思います。成功とエラーの両方の応答に対してHTTP 200が受信された場合、Retrofitで自動的にエラーがスローされません。 Retrofitに関する限り、その要求は成功した。

返された内容を分析し、サーバーの設定を同じに保つには適切に処理する必要があるため、成功とエラーの両方の応答を同じクラスに解析できる必要があります。

また、エラー時に4xx応答を返すようにエンドポイントを再設定してください。私はこのアプローチをお勧めします。