首先介绍Retrofit,这个是square公司的产品,它说白了就是对okhttp的封装,它可以将HTTP API通过注解式编程来转换为JAVA的接口,比如:
public interface GitHubService {
@GET("users/{user}/repos")
Call> listRepos(@Path("user") String user);
}
下面是一个完整的 URL (一个完整的 URL 包括模式(或称协议)、服务器名称(或 IP 地址)、路径)
http://www.hitomis.com/user.do?action=findUser&username="zuck"
@Path 只能替换 http://www.hitomis.com/user.do 服务器名称中的内容,而并不能替换 action=findUser&username="zuck" 路径中的内容
然后你可以创建一个Retrofit对象,通过生成刚才的GithubService接口实例来创建
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.build();
// Create an instance of our GitHub API interface.
GitHubService service = retrofit.create(GitHubService.class);
而每一个通过GithubService创建的命令都会产生一个同步或异步的request给远程服务器
// Create a call instance for looking up Retrofit contributors.
Call> call = github.contributors("square", "retrofit");
然后通过这个命令去获得数据
// Fetch and print a list of the contributors to the library.
call.enqueue(new Callback>() {
@Override
public void onResponse(Response> response) {
for (Contributor contributor : response.body()) {
System.out.println(contributor.login + " (" + contributor.contributions + ")");
}
}
@Override
public void onFailure(Throwable t) {
}
});
enqueue是异步发送请求,你可以使用execute来实现同步发送,但是基于android本身而言,异步更符合需求。
2.Retrofit的官方文档
Retrofit的四个接口:
Callback
Call
CallAdapter
Converter
Retrofit的API声明
1. 请求方法(request method)
每个方法都必须包含HTTP注解,提供请求方式和相对URL。
五种注解:GET、POST、DELETE、PUT、HEAD
相对URL用以对注解阐述,例如:
@GET("users/list")
你也可以在URL中指定一个查找参数
@GET("users/list?sort=desc")
@GET("group/{id}/users")
Call> groupList(@Path("id") int groupId);
简单的查找参数的添加
@GET("group/{id}/users")
Call> groupList(@Path("id") int groupId, @Query("sort") String sort);
复杂的查询参数可以合并成一个map集合
@GET("group/{id}/users")
Call> groupList(@Path("id") int groupId, @QueryMap Map options);
@POST("users/new")
Call createUser(@Body User user);
@FormUrlEncoded
@POST("user/edit")
Call updateUser(@Field("first_name") String first, @Field("last_name") String last);
多部请求可以通过@Multipart来实现,每个部分由@Part注解来声明,每个部分都可以使用Retrofit的转换器或者自己去实现RequestBody来操作自己想要的序列化
@Multipart
@PUT("user/photo")
Call updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call> widgetList();
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call getUser(@Path("username") String username);
@GET("user")
Call getUser(@Header("Authorization") String authorization)
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
Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
GitHubService service = retrofit.create(GitHubService.class);
com.squareup.retrofit2
retrofit
2.1.0
compile 'com.squareup.retrofit2:retrofit:2.1.0'
# Platform calls Class.forName on types which do not exist on Android to determine platform.
-dontnote retrofit2.Platform
# Platform used when running on RoboVM on iOS. Will not be used at runtime.
-dontnote retrofit2.Platform$IOS$MainThreadExecutor
# Platform used when running on Java 8 VMs. Will not be used at runtime.
-dontwarn retrofit2.Platform$Java8
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain declared checked exceptions for use by a Proxy instance.
-keepattributes Exceptions