在微信登錄時會遇到著這樣的問題饲握,獲取access_token馍管,獲取用戶信息userinfo象泵,然后拿著獲取到的用戶信息去執(zhí)行自己的的登錄抡诞。三個請求都是拿著上一個請求的結(jié)果去執(zhí)行請求,如果分開寫秤朗,過于麻煩煤蹭。Rxjava Retrofit 可以很好的解決這個問題。
廢話不多說取视,直接上代碼:
三個api
WxApi.class的內(nèi)容
@GET("https://api.weixin.qq.com/sns/oauth2/access_token")
public? Observable getToken(@Query("appid") String appid,
????????????????????????????????????????????????@Query("secret") String secret,
????????????????????????????????????????????????@Query("code") String code,
????????????????????????????????????????????????@Query("grant_type") String grant_type);
@GET("https://api.weixin.qq.com/sns/userinfo")
public Observable getUseInfo(@Query("access_token") String access_token,
????????????????????????????????????????????????@Query("openid") String openid);
????????????????????????????????????????????????@FormUrlEncoded
@POST("http://api.dev.myapi.cn/login/wx/")
Observable MyLogin(@Field(encoded =true,value ="userinfo") String userinfo);
下面是請求邏輯代碼:
?Retrofit.Builder retrofit =newRetrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(StringConverterFactory.create())? ? //添加了一個String轉(zhuǎn)換器硝皂,因為這個過程string用著比較方便
.baseUrl("https://api.weixin.qq.com/sns/");? ? //添加baseUrl,api中又寫全了為什么呢作谭,后面會講
OkHttpClient.Builder mBuilder =newOkHttpClient.Builder();//用okhttp去請求
HttpLoggingInterceptor loggingInterceptor =newHttpLoggingInterceptor();? ? //請求日志
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
mBuilder.addInterceptor(loggingInterceptor);
finalWxApi api = retrofit.client(mBuilder.build()).build().create(WxApi.class);
Observable observable = api.getToken(AppConstant.WX_APP_ID, AppConstant.WX_APP_SECRET, code,"authorization_code");
observable
? ? ? ? ? ? ? ? ? ?.subscribeOn(Schedulers.io())
????????????????????.observeOn(Schedulers.io())//設(shè)定第一次請求結(jié)果放在io線程并同時執(zhí)行第二次? ? ? ?????????????????請求
????????????????????.flatMap(newFunc1<String,Observable<String>>() {
????????????????????@Override
????????????????????publicObservable call(String s) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? //拿到第一次請求結(jié)果稽物,從string中取到access_token和 openid
? ? ? ? ? ? ? ? ? ? ? ? ? ? //執(zhí)行第二次請求
????????????????????????????return api.getUseInfo(access_token, openid);
? ? ? ? ? ? ? ? ? ? }
????????????????????})
????????????????????.observeOn(Schedulers.io())//設(shè)定第三次請求結(jié)果放在io線程并同時執(zhí)行次? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 自己的登錄請求
????????????????????.flatMap(newFunc1<String,Observable<String>>() {
????????????????????????????@Override
????????????????????????????publicObservable call(String s) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //拿到微信返回的用戶信息去執(zhí)行自己服務(wù)端的登錄請求
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return api.MyLogin(s);
????????????????????????????}
????????????????????})
????????????????????.observeOn(AndroidSchedulers.mainThread())
????????????????????.subscribe(newBaseObserver() {
? ? ? ? ? ? ? ? ? ? ?@Override
????????????????????public void onNext(String s) {
? ? ? ? ? ? ? ? ? ? ? ? ?????super.onNext(s);
? ? ? ? ? ? ? ? ? ? ? ? ? ? //自己的登錄請求結(jié)果
????????????????????}
????????????????????@Override
????????????????????public void onCompleted() {
????????????????????????????????super.onCompleted();
????????????????????}
????????????????????});
以上就是三次請求依次執(zhí)行的邏輯代碼,猶豫微信登錄與自己api登錄的baseUrl不一樣折欠,所以在設(shè)定baseUrl的同時贝或,api用的是全部的url地址,當在WxApi設(shè)定全部的url地址時可以覆蓋baseUrl锐秦,但如果不設(shè)定baseUrl咪奖,直接用的話,請求不成功酱床,這個需要注意羊赵。