Retrofit2
Posted fakerXuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Retrofit2相关的知识,希望对你有一定的参考价值。
Retrofit2
Retrofit2是什么
官网介绍是A type-safe HTTP client for android and Java,是一个 RESTful 的 HTTP 网络请求框架的封装,但网络请求不是Retrofit来完成的,它只是封装了请求参数、Header、Url、返回结果处理等信 息,而请求是由OkHttp3来完成的。
入门
- 导包
1//网络请求相关
2 implementation "com.squareup.retrofit2:retrofit:$rootProject.retrofitVersion"
3 implementation "com.squareup.retrofit2:retrofit- mock:$rootProject.retrofitVersion"
4 implementation "com.squareup.retrofit2:converter- gson:$rootProject.retrofitVersion"
5 implementation 'com.squareup.okhttp3:logging-interceptor:3.5.0'
6 implementation "com.squareup.retrofit2:converter- scalars:$rootProject.retrofitVersion"
7 implementation "com.squareup.retrofit2:adapter- rxjava2:$rootProject.retrofitVersion"
8 implementation "com.squareup.retrofit2:converter- gson:$rootProject.retrofitVersion"
- 定义一个HTTP API接口类
interface WanAndroidApi {
@GET("project/tree/json")
Call<ProjectBean> getProject(); 4
}
- 使用Retrofit类生成WanAndroidApi接口实现
Retrofit retrofit = new Retrofit.Builder()//建造者模式
.baseUrl("https://www.wanandroid.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
WanAndroidApi wanAndroidApi = retrofit.create(WanAndroidApi.class);//代理实例
- 发送HTTP请求,返回Response可以同步或者异步进行处理
Call<ProjectBean> call = wanAndroidApi.getProject();//获取具体的某个业务
//同步请求
Response<ProjectBean> response = call.execute();
ProjectBean projectBean = response.body();
//异步请求
call.enqueue(new Callback<ProjectBean>() {
@Override
public void onResponse(final Call<ProjectBean> call, final Response<ProjectBean> response) {
Log.i("Zero","response: " + response.body()); 10 }
@Override
public void onFailure(final Call<ProjectBean> call, final Throwable t) {}
});
请求方法类
标记类
- FormUrlEncoded
登录页面使用: Content-Type:application/x-www-form-urlencoded
用于修饰Field注解和FieldMap注解
使用该注解,表示请求正文将使用表单网址编码。字段应该声明为参数,并用@Field注释或FieldMap注释。使用FormUrlEncoded注解的请求将具”application/ x-www-form-urlencoded” MIME类型。字段名称和值将先进行UTF-8进行编码,再根据RFC-3986进行URI编码. - Multipart
上传文件使用: Content-Type:multipart/form-data
///上传单张图片//
/**
*Multipart:表示请求实体是一个支持文件上传的Form表单,需要配合使用@Part,适用于 有文件 上传的场景
*Part:用于表单字段,Part和PartMap与Multipart注解结合使用,适合文件上传的情况
*PartMap:用于表单字段,默认接受的类型是Map<String,REquestBody>,可用于实现多 文件上传
*Part 后面支持三种类型,{@link RequestBody}、{@link okhttp3.MultipartBody.Part} 、任意类型;
*
*@param file 服务器指定的上传图片的key值
*@return
*/
@Multipart @POST("project/upload")
Call<ProjectBean> upload1(@Part("file" + "\\";filename=\\"" + "test.png")
RequestBody file);
@Multipart @POST("project/xxx")
Call<ProjectBean> upload2(@Part MultipartBody.Part file);
请求///
//上传单个图片1
File file = new File("");
- Streaming
未使用该注解,默认会把数据全部载入内存,之后通过流获取数据也是读取内存中数据,所以返回数据 较大时,需要使用该注解
/**
* 12.Streaming注解:表示响应体的数据用流的方式返回,适用于返回的数据比较大,该注解在
在下载大文件的特别有用
*/ @Streaming @GET
Call<ProjectBean> downloadFile(@Url String fileUrl);
参数类
- Headers
- Header
- Body
- Field
- FieldMap
- Part
- PartMap
- HeaderMap
- Path
- Query
- QueryMap
- Url
原理分析
关键类功能说明
- Retrofit
关键的几个流程
-
Retrofit如何将定义的interface转化成网络请求?
-
Retrofit的Converter机制是如何实现的?
-
Retrofit的CallAdapter机制是如何实现的?
Converter种类
CallAdapter种类
如何自定义一个Converter及CallAdapter?
Retrofit中的设计模式
- 建造者模式
Retrofit对象的创建、ServiceMethod对象创建都使用Build模式,将复杂对象的创建和表示分离,调用 者不需要知道复杂的创建过程,使用Build的相关方法进行配置创建对象。 - 外观模式
Retrofit对外提供了统一的调度,屏蔽了内部的实现,使得使用该网络库简单便捷。
门面模式: 提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使用子系统更容易使用
- 动态代理模式
通过动态代理的方式,当调用Retrofit的create()方法时,会进行动态代理监听。当执行具体的接口方法 时,会回调InvocationHandler。通过反射解析method的标注及参数,生成ServiceMethod对象。 - 静态代理模式
Android平台默认的适配器ExecutorCallbackCall,采用静态代理的模式。具体的实现delegate为OkHttpCall。 - 工厂模式
Converter及CallAdapter的创建都采用了工厂模式进行创建。 - 适配器模式
CallAdapter的adapt采用了适配器模式,使得interface的返回对象可以动态扩展,增强了灵活性
网络请求库对比
以上是关于Retrofit2的主要内容,如果未能解决你的问题,请参考以下文章
Retrofit2 POST 方法获取代码 400 但适用于 Restlet 客户端
Android Studio - 使用 retrofit2 从 restdb 获取信息