如何使用 Retrofit 和 RxJava/RxAndroid 处理响应错误?
How do I handle response errors using with Retrofit and RxJava/RxAndroid?
我无法弄清楚如何处理改造和 RxAndroid 的响应错误。 onError() 在出现网络错误或类似错误时被调用,但我需要能够获得响应以检查是否存在身份验证错误。相反,我得到的是一个带有空字符串的标记,我找不到原因。解决此问题的最佳方法是什么?
这是我目前的 RxAndroid 调用。
Client.getInstance().getService()
.getToken(usernameET.getText().toString(), passwordET.getText().toString())
.subscribe(new Subscriber<SiteInfo>() {
@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<Token> 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);
这是我的令牌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
我找到了解决办法
首先我扩展了我的 Token 对象有一个错误 属性。
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
。如果有错误,抛出一个自定义异常调用订阅者 onError
允许我处理它。
if (token.getError() != null) {
throw OnErrorThrowable.from(new UserAuthenticationException(token.getError()));
}
如果出现错误,抛出自定义异常调用订阅者 onError
允许我处理它。
if (e instanceof OnErrorThrowable){
if (e.getCause() instanceof UserAuthenticationException){
Log.d(TAG, "onError "+e.getCause().getMessage());
}
e.getCause().printStackTrace();
}
这有点晚了,但是如果有人在这里徘徊,Retrofit 2 会将 HttpException
的实例传递到 onError
回调中,只要从服务器返回的请求带有 [200,300 之外的错误代码) 区间 ...
throwable -> {
if(throwable instanceof HttpException){
switch(((HttpException)throwable).code()){
// your error handling logic
}
}
}
您还可以从此对象中检索整个响应..
我无法弄清楚如何处理改造和 RxAndroid 的响应错误。 onError() 在出现网络错误或类似错误时被调用,但我需要能够获得响应以检查是否存在身份验证错误。相反,我得到的是一个带有空字符串的标记,我找不到原因。解决此问题的最佳方法是什么?
这是我目前的 RxAndroid 调用。
Client.getInstance().getService()
.getToken(usernameET.getText().toString(), passwordET.getText().toString())
.subscribe(new Subscriber<SiteInfo>() {
@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<Token> 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);
这是我的令牌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
我找到了解决办法
首先我扩展了我的 Token 对象有一个错误 属性。
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
。如果有错误,抛出一个自定义异常调用订阅者 onError
允许我处理它。
if (token.getError() != null) {
throw OnErrorThrowable.from(new UserAuthenticationException(token.getError()));
}
如果出现错误,抛出自定义异常调用订阅者 onError
允许我处理它。
if (e instanceof OnErrorThrowable){
if (e.getCause() instanceof UserAuthenticationException){
Log.d(TAG, "onError "+e.getCause().getMessage());
}
e.getCause().printStackTrace();
}
这有点晚了,但是如果有人在这里徘徊,Retrofit 2 会将 HttpException
的实例传递到 onError
回调中,只要从服务器返回的请求带有 [200,300 之外的错误代码) 区间 ...
throwable -> {
if(throwable instanceof HttpException){
switch(((HttpException)throwable).code()){
// your error handling logic
}
}
}
您还可以从此对象中检索整个响应..