3

レトロフィットと RxAndroid で応答エラーを処理する方法がわかりません。onError() は、ネットワーク エラーなどが発生した場合に呼び出されますが、認証エラーが発生したかどうかを確認するために応答を取得できるようにする必要があります。代わりに、null String を持つトークンが取得され、その理由がわかりません。これについて最善の方法は何ですか?

これは現時点での私の 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
4

2 に答える 2

3

私は解決策を見つけました

まず、トークン オブジェクトを拡張してエラー プロパティを設定しました。

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();
}
于 2015-07-01T11:12:10.930 に答える