AndroidRetrofit 的一些笔记
Posted Sodino
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AndroidRetrofit 的一些笔记相关的知识,希望对你有一定的参考价值。
- 1. 前言
- 2. Header的统一处理
- 3. 访问绝对路径
- 4. Map的使用避免声明冗余的类
- 5. RequestBody为String 及 文件上传
- 6. 后台Json空数据规范
- 7. 空数据Void声明
- 8. ResponseBody为String
- 9. ResponseBody的多次读取
- 10. 统一的错误处理
Retrofit :A type-safe HTTP client for Android and Java.
retrofit : noun. a component or accessory added to something after it has been manufactured
mocky.io: Mock your HTTP responses to test your REST API
前言
本文默认ConverterFactory
为GsonConverterFactory
。
请求阶段
- Header的统一处理
- 访问绝对路径
- Map的使用避免声明冗余的类
- RequestBody为String 及 文件上传
返回阶段
- 后台Json空数据规范
- 空数据Void声明
- ResponseBody为String
- ResponseBody的多次读取
- 统一的错误处理
Header的统一处理
使用Interceptor
可为每一个request
添加统一的Header
信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | public class OkHttpInterceptor implements okhttp3.Interceptor @Override public Response intercept(Chain chain) throws IOException Request originalRequest = chain.request(); Request newRequest = originalRequest.newBuilder() .header( "sdkInt", Integer.toString(Build.VERSION.SDK_INT)) .header( "device", Build.DEVICE) .header( "user-agent", "android.sodino") .header( "ticket", Constant.TICKET) .header( "os", "android") .header( "version", "2.6") .header( "Content-Type", "application/json") .build(); Response response = chain.proceed(newRequest); return response; public class RetrofitUtil // 定义统一的HttpClient并添加拦截器 private static OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor( new OkHttpInterceptor()).build(); public static Retrofit getComonRetrofit(String baseUrl) Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) .callbackExecutor(ThreadPool.getThreadsExecutor()) .client(okHttpClient) .build(); return retrofit; |
访问绝对路径
- @Url
@URL resolved against the base URL.
这种方式是动态的灵活的,不需要提前预知的。
1 2 | @GET Call<ResponseBody> list( @Url String url); |
- endpoint为绝对路径
这种方式需要在编码时提前预知,与baseUrl
的理念是相冲突的,不推荐使用这种方式。
Map的使用避免声明冗余的类
QueryMap为Query支持复杂的、不定数的字段。
对应的Body也可以通过定义参数类型为Map来避免声明冗余的类。
以下代码为了Post
/Put
的Body
特别定义了个IsReead
类,实现方式有些重!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class IsRead public boolean is_read; public interface Api @Post // or @Put Call<ResponseBody> reqIsRead( @Body IsRead isRead); // send a post or put request Api api = createApi(); IsRead isRead = new IsRead(); isRead.is_read = true; api.reqIsRead(isRead); |
与如下代码的功能是相同,但更简单明了的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public interface Api @Post // or @Put Call <ResponseBody > reqIsRead(@Body Map < String, Boolean > map); |