转自简书 wo叫天然呆
前言:
以下是我用到的一些依赖:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
//日志拦截器
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
compile 'io.reactivex:rxjava:1.2.4'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'org.ligboy.retrofit2:converter-fastjson-android:2.1.0'
注解
retrofit通过使用注解来简化请求,大体分为以下几类:1.用于标注请求方式的注解 2.用于标记请求头的注解 3.用于标记请求参数的注解 4.用于标记请求和响应格式的注解
请求方法注解
注解 说明 @GET get请求 @POST post请求 @PUT put请求 @DELETE delete请求 @PATCH patch请求,该请求是对put请求的补充,用于更新局部资源 @HEAD head请求 @OPTIONS option请求 @HTTP 通用注解,可以替换以上所有的注解,其拥有三个属性:method,path,hasBody请求头注解名称 说明 @Body 多用于post请求发送非表单数据,比如想要以post方式传递json格式数据 @Filed 多用于post请求中表单字段,Filed和FieldMap需要FormUrlEncoded结合使用 @FiledMap 和@Filed作用一致,用于不确定表单参数 @Part 用于表单字段,Part和PartMap与Multipart注解结合使用,适合文件上传的情况 @PartMap 用于表单字段,默认接受的类型是Map,可用于实现多文件上传 @Path 用于url中的占位符 @Query 用于Get中指定参数 @QueryMap 和Query使用类似 @Url 指定请求路径
请求和响应格式注解
名称 说明 @FormUrlEncoded 表示请求发送编码表单数据,每个键值对需要使用@Field注解 @Multipart 表示请求发送multipart数据,需要配合使用@Part @Streaming 表示响应用字节流的形式返回.如果没使用该注解,默认会把数据全部载入到内存中.该注解在在下载大文件的特别有用
使用
这里不对注解进行过多的说明了,只展示几个用法
踩坑
1.url被转义http://api.mydemo.com/api%2Fnews%2FnewsList?
OkHttpClient
拦截器addNetworkInterceptor添加的是网络拦截器Network Interfacetor它会在request和response时分别被调用一次; addInterceptor添加的是应用拦截器Application Interceptor他只会在response被调用一次。
1.日志拦截器
使用addNetworkInterceptor()方法添加到OkHttpClient中 日志拦截器我这有两种创建方式: 一种是使用HttpLoggingInterceptor,需要使用到依赖
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
2.请求头拦截器
使用addInterceptor()方法添加到OkHttpClient中 我的理解是,请求头拦截器是为了让服务端能更好的识别该请求,服务器那边通过请求头判断该请求是否为有效请求等...使用addInterceptor()方法添加到OkHttpClient中 统一请求拦截器的功能跟请求头拦截器相类似使用addInterceptor()方法添加到OkHttpClient中 从响应中获取服务器返回的时间
缓存
使用okhttp缓存的话,先要创建Cache,然后在创建缓存拦截器
缓存拦截器
缓存时间自己根据情况设定
自定义CookieJar
启动Retrofit2
到了这里,基本上准备工作都做好了,可以启动Retrofit2了
retrofit = new Retrofit.Builder() .client(httpClientBuilder.build()) .baseUrl(BASE_URL) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(FastJsonConverterFactory.create()) .build(); mApi = retrofit.create(MyRetrofit2Service.class);
界面上通过getEnqueue()方法调用
结束
相信到这边应该能满足Demo的要求了吧,至少用是可以用了,不过在实际开发中,这还是太糙了点,哎..没时间打磨,慢慢来吧,有兴趣的可以留言讨论下优化方案,大家拓展下思维也是不错的嘛