黑马程序员技术交流社区
标题:
【长沙校区】网络框架--Retrofit的简单介绍
[打印本页]
作者:
阳丹老师
时间:
2016-2-16 16:04
标题:
【长沙校区】网络框架--Retrofit的简单介绍
本帖最后由 阳丹老师 于 2016-2-16 20:11 编辑
Retrofit的介绍
用官方自己的介绍就是:A type-safe REST client for Android and Java
Retrofit是Square开源的项目,是一套REST架构的Android/Java客户端实现。它基于注解,提供JSON to POJO(Plain Ordinary java Object , 简单Java对象的意思) 。POJO to JSON , 网络请求(POST , GET , PUT , DELETE等)封装。与Retrofit同类的网络请求框架有: RoboSpice , OkHttp , Volley , Android-Async-Http。
接下来介绍下Retrofit的使用,首先来看看官方对Retrofit使用的一些介绍。
// Retrofit turns your HTTP API into a Java interface.
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
复制代码
从上述代码中可以看出,在使用Retrofit访问网络地址的时候,需要先创建一个接口。其中@GET代表的是使用GET方式请求数据。
@GET("users/{user}/repos")中的"users/{user}/repos"指的是baseUrl后面的具体地址。
// The Retrofit class generates an implementation of the GitHubService interface.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com")
.build();
GitHubService service = retrofit.create(GitHubService.class);
复制代码
上述代码创建了一个Retrofit对象,并创建了接口类的对象。从代码中可以看出要访问的地址是:
<a href="https://api.github.com/users/" target="_blank">https://api.github.com/users/</a>{user}/repos
复制代码
调用接口中的方法访问网络。
// Each Call from the created GitHubService can make a synchronous or asynchronous HTTP request to the remote webserver.
Call<List<Repo>> repos = service.listRepos("octocat");
复制代码
上述代码中传入了一个参数octocat,这参数个是"users/{user}/repos"中{user}所代表的值。那么正确的url地址是:
https://api.github.com/users/octocat/repos
复制代码
Retrofit使用了注解来描述HTTP请求:
它支持URL参数替代以及查询参数
对象转换为请求主体(例如:JSON protocol buffers)
多部分的请求体和文件上传
Retrofit API 介绍
接口上方法的注解以及它的参数说明如何处理一个请求。
请求方法
每个方法都必须有一个提供请求方式以及关联URL的HTTP注解。Retrofit有五个内置的注解分别是
@GET @POST @PUT @DELETE @HEAD
。关联URL地址是在注解中指定的。
@GET("users/list")
你也可以指定查询参数。
@GET("users/list?sort=desc")
复制代码
URL 操作
使用替代块和参数的方法可以动态更新URL地址,替代块是指被{and}保卫的字母数字。一个相应的参数必须用
@Path
用相同的字符串来注解。具体使用如下所示:
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
复制代码
查询参数也可以添加。
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
复制代码
对于复杂的查询参数集合可以使用Map
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
复制代码
请求体
一个对象和
@Body
注解可以被指定作为一个HTTP请求体来使用。
@POST("users/new")
Call<User> createUser(@Body User user);
复制代码
这个对象也能使用Retrofit 实例上指定转换器转换,如果没有添加转换器,那么只能当作Requestbody(请求体)使用。
编码和 MULTIPART
当在方法上面使用了
@FormUrlEncoded
注解时, 方法也能声明发送发送表单-编码。每个键值对都是使用@Field注解包围着key值,对象提供Value值。
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
复制代码
需要用多部分请求时,需要在方法上加上@Muiltpart 这个注解。添加请求某一部分需要使用到
@Part
这个注解。
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
复制代码
请求头的使用
你能在一个方法上面通过使用注解
@Header
来设置静态的请求头。
<div class="blockcode"><blockquote>@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);
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2