如何使用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 } } }
您还可以从此对象中检索整个响应..