Retrofit 实践整理

这篇博客整理一下目前使用的 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 所需要整理的暂时就这么多,后续遇到其他问题,将持续更新本篇博客。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值