首页 > 其他分享 >Retrofit学习笔记

Retrofit学习笔记

时间:2022-10-12 21:12:21浏览次数:78  
标签:retrofit2 converter 笔记 学习 Call squareup com Retrofit

官网:https://square.github.io/retrofit/

入门教程(入门、源码、设计模式):https://www.jianshu.com/p/8e6d16a982b8

Retrofit 简介

A type-safe HTTP client for Android and Java。 Retrofit requires at minimum Java 8+ or Android API 21+

Retrofit是采用 RESTfull 的HTTP网络请求框架,内部是基于OkHttpClient的源码进行封装。进一步简化网络请求

快速集成


<properties>
	<retrofit.version>2.9.0</retrofit.version>
</properties>

<dependencies>
	<dependency>
	  <groupId>com.squareup.retrofit2</groupId>
	  <artifactId>retrofit</artifactId>
	  <version>${retrofit_version}</version>
	</dependency>
	
	<!-- 添加对应转换器 -->
	<dependency>
		<groupId>com.squareup.retrofit2</groupId>
		<artifactId>converter-jackson</artifactId>
		<version>${retrofit.version}</version>
	</dependency>
</dependencies>

// 定义接口
public interface GarbageService {

    @GET("api/garbage/types")
    Call<RespBase<List<GarbageTypeDTO>>> listGarbageTypes();

    @POST("api/garbage/items/page")
    Call<RespBase<RespPage<GarbageItemDTO>>> pageQueryGarbageItems(@Body ReqPage reqPage);

}


// 使用Retrofit调用
@SneakyThrows(IOException.class)
public void simpleRetrofit() {
	Retrofit retrofit = new Retrofit.Builder()
			// 支持传入OkHttpClient
			// .client()
			.baseUrl("")
			// 支持传入 ObjectMapper / Gson
			.addConverterFactory()
			.build();

	GarbageService service = retrofit.create(GarbageService.class);

	Call<RespBase<List<GarbageTypeDTO>>> respBaseCall = service.listGarbageTypes();
	Response<RespBase<List<GarbageTypeDTO>>> response = respBaseCall.execute();
	if (response.isSuccessful()) {
	// ...
	}

	ReqPage reqPage = new ReqPage();
	reqPage.setPage(1);
	reqPage.setSize(10);
	Call<RespBase<RespPage<GarbageItemDTO>>> respBaseCall1 = service.pageQueryGarbageItems(reqPage);
	respBaseCall1.enqueue(new Callback<RespBase<RespPage<GarbageItemDTO>>>() {
		@Override
		public void onResponse(Call<RespBase<RespPage<GarbageItemDTO>>> call, Response<RespBase<RespPage<GarbageItemDTO>>> response) {
			if (response.isSuccessful()) {
				// ...
			}
		}

		@Override
		public void onFailure(Call<RespBase<RespPage<GarbageItemDTO>>> call, Throwable throwable) {

		}
	});

}

Retrofit 使用详解

如何使用注解定义访问的接口

// Query Path variables
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);

@GET("users/list?sort=desc")

// Query parameter
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

// RequestBody
@POST("users/new")
Call<User> createUser(@Body User user);

// 表单
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

// Multipart
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

// 请求头
@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();

@Headers({
    "Accept: application/vnd.github.v3.full+json",
    "User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);

@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)

@GET("user")
Call<User> getUser(@HeaderMap Map<String, String> headers)

声明的Header不会互相覆盖。所有的Header有这一样的名字都会被添加到请求里

Retrofit是将你的API请求转换成Call对象,Call 支持同步和异步执行,每一个Call实例只能被使用一次。

Retrofit 配置

Converter

Converter的作用就是在数据返回的时候,对数据进行对应格式的转换,减化了解析数据的过程。Converters是在一开始创建Retrofit对象时进行配置的。

自带的Converter
  • Gsoncom.squareup.retrofit2:converter-gson
  • Jacksoncom.squareup.retrofit2:converter-jackson
  • Moshicom.squareup.retrofit2:converter-moshi
  • Protobufcom.squareup.retrofit2:converter-protobuf
  • Wirecom.squareup.retrofit2:converter-wire
  • Simple XMLcom.squareup.retrofit2:converter-simplexml
  • JAXBcom.squareup.retrofit2:converter-jaxb
  • Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

在创建 Retrofit 实例时传入对应的 ConverterFactory

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

GitHubService service = retrofit.create(GitHubService.class);
自定义 Converter

TODO

Retrofit 源码解析

推荐阅读,这里只引用作者的两张图以作备忘。
https://www.jianshu.com/p/2d34a51d6be2

完成一次请求过程
image

源码解读流程图
image

标签:retrofit2,converter,笔记,学习,Call,squareup,com,Retrofit
From: https://www.cnblogs.com/hans-hu/p/start-retrofit.html

相关文章

  • 深度学习第二课
    向文件写入数据问题1:将含有缺失值(NaN)最多的列删除。 利用   *.isna().sum()  来统计每列缺失值的个数,axis=0计算列,axis=1计算行再用data=data.drop(co......
  • 第一天学习
    MarkDown学习标题  字体Hello,World!Hello,World!Hello,World!Hello,World!Hello,World! 引用 分割线图片[  超链接点击跳转到狂神博客 列......
  • 【每周CV论文】深度学习文本检测与识别入门必读文章
    欢迎来到《每周CV论文推荐》。在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的。文本检测和识别是计算机视觉的......
  • 【每周CV论文】初学深度学习图像对比度增强应该要读的文章
    欢迎来到《每周CV论文》。在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的。图像对比度增强,即增强图像中的有用......
  • 【每周CV论文】初学深度学习图像超分辨应该要读的文章
    欢迎来到《每周CV论文》。在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的。图像超分辨是一个非常实际应用价值......
  • 【PMP学习笔记】第11章 项目风险管理
    一、风险管理的内涵什么是风险管理?项目风险管理旨在识别和管理未被其他项目管理过程所管理的风险。风险管理的目标:项目风险管理的目标在于提高正面风险的概率和(或)影......
  • 【AutoML】强化学习如何用于模型蒸馏?
    大家好,欢迎来到专栏《AutoML》,在这个专栏中我们会讲述AutoML技术在深度学习中的应用,这一期讲述在知识蒸馏中的应用。作者&编辑|言有三上一期给大家介绍了AutoML技术在模型......
  • 个人翻译Introduction to Linear Algebra, 5th Edition 2.7节(仅用于交流学习,非盈利)
    本书的翻译仅为交流学习!才疏学浅,不当的地方还望指正。请勿于其它用途!PDF文件 链接一: https://pan.baidu.com/s/1sfEPpdaQe67lQfK4yYzLtw提取码:9g85  链接二:https......
  • 第二天学习
    第二天学习常用快捷键ctrl+C:复制ctrl+V:粘贴ctrl+A:全选ctrl+X:剪切ctrl+Z:撤销ctrl+S:保存Alt+F4:关闭窗口Shift+Delete:永久删除Windows+R:......
  • 如何看文献以及如何做好文献阅读笔记
    如何做好文献阅读及笔记一屋不扫,何以扫天下?文献阅读做不好,何以做好科研?1为什么要做文献阅读1.1了解课题背景、适用阶段:对于课题一无所知,期待探索阶段阅读建议......