简体   繁体   English

响应为 400 错误时,Retrofit2 崩溃

[英]Retrofit2 crashed when response is 400 error

i'm using retrofit2 and Rxjava我正在使用 retrofit2 和 Rxjava

the crash occured when application recieved 400 error code response but i don't know where to handling error当应用程序收到 400 错误代码响应时发生崩溃,但我不知道在哪里处理错误

interface "IMyService"接口“IMyService”

@POST("api/account/signin")
@FormUrlEncoded
io.reactivex.Observable<String> login(@Field("email") String email,
                                                   @Field("password") String password);

Retrofit Client Retrofit客户端

i add some interceptor for cookie but without interceptor, results are same我为cookie添加了一些拦截器,但没有拦截器,结果是一样的

public class RetrofitClient {
    
    private static Retrofit instance = null;
    
    public static Retrofit getInstance(Context context) {
        AddCookiesInterceptor in1 = new AddCookiesInterceptor(context);
        ReceivedCookiesInterceptor in2 = new ReceivedCookiesInterceptor(context);
        
        OkHttpClient okHttpClient = new OkHttpClient.Builder ()
                .addNetworkInterceptor(in1)
                .addInterceptor(in2)
                .build ();

        if (instance==null) {
            instance = new Retrofit.Builder()
                    .baseUrl("http://192.168.0.31:3070/")
                    .client(okHttpClient)
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
        }
        return instance;
    }
}

Retrofit, Rxjava Retrofit,Rxjava

Retrofit retrofitClient = RetrofitClient.getInstance(this);
iMyService = retrofitClient.create(IMyService.class);

compositeDisposable.add(iMyService.login(email, password)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String response) throws Exception {
                         //....
           }));

where can i handling error for 400 response?我在哪里可以处理 400 响应的错误?

and error和错误

Caused by: retrofit2.adapter.rxjava2.HttpException: HTTP 401 Unauthorized
    at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:54)
    at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)
    at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)
    at io.reactivex.Observable.subscribe(Observable.java:10981)
    at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
    at io.reactivex.Observable.subscribe(Observable.java:10981)

sorry for my english skill对不起我的英语能力

try:尝试:

compositeDisposable.add(iMyService.login(email, password)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        new Consumer<String>() {
                            @Override
                            public void accept(String response) throws Exception {
                                //....
                            }
                        },
                        new Consumer<Throwable>() {
                            @Override
                            public void accept(Throwable throwable) throws Exception {
                                // handle the error here
                                Log.e("LOGIN_ERROR", "", throwable);
                                if ((throwable instanceof HttpException && ((HttpException) throwable).code() == 401)
                                || (throwable.getCause() instanceof HttpException && ((HttpException) throwable.getCause()).code() == 401)) {
                                    // handle 401 error specifically
                                }
                            }
                        });

Your API is returning an error to your Observable and your code snipppet does not have the Rx error handler implemented hence the crash.您的 API 正在向您的 Observable 返回一个错误,并且您的代码片段没有实现 Rx 错误处理程序,因此发生了崩溃。 You can change it to something like this:你可以把它改成这样:

compositeDisposable.add(iMyService.login(email, password)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Void>() {
                 @Override
                 public void onCompleted() {
                 // May be ignored
                 }

                 @Override
                 public void onError(Throwable error) {
                 // check error type and handle here
                 if (error instanceof HttpException) // handle all kinds of Http errors
                 }

                 @Override
                 public void onNext(String response) {
                 // consume results
                 }
             });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM