android retrofit 單獨處理返回狀態碼204以及統一處理特殊返回碼比如401
阿新 • • 發佈:2018-12-11
返回狀態碼比如401,一般表示身份無效,比如token失效之類的,這個時候就需要呼叫介面重新整理token,
肯定不能在每個介面請求回撥那裡去重新整理,要是一個APP有幾百個介面不是很麻煩嗎,那麼retrofit怎麼攔截這個
401做統一處理呢,直接上程式碼:
Interceptor tokenInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Response response = chain.proceed(request); // 對返回code統一攔截 if (response != null) { if (response.code() == ResultCode.ACCESS_TOKEN_EXPIRED.getCode()) { } else if (response.code() == ResultCode.SUCCESS_NO_RESPONSE.getCode()) { } } return response; } }; OkHttpClient client = new OkHttpClient.Builder() .retryOnConnectionFailure(true) // 是否重試 .connectTimeout(10, TimeUnit.SECONDS) // 連線超時事件 .addNetworkInterceptor(tokenInterceptor) // 自動附加 token //.authenticator(authenticator) // 認證失敗自動重新整理token .addInterceptor(interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)) .build(); retrofit = new Retrofit.Builder() .baseUrl(APIConfig.getUserAPIHost()) .client(client) .addConverterFactory(GsonConverterFactory.create(GSON)) .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io())) .build();
第7行開始就可以根據返回的狀態碼來做自己想要的事情了
我們知道返回狀態碼200系列都算是成功的,但是比如遇到204呢,也是成功但無返回值,那麼我們該如何處理呢?
這種情況是個別請求才會遇到的,所以就不統一處理了,在發起請求程式碼處處理就可以了,直接看程式碼吧:
@PUT(Constant.METHOD_PASSWORD_MODIFY) @FormUrlEncoded Flowable<Response<Void>> fetchModifyPassword(@Query("access_token") String accessToken, @Field("pwd") String password); private void fetchModifyPassword(String passwordTwo) { UserRetrofit.api().fetchModifyPassword(UserUtils.getAccessToken(), passwordTwo) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<Response>() { @Override public void accept(@NonNull Response result) { Toast.makeText(getContext(), "修改密碼成功", Toast.LENGTH_LONG).show(); getActivity().onBackPressed(); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { throwable.printStackTrace(); } }); }
第3、8行,看懂了吧,這裡解析就不要用我們寫的實體類了,直接用retrofit提供的實體Response<Void>
好了,又可以愉快玩耍了