Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用with Reformation和RxJava/RxAndroid处理响应错误?_Java_Android_Retrofit_Rx Java_Rx Android - Fatal编程技术网

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

如何使用with Reformation和RxJava/RxAndroid处理响应错误?,java,android,retrofit,rx-java,rx-android,Java,Android,Retrofit,Rx Java,Rx Android,我很难解决如何使用改装和RxAndroid处理响应错误。如果出现网络错误或类似错误,将调用onError(),但我需要能够获得响应以检查是否存在身份验证错误。相反,我得到的是一个带有空字符串的令牌,我不知道为什么。最好的办法是什么 这是我现在的RxAndroid电话 Client.getInstance().getService() .getToken(usernameET.getText().toString(), passwordET.getText().to

我很难解决如何使用改装和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());
                }
            });
这是我的令牌类

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
07-01 06:38:04.562 1680-1793/uk.co.dyolo.thing D/改装﹕ ---> HTTP获取我的网站
07-01 06:38:04.562 1680-1793/uk.co.dyolo.thing D/改装﹕ ---> 结束HTTP(无正文)
07-01 06:38:04.610 1680-1793/uk.co.dyolo.thing D/改装﹕ 我找到了解决办法
首先,我扩展了我的令牌对象,使其具有错误属性

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()));
    }
if (e instanceof OnErrorThrowable){
    if (e.getCause() instanceof UserAuthenticationException){
        Log.d(TAG, "onError "+e.getCause().getMessage());
    }
    e.getCause().printStackTrace();
}
如果有错误,抛出一个自定义异常,调用订阅者
onError
,让我来处理它

if (token.getError() != null) {
    throw OnErrorThrowable.from(new UserAuthenticationException(token.getError()));
    }
if (e instanceof OnErrorThrowable){
    if (e.getCause() instanceof UserAuthenticationException){
        Log.d(TAG, "onError "+e.getCause().getMessage());
    }
    e.getCause().printStackTrace();
}

这有点晚了,但如果有人在这里闲逛,只要服务器返回错误代码超出[200300]间隔的请求,Reformation 2就会在
HttpException
实例中传递到
OneError
回调中

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

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

什么是
身份验证错误
?如果存在
200
以外的其他状态,改装的observable将发出错误。不幸的是,服务器没有给出状态代码。
{“错误”:“在数据库中找不到用户名”,“stacktrace”:null,“debuginfo”:null,“复制链接”:null}
是我得到的响应。服务器给你状态。状态代码是http
的一部分。啊,是的,我明白你的意思。服务器一定给了我一个
200
代码,这不是很有帮助。我想他是在暗示服务器给他发送了200。但是响应中包含错误字符串。在这种情况下,你真的不能ame改装。请模块所有者发送错误代码作为响应,如500等,或通过解析JSON并检查error!=null来自行处理。您能告诉我们您在RxJava链中添加的运算符是什么吗;)我正在做与您相同的事情,我想在某个地方分解错误检查。我目前正在使用g
.flatMap(…)
这不是很“漂亮”。@mithrop我相信我只是使用了一个map操作符,如果有错误,我抛出exeaption,否则,我只是返回了对象。所以在本例中,map。