【发布时间】:2023-03-15 00:51:01
【问题描述】:
我无法确定如何使用改造和 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 = 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
【问题讨论】:
-
什么是
authentication error?如果状态不是200,则 Retrofit 的 observable 会发出错误。 -
不幸的是,服务器没有给出状态码。
{"error":"The username was not found in the database","stacktrace":null,"debuginfo":null,"reproductionlink":null}是我得到的回复。 -
服务器为您提供状态。状态码是
http的一部分。 -
啊,是的,我明白你的意思。那么服务器必须给我一个
200代码,这不是很有帮助。 -
我认为他是在暗示服务器向他发送 200。但响应包含错误字符串。在那种情况下,你真的不能为此责怪改造。要求模块所有者发送错误代码作为响应,例如 500 等,或者通过解析 JSON 并检查是否 error!=null 自行处理。
标签: java android retrofit rx-java rx-android