• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Retrofit的嵌套请求和适配器

武飞扬头像
APDL_10
帮助1

Retrofit中的嵌套请求

在实际开发中,可能会存在需要先请求A接口,再去请求B接口的情况。比如需要请求获取收藏文章列表,但是需要先登录拿到Cookie才能请求收藏文章列表接口,此时请求就有了先后顺序,使用RxJava 3进行嵌套请求。


Retrofit中的适配器

Retrofit的接口方法返回类型必须是Call,如果能够将Call改为RxJava中的Observable,对于嵌套的情况,就能得到非常方便优雅的解决,这就是适配器的功能,适配器就能够帮助我们转换为其他类型。


嵌套请求:即用户想要获取收藏的文章,就要先登录、再获取。在代码实现就是先进行login登陆,成功后再获取对应信息。

进入wanandroid API开放平台 玩Android 开放API-玩Android - wanandroid.com,使用里面的登录接口为:

https://www.wanandroid.com/user/login 方法:POST 参数: username,password

获取收藏文章接口为:

https://www.wanandroid.com/lg/collect/list/0/json 方法:GET 参数: 页码:拼接在链接中,从0开始。


依赖添加:

  1.  
    implementation("com.squareup.retrofit2:adapter-rxjava3:2.9.0")
  2.  
     
  3.  
    implementation("io.reactivex.rxjava3:rxandroid:3.0.0")

第一步:根据Http接口创建Java接口

  1.  
    import io.reactivex.rxjava3.core.Flowable;
  2.  
    import okhttp3.ResponseBody;
  3.  
    import retrofit2.http.Field;
  4.  
    import retrofit2.http.FormUrlEncoded;
  5.  
    import retrofit2.http.GET;
  6.  
    import retrofit2.http.POST;
  7.  
    import retrofit2.http.Path;
  8.  
     
  9.  
    public interface WanAndroidService2 {
  10.  
    //登录
  11.  
    @POST("user/login")
  12.  
    @FormUrlEncoded
  13.  
    Flowable<BaseResponse> login2(@Field("username") String username, @Field("password") String pwd);
  14.  
     
  15.  
    //获取收藏文章列表
  16.  
    @GET("lg/collect/list/{pageNum}/json")
  17.  
    Flowable<ResponseBody>getArticle(@Path("pageNum") int pageNum);
  18.  
     
  19.  
    }
学新通

第二步:配置RxJava适配器,嵌套请求

  1.  
    Retrofit retrofit=new Retrofit.Builder()
  2.  
    .baseUrl("https://www.wanandroid.com")
  3.  
    //传递一个okp,才能实现cookie
  4.  
    .callFactory((Call.Factory) new OkHttpClient.Builder()
  5.  
    .build())
  6.  
    .addConverterFactory(GsonConverterFactory.create())//添加转换器
  7.  
    .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) //添加适配器
  8.  
    .build();
  9.  
    WanAndroidService2 wanAndroidService2=retrofit.create(WanAndroidService2.class);
  10.  
     
  11.  
    @Test
  12.  
    public void rxjavaTest() {
  13.  
    //发送登录请求
  14.  
    wanAndroidService2.login2("dll", "dl666666")
  15.  
    //根据login2继续生成一个Publisher,Publisher返回一个请求文章列表
  16.  
    .flatMap(new Function<BaseResponse, Publisher<ResponseBody>>() {
  17.  
    @Override
  18.  
    public Publisher<ResponseBody> apply(BaseResponse baseResponse) throws Throwable {
  19.  
    System.out.println(baseResponse.toString());
  20.  
    return wanAndroidService2.getArticle(0);//请求获取收藏文章列表
  21.  
    }
  22.  
    })
  23.  
    //网络请求切换到一个单独的子线程
  24.  
    .observeOn(Schedulers.io())
  25.  
    //Schedulers.newThread:总是启用新线程,并在新线程执行操作
  26.  
    //在Android中则改为在Android主线程:.subscribeOn(AndroidSchedulers.mainThread())
  27.  
    .subscribeOn(Schedulers.newThread())
  28.  
    //返回结果的回调
  29.  
    .subscribe(new Consumer<ResponseBody>() {//返回值就是ResponseBody
  30.  
    @Override
  31.  
    public void accept(ResponseBody responseBody) throws Throwable {
  32.  
    System.out.println(responseBody.string());
  33.  
    }
  34.  
    });
  35.  
    while (true){}//先让他阻塞,不然jvm就会退出
  36.  
     
  37.  
    }
