2017-01-10 57 views
1

我正在使用Retrofit2 + RxJava。當我讓請求服務器可以返回兩個響應成功和錯誤之一,但在這兩種情況下,HTTP狀態代碼= 200.如何實現,當我在響應身體Erron而不是調用onNext調用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); 

SUCCES響應(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狀態碼錶示響應正常。這個問題可能與請求主體有關。 –

+1

如果您收到成功和錯誤響應的HTTP 200,那麼這不會在Retrofit中自動拋出錯誤。就Retrofit而言,這項要求是成功的。您需要分析返回的內容並對其進行適當的處​​理,例如,CreateAuth和ErrorResponse都擴展了相同的基類並具有一個共同的「isError」標誌。或者,重新配置您的端點以在錯誤時返回4xx響應。 –

+0

@MichaelDodd,有什麼辦法可以編寫攔截器來處理這種情況嗎? –

回答

4

我想說這是服務器端問題,而不是客戶端代碼的問題。您會收到成功和錯誤響應的HTTP 200,然後這不會在Retrofit中自動拋出錯誤。就Retrofit而言,這項要求是成功的。

如果你想保持你的服務器配置相同,你需要分析返回的內容並進行適當的處​​理,因此成功和錯誤響應必須能夠解析到同一個類中。

或者,重新配置您的端點以在出錯時返回4xx響應。我會推薦這種方法。