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();
}
中文乱码
- 虽然说,现在的项目都是使用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并没有为我们提供下载进度监听,所以无法获取到下载进度,当然了,这些问题都是有解决方案的。咱们下次再聊。
网友评论