Retrofit的深入使用

作者: WangJie0822 | 来源:发表于2016-12-07 11:01 被阅读787次
image.png

前言


  • 在之前一篇文章中,我给大家介绍了Retrofit+RxJava搭建网络请求,并进行了简单的封装(没看过的童鞋可以点这里的链接跳转 Android中用Retrofit+Rxjava搭建网络请求 )。但是,如果你认为这样就足够了的话,那么你就错了,要想在项目中使用好Retrofit,还有很多地方需要学习的。

动态Url


  • 在之前的示例中大家可能已经发现,使用Retrofit定义接口的时候,请求url是在@GET、@POST注解后面的:
public interface RXApi{
    @GET("/url")
    Call<T> doSomething();
}
  • 但是,在我们的实际项目中不可能所有接口url都是固定的,在笔者的项目中就有这种需求,要根据服务器返回的url来获取相关数据,在这个时候,使用上面的方式无疑是不可能的。在这个时候,我们就要用到Retrfit提供的一个@Url借口,这样就能动态的设置url:
public interface RXApi{
    @GET // 在使用@Url注解时,@GET、@POST注解之后是没有url参数的
    Call<T> doSomething(@Url String url); // Retrofit会请求这里的url
}
  • 在封装Retrofit的时候,我们设置了baseUrl,在请求网络的时候,@GET注解后面的url会拼接到baseUrl后面,但是,如果我们请求的url地址和baseUrl不同呢?这里就要说到Retrofit请求url的使用了。
  • 在配置baseUrl的时候,url都是以 "https://" 或者 "http://" 作为开头的,那么在定义接口的时候,或者使用动态url的时候,如果url有scheme 即以"https://" 或者 "http://" 作为开头,那么就会以设置的参数作为地址请求数据,否则,会将参数拼接到baseUrl后作为地址请求数据:
public interface RXApi{
    /* baseUrl = "http://www.baidu.com/" */

    @GET("tieba") // 这里请求的地址是:http://www.baidu.com/tieba
    Call<T> getData();
    
    @GET("http://www.qq.com") // 这里请求的地址是:http://www.qq.com
    Call<T> getData(); 
}
  • 使用动态url的时候也遵循同样的规律

中文乱码


  • 虽然说,现在的项目都是使用UTF-8的编码格式,但是,在使用Retrofit的过程中,笔者发现有时候还是会出现中文乱码的问题,那么这个时候就要用到@FormUrlEncoded注解了:
public interface RXApi{

    @FormUrlEncoded // 在方法前使用注解
    @POST("url") // 有中文,当然使用@POST啦
    Call<T> getData(@Query("var1") String var1, // 正常的@Query还是可以使用
                    @Field("var2") String var2, // 需要防止乱码的参数使用@Field注解
                    @FieldMap Map<T, T> map // 如果有多个数据,可以使用@FieldMap注解
    );
}
  • 注意:如果使用了@FormUrlEncoded注解,那么在方法的参数中至少要有一个@Field或@FieldMap注解。

文件上传


  • 文件上传,不用说,在实际项目中是肯定会用到的,那么使用Retrofit怎么实现呢?Retrofit给我们提供了一个@Multipart注解用于解决这个问题:
public interface RXApi{

    @Multipart // 方法前使用注解
    @GET("url")
    Call<T> upload(@Part("file\"; filename=\"tmpicon.jpg\"") RequestBody body); // 上传固定名称文件,tmpicon.jpg为文件名

    @Multipart
    @GET("url")
    Call<T> uploads(@Part MultipartBody.Part bodys); // 上传不固定名称文件
}
  • 接口调用:
// 创建RequestBody对象
// file 文件对象
// MediaType.parse("multipart/form-data") 以表单类型提交
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);

// 创建MultipartBody.Part对象
// name 参数名称
// fileName 文件名称
// requestBody RequestBody对象
MultipartBody.Part part = MultipartBody.Part.createFormData(name, fileName, requestBody);

// 上传
upload(requestBody);
uploads(part);
  • 如果你需要上传多个文件的话,Retrofit也提供了@PartMap注解,用法和@FieldMap类似。

文件下载


  • 既然有上传,那么肯定有下载的啦,Retrofit下载文件也是比较简单的:
public interface RXApi{
    
    @GET // 下载文件,一般应该很少使用固定url的吧、、、
    Call<ResponseBody> download(@Url String url); // 笔者项目中使用,测试了很多都有问题,使用ResponseBody成功
}
  • 调用接口就不说了,请求成功后,返回的数据是ResponseBody,可以调用body()方法获取返回数据,写入到文件中。
  • 注意:这种方法只能用于下载小文件,大文件是不行滴。而且Retrofit并没有为我们提供下载进度监听,所以无法获取到下载进度,当然了,这些问题都是有解决方案的。咱们下次再聊。

相关文章

  • Retrofit的深入使用

    前言 在之前一篇文章中,我给大家介绍了Retrofit+RxJava搭建网络请求,并进行了简单的封装(没看过的童鞋...

  • Retrofit

    深入浅出 Retrofit,这么牛逼的框架你们还不来看看? (腾讯Bugly) Retrofit 初步使用 Ret...

  • Retrofit源码详解

    Retrofit的使用从很早之前就已经开始了, 但是一直没有深入研究为什么使用Retrofit只要定义一个接口, ...

  • <转>Retrofit源码解析-动态代理

    背景 之前一系列的关于Retrofit使用和封装的讲解过后,想必对Retrofit的灵活性和扩展性有何深入的了解,...

  • 6.2开源框架-retrofit网络框架-详解

    retrofit源码解析 retrofit使用方式 retrofit源码剖析 retrofit使用方式: 3个步骤...

  • Retrofit--网络通讯框架

    1. 使用 2. Retrofit框架的使用实例 Retrofit的使用实例 3. Retrofit框架的使用流程...

  • Retrofit的使用

    了解Retrofit的使用 retrofit使用 1.添加依赖,因为Retrofit是基于okhttp的: // ...

  • Retrofit 源码解析的初次尝试

    目录 Retrofit 简介 Retrofit 的具体使用 重点分析 Retrofit 简介 Retrofit 是...

  • Retrofit 使用及源码解析

    使用 Retrofit 引入 retrofit 使用示例 retrofit 在使用时,需要定义一个接口对象 1. ...

  • Retrofit 原理源码分析

    Retrofit 依赖 Retrofit 的简单使用 Retrofit 官方示例文档 本篇博客直接使用官方的示例,...

网友评论

    本文标题:Retrofit的深入使用

    本文链接:https://www.haomeiwen.com/subject/dbddmttx.html