本帖最后由 阳丹老师 于 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);
复制代码
|
|