学新通

适配器的JAVA对象

第三步:配置Cookie(获取收藏文章列表之前必须登录,我们这里把登录信息缓存在本地内存中)

  1.  
    //构建一个map对象,把请求存储在缓存中
  2.  
    Map<String, List<Cookie>> cookies=new HashMap<>();
  3.  
     
  4.  
    Retrofit retrofit=new Retrofit.Builder()
  5.  
    .baseUrl("https://www.wanandroid.com")
  6.  
    //传递一个okp,才能实现cookie
  7.  
    .callFactory((Call.Factory) new OkHttpClient.Builder()
  8.  
    .cookieJar(new CookieJar() {
  9.  
    //保存的数据
  10.  
    @Override
  11.  
    public void saveFromResponse(@NotNull HttpUrl httpUrl, @NotNull List<Cookie> list) {
  12.  
    //存入请求的数据
  13.  
    cookies.put(httpUrl.host(),list);
  14.  
    }
  15.  
    //传递请求的接口
  16.  
    @NotNull
  17.  
    @Override
  18.  
    public List<Cookie> loadForRequest(@NotNull HttpUrl httpUrl) {
  19.  
    //拿到所有请求的数据
  20.  
    List<Cookie> cookies = RetrofitTest2.this.cookies.get(httpUrl.host());
  21.  
    return cookies==null?new ArrayList<>() : cookies;
  22.  
    }
  23.  
    }).build())
  24.  
    .addConverterFactory(GsonConverterFactory.create())//添加转换器
  25.  
    .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) //添加适配器
  26.  
    .build();
  27.  
    WanAndroidService2 wanAndroidService2=retrofit.create(WanAndroidService2.class);
  28.  
     
  29.  
     
  30.  
     
  31.  
     
  32.  
    @Test
  33.  
    public void rxjavaTest() {
  34.  
    //发送登录请求
  35.  
    wanAndroidService2.login2("dll", "dl666666")
  36.  
    //根据login2继续生成一个Publisher,Publisher返回一个请求文章列表
  37.  
    .flatMap(new Function<BaseResponse, Publisher<ResponseBody>>() {
  38.  
    @Override
  39.  
    public Publisher<ResponseBody> apply(BaseResponse baseResponse) throws Throwable {
  40.  
    System.out.println(baseResponse.toString());
  41.  
    return wanAndroidService2.getArticle(0);//请求获取收藏文章列表
  42.  
    }
  43.  
    })
  44.  
    //网络请求切换到一个单独的子线程
  45.  
    .observeOn(Schedulers.io())
  46.  
    //Schedulers.newThread:总是启用新线程,并在新线程执行操作
  47.  
    //在Android中则改为在Android主线程:.subscribeOn(AndroidSchedulers.mainThread())
  48.  
    .subscribeOn(Schedulers.newThread())
  49.  
    //返回结果的回调
  50.  
    .subscribe(new Consumer<ResponseBody>() {//返回值就是ResponseBody
  51.  
    @Override
  52.  
    public void accept(ResponseBody responseBody) throws Throwable {
  53.  
    System.out.println(responseBody.string());
  54.  
    }
  55.  
    });
  56.  
    while (true){}//先让他阻塞,不然jvm就会退出
  57.  
     
  58.  
    }
学新通

首先用户还是需要保存状态,用cookie来存储状态,用于获取文章时不会出现请登录等问题。 retrofit创建就需要cookie、gson以及适配器配置。

在实际调用就按代码流程,flatMap获取登陆后具体需要的内容,subscribe中的accept就是如何处理获取到的内容。

注意:在java测试环境中subscribeOn(Schedulers.newThread())用新线程,而在安卓开发中需要subscribeOn(AndroidSchedulers.mainThread())

适配器起到的作用是将接口中的方法返回值不限制于call,使其更加灵活。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfiibbe
系列文章
更多 icon
同类精品
更多 icon
继续加载