Loading

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

posted @ 2022-10-12 21:06  Hans_Hu  阅读(72)  评论(0编辑  收藏  举报