Retrofit的深入使用

3776310-976446a571c4865d.png
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并没有为我们提供下载进度监听,所以无法获取到下载进度,当然了,这些问题都是有解决方案的。咱们下次再聊。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值