2017-01-10 29 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响应。我会推荐这种方法。