如何使用Retrofit和RxJava / RxAndroid处理响应错误?

我无法通过改造和RxAndroid来解决如何处理响应错误的问题。 如果出现网络错误等,则调用onError(),但我需要能够获得响应以检查是否存在身份validation错误。 相反,我得到的是一个带有空字符串的令牌,我找不到原因。 最好的方法是什么?

这是我目前的RxAndroid电话。

Client.getInstance().getService() .getToken(usernameET.getText().toString(), passwordET.getText().toString()) .subscribe(new Subscriber() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { e.printStackTrace(); } @Override public void onNext(SiteInfo siteInfo) { Log.d(TAG, "onNext "+ token.toString()); } }); 

这是我的改造服务

 @GET("my_url_here") Observable getToken( @Query("username") String username, @Query("password") String password ); 

这是我当前的restadapter

 RestAdapter restAdapter = new RestAdapter.Builder() .setLogLevel(RestAdapter.LogLevel.FULL) .setEndpoint(BASE_URL) .build(); service = restAdapter.create(MyService.class); 

这是我的令牌课程。

 public class Token { private String token; public String getToken() { return token; } public void setToken(String token) { this.token = token; } @Override public String toString() { return token; } } 

我该怎么办呢? 它可以在RxAndroid部分完成,还是我需要向RestClient添加一些东西或者完全不需要其他东西?

谢谢。

编辑

 07-01 06:38:04.562 1680-1793/uk.co.dyolo.thing D/Retrofit﹕ ---> HTTP GET my_website_here 07-01 06:38:04.562 1680-1793/uk.co.dyolo.thing D/Retrofit﹕ ---> END HTTP (no body) 07-01 06:38:04.610 1680-1793/uk.co.dyolo.thing D/Retrofit﹕ <--- HTTP 200 my_website_here (48ms) 07-01 06:38:04.610 1680-1793/uk.co.dyolo.thing D/Retrofit﹕ : HTTP/1.1 200 OK 

我找到了解决方案

首先,我将令牌对象扩展为具有错误属性。

 public class Token { private String token; private String error; public String getToken() { return token; } public void setToken(String token) { this.token = token; } public String getError() { return error; } public void setError(String error) { this.error = error; } @Override public String toString() { return token; } } 

然后我在我的RxJava链中添加了一个运算符,它可以检查错误字段是否为null 。 如果有错误,抛出一个自定义exception,调用订阅者onError允许我处理它。

 if (token.getError() != null) { throw OnErrorThrowable.from(new UserAuthenticationException(token.getError())); } 

如果有错误,抛出一个自定义exception,调用订阅者onError允许我处理它。

 if (e instanceof OnErrorThrowable){ if (e.getCause() instanceof UserAuthenticationException){ Log.d(TAG, "onError "+e.getCause().getMessage()); } e.getCause().printStackTrace(); } 

这有点晚了但是如果有人在这里徘徊,只要从服务器返回的请求在[200,300]间隔之外的错误代码,Retrofit 2就会将HttpException实例传递给onError回调…

 throwable -> { if(throwable instanceof HttpException){ switch(((HttpException)throwable).code()){ // your error handling logic } } } 

您还可以从此对象中检索整个响应..