这篇博客整理一下目前使用的 Retrofit 框架一些用法,配置。
了解过 Retrofit 的人都应该知道,Retrofit 在使用的过程中,需要定义一个接口对象。我是习惯性的把所有接口调用方法,统一写到一个接口里,然后给每个接口都用注释标明接口名称及作用。
目前用引入的库版本为:
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
上面是利用 Gson 返回对象,如果想直接返回 String 的话引入以下依赖:
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
初始化
常用的接口命名为
public interface RequestService {
}
注释方式为:
/**
* 接口名称
*
* @param key1 参数1
* @param key2 参数2
* @return
*/
构建 Retrofit 对象:
public class HttpClient {
private static RequestService service;
private static long TIMOUT = 10000; //设置超时时间
/**
* 调用 retrofit 服务
*
* @return
*/
public static RequestService getService() {
if (service == null) {
synchronized (HttpClient.class) {
if (service == null) {
service = new Retrofit.Builder()
.baseUrl(HTTP)
.addConverterFactory(GsonConverterFactory.create())
// .client(new OkHttpClient().newBuilder().addInterceptor(new Interceptor() {
// @Override
// public Response intercept(Chain chain) throws IOException {
// Request request = chain.request();
// HttpUrl url = request.url().newBuilder().addQueryParameter("platformType", "ANDROID").addQueryParameter("version", V.getVersionName(MyApplication.getContext())).build();
// return chain.proceed(request.newBuilder().url(url).build());
// }
// }).build())
.client(new OkHttpClient().newBuilder().connectTimeout(TIMOUT, TimeUnit.MILLISECONDS)
.writeTimeout(TIMOUT, TimeUnit.MILLISECONDS)
.readTimeout(TIMOUT, TimeUnit.MILLISECONDS)
.build())
.build()
.create(RequestService.class);
}
}
}
return service;
}
}
上面的代码中,设置了读写,以及连接超时时间,后面的时间单位参数我从网上 copy 了一下,如下:
1. TimeUnit.MICROSECONDS:微秒(毫秒/1000)
2. TimeUnit.MILLISECONDS:毫秒(千分之一秒)
3. TimeUnit.NANOSECONDS:毫微秒(微秒/1000)
4. TimeUnit.SECONDS: 秒
5. TimeUnit.MINUTES: 分钟
6. TimeUnit.HOURS: 小时
7. TimeUnit.DAYS: 天
添加公共参数 :
代码中,注释部分是给所有请求体添加公共参数,常用的就是携带 终端(ANDROID or IOS ),设备号,或者 当前版本号之类的。
new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
HttpUrl url = request.url().newBuilder().addQueryParameter("platformType", "ANDROID").addQueryParameter("version", V.getVersionName(MyApplication.getContext())).build();
return chain.proceed(request.newBuilder().url(url).build());
}
}
个人习惯直接用 GsonConverterFactory 直接转换对象。也可使用 ScalarsConverterFactory 返回 String ,
这里顺便也说一下,使用 GsonConverterFactory 的时候,就算是返回的 {} , 也要用一个空对象去接收。
其他的我也不多介绍了,该了解的大家也应该都了解的差不多了,下面整理的就是我在项目过程中,耗时相对较多的一些用法整理。整理的都是本人亲测可行的。
图片上传
请求方式:POST , form 表单。
–> 单个上传:
接口,
/**
* @param body
* @return
*/
@Multipart
@POST("xxx")
Call<UploadResp> uploadImgs(@Part MultipartBody.Part body);
调用方式:
private void http_upload(File file){
MultipartBody.Part body = MultipartBody.Part.createFormData("imgs", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file));
mService.uploadImgs(body).enqueue(new CallBack...);
}
这里说一下,”imgs”是上传文件的 key , 如果不需要的话, 这里传的好像也没什么用。。
–> 多个上传:
上面写了单个上传 用的@Part ,下面我们来说一下多文件上传,说到大家可能会想是不是有个 @PartMap ? 我告诉大家,确实是有,但是如果你这么用了,那么恭喜你,停止运行。
这里贴一下 多文件上传的接口:
@Multipart
@POST("xxx")
Call<UploadResp> uploadImgs(@Part List<MultipartBody.Part> body);
哈哈, 这里是不是和我们平时常用的有点不一样,没错,就是直接传一个 List 对象。看到这里我相信你们都应该知道该怎么去调用了吧,直接 new 一个 List , 根据单个上传的方式,往里面添加 Part 对象就行了。
网上介绍的还有一些其他上传文件的方式,我这里不知道是哪边的问题,测试的时候没对接成功。
至于上传文件并携带参数的,这个由于接口限制,暂时还没亲测,这里就先不写了。
请求参数内容过长
顺便提一下,之前在调用某些接口的时候,post 请求某一个参数内容过长,导致直接出现 4xx 错误,连请求都没发出去。这里 retrofit 的处理方式是把该参数用 @Field 修饰,如下:
@FormUrlEncoded
@POST("xxx")
Call<BaseBean> saveCarInfo(@Query("userName") String userName,
@Field("content") String content);
目前使用 Retrofit 所需要整理的暂时就这么多,后续遇到其他问题,将持续更新本篇博客。