Retrofit是什么?
按照惯例,我们首先来看下GitHub上Retrofit的解释。
Type-safe HTTP client for Android and Java by Square, Inc.
翻译下:
Square公司为Android和Java开发的类型安全的Http Client。
Retrofit其实就是对OkHttp的封装,使用面向接口的方式进行网络请求(大大简化了我们的代码,感觉这一点和Spring中Controller的接口编写类似),它使用动态生成的代理类封装了接口,而且使用很多注解提供功能。
如何使用Retrofit?
- 在 Gradle加入Retrofit库的依赖
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
Retrofit的使用要依赖于OkHttp,所以你还要加入对OkHttp库的依赖
当然,如果是Android开发者,不要忘记请求、添加网络权限。
<uses-permission android:name="android.permission.INTERNET"/>
- 定义HTTP API接口
public interface GetRequest_Interface {
@GET("group/{id}/users")
Call<Translation> getCall(@Path("id") int groupId);
}
Retrofit会使用动态代理的方式,将我们定义的Java Interface转换为网络请求接口,我们只需要定义和使用,暂时不关注它是如何进行转换的。
- 定义Retrofit实例
//创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder().baseUrl("http://fy.iciba.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
从这段代码上看,Retrofit的构造同样使用了设计模式中的[建造者模式],可见该模式的使用之普遍。
在构造Retrofit时我们要注意以下几点:
baseUrl以/结尾。
@GET等接口URL不要以/开头。
- 转换接口
//对发送请求进行封装
Call<Translation> translationCall = getRequest_interface.getCall(1);
- 调用API接口
//发送网络请求(同步)
try {
Response<Translation> response = translationCall.execute();
response.body().show();
} catch (IOException e) {
e.printStackTrace();
}
//不管同步还是异步请求,call只能执行一次,否则会抛 IllegalStateException
translationCall.clone();
//发送网络请求(异步)
translationCall.enqueue(new Callback<Translation>() {
//返回成功回调
@Override
public void onResponse(Call<Translation> call, Response<Translation> response) {
response.body().show();
}
//返回失败回调
@Override
public void onFailure(Call<Translation> call, Throwable t) {
}
});
//终止请求
translationCall.cancel();
HTTP协议的8种请求类型介绍
HTTP协议中共定义了八种方法或者叫“动作”来表明对Request-URI指定的资源的不同操作方式,具体介绍如下:
- OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。
- HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息.
- GET:向特定的资源发出请求。
- POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
- PUT:向指定资源位置上传其最新内容。
- DELETE:请求服务器删除Request-URI所标识的资源。
- TRACE:回显服务器收到的请求,主要用于测试或诊断。
- CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
Retrofit请求参数注解字段说明
@Query、@QueryMap
用于Http Get请求传递参数.如:
@GET("group/users")
Call<List<User>> groupList(@Query("id") int groupId);
等同于:
@GET("group/users?id=groupId")
即将@Query的key-value添加到url后面组成get方式的参数,@QueryMap同理
@Field
用于Post方式传递参数,需要在请求接口方法上添加@FormUrlEncoded,即以表单的方式传递参数.示例:
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
@Body
用于Post,根据转换方式将实例对象转化为对应字符串传递参数.比如Retrofit添加GsonConverterFactory则是将body转化为gson字符串进行传递.
converter有如下:
-
Gson: com.squareup.retrofit2:converter-gson
-
Jackson: com.squareup.retrofit2:converter-jackson
-
Moshi: com.squareup.retrofit2:converter-moshi
-
Protobuf: com.squareup.retrofit2:converter-protobuf
-
Wire: com.squareup.retrofit2:converter-wire
-
Simple XML: com.squareup.retrofit2:converter-simplexml
@Path
用于URL上占位符.如:
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
将groupId变量的值替换到url上的id位置
@Part
配合@Multipart使用,一般用于文件上传,看官方文档示例:
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
@Header
添加http header
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)
等同于:
@Headers("Authorization: authorization")<span class="hljs-comment">//这里authorization就是上面方法里传进来变量的值
@GET("widget/list")
Call<User> getUser()
@Headers
跟@Header作用一样,只是使用方式不一样,@Header是作为请求方法的参数传入,@Headers是以固定方式直接添加到请求方法上.示例:
@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("widget/list")
Call<List<Widget>> widgetList();