Retrofit2

Posted fakerXuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Retrofit2相关的知识,希望对你有一定的参考价值。

Retrofit2是什么

官网介绍是A type-safe HTTP client for android and Java,是一个 RESTful 的 HTTP 网络请求框架的封装,但网络请求不是Retrofit来完成的,它只是封装了请求参数、Header、Url、返回结果处理等信 息,而请求是由OkHttp3来完成的。

入门

  1. 导包
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"
  1. 定义一个HTTP API接口类
interface WanAndroidApi {
        @GET("project/tree/json")
        Call<ProjectBean> getProject(); 4	
}
  1. 使用Retrofit类生成WanAndroidApi接口实现
Retrofit retrofit = new Retrofit.Builder()//建造者模式
   .baseUrl("https://www.wanandroid.com/")
   .addConverterFactory(GsonConverterFactory.create())
   .build();
	WanAndroidApi wanAndroidApi = retrofit.create(WanAndroidApi.class);//代理实例
  1. 发送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
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

关键的几个流程

  1. Retrofit如何将定义的interface转化成网络请求?

  2. Retrofit的Converter机制是如何实现的?

  3. Retrofit的CallAdapter机制是如何实现的?

Converter种类

在这里插入图片描述

CallAdapter种类

在这里插入图片描述

如何自定义一个Converter及CallAdapter?

Retrofit中的设计模式

  1. 建造者模式
    Retrofit对象的创建、ServiceMethod对象创建都使用Build模式,将复杂对象的创建和表示分离,调用 者不需要知道复杂的创建过程,使用Build的相关方法进行配置创建对象。
  2. 外观模式
    Retrofit对外提供了统一的调度,屏蔽了内部的实现,使得使用该网络库简单便捷。
    门面模式: 提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使用子系统更容易使用
    在这里插入图片描述
  3. 动态代理模式
    通过动态代理的方式,当调用Retrofit的create()方法时,会进行动态代理监听。当执行具体的接口方法 时,会回调InvocationHandler。通过反射解析method的标注及参数,生成ServiceMethod对象。
  4. 静态代理模式
    Android平台默认的适配器ExecutorCallbackCall,采用静态代理的模式。具体的实现delegate为OkHttpCall。
  5. 工厂模式
    Converter及CallAdapter的创建都采用了工厂模式进行创建。
  6. 适配器模式
    CallAdapter的adapt采用了适配器模式,使得interface的返回对象可以动态扩展,增强了灵活性

网络请求库对比

在这里插入图片描述

以上是关于Retrofit2的主要内容,如果未能解决你的问题,请参考以下文章

Retrofit2 POST 方法获取代码 400 但适用于 Restlet 客户端

retrofit2 上传图片

Android Studio - 使用 retrofit2 从 restdb 获取信息

Retrofit2完全教程

retrofit2.HttpException:Android 中的 HTTP 302

Retrofit2.0 android.os.NetworkOnMainThreadException解决方法