A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 阳丹老师 于 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使用的一些介绍。

  1. // Retrofit turns your HTTP API into a Java interface.
  2. public interface GitHubService {
  3.   @GET("users/{user}/repos")
  4.   Call<List<Repo>> listRepos(@Path("user") String user);
  5. }
复制代码
   从上述代码中可以看出,在使用Retrofit访问网络地址的时候,需要先创建一个接口。其中@GET代表的是使用GET方式请求数据。
  1. @GET("users/{user}/repos")中的"users/{user}/repos"指的是baseUrl后面的具体地址。
  2. // The Retrofit class generates an implementation of the GitHubService interface.
  3. Retrofit retrofit = new Retrofit.Builder()
  4.     .baseUrl("https://api.github.com")
  5.     .build();
  6. GitHubService service = retrofit.create(GitHubService.class);
复制代码
   上述代码创建了一个Retrofit对象,并创建了接口类的对象。从代码中可以看出要访问的地址是:
  1. <a href="https://api.github.com/users/" target="_blank">https://api.github.com/users/</a>{user}/repos
复制代码
    调用接口中的方法访问网络。
  1. // Each Call from the created GitHubService can make a synchronous or asynchronous HTTP request to the remote webserver.
  2. Call<List<Repo>> repos = service.listRepos("octocat");
复制代码
    上述代码中传入了一个参数octocat,这参数个是"users/{user}/repos"中{user}所代表的值。那么正确的url地址是:
  1. https://api.github.com/users/octocat/repos
复制代码
Retrofit使用了注解来描述HTTP请求:

  • 它支持URL参数替代以及查询参数
  • 对象转换为请求主体(例如:JSON   protocol buffers)
  • 多部分的请求体和文件上传

Retrofit API  介绍
   接口上方法的注解以及它的参数说明如何处理一个请求。
请求方法
    每个方法都必须有一个提供请求方式以及关联URL的HTTP注解。Retrofit有五个内置的注解分别是 @GET @POST @PUT @DELETE @HEAD。关联URL地址是在注解中指定的。

  1. @GET("users/list")
  2.          你也可以指定查询参数。
  3. @GET("users/list?sort=desc")
复制代码
URL  操作
      使用替代块和参数的方法可以动态更新URL地址,替代块是指被{and}保卫的字母数字。一个相应的参数必须用@Path用相同的字符串来注解。具体使用如下所示:
  1. @GET("group/{id}/users")
  2. Call<List<User>> groupList(@Path("id") int groupId);
复制代码
查询参数也可以添加。
  1. @GET("group/{id}/users")
  2. Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
复制代码
对于复杂的查询参数集合可以使用Map
  1. @GET("group/{id}/users")
  2. Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
复制代码
请求体
一个对象和@Body注解可以被指定作为一个HTTP请求体来使用。
  1. @POST("users/new")
  2. Call<User> createUser(@Body User user);
复制代码
这个对象也能使用Retrofit 实例上指定转换器转换,如果没有添加转换器,那么只能当作Requestbody(请求体)使用。
编码和 MULTIPART
当在方法上面使用了@FormUrlEncoded注解时,  方法也能声明发送发送表单-编码。每个键值对都是使用@Field注解包围着key值,对象提供Value值。

  1. @FormUrlEncoded
  2. @POST("user/edit")
  3. Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
复制代码
需要用多部分请求时,需要在方法上加上@Muiltpart 这个注解。添加请求某一部分需要使用到@Part这个注解。
  1. @Multipart
  2. @PUT("user/photo")
  3. Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
复制代码
请求头的使用
你能在一个方法上面通过使用注解@Header来设置静态的请求头。
  1. <div class="blockcode"><blockquote>@Headers("Cache-Control: max-age=640000")
  2. @GET("widget/list")
  3. Call<List<Widget>> widgetList();
  4. @Headers({
  5.     "Accept: application/vnd.github.v3.full+json",
  6.     "User-Agent: Retrofit-Sample-App"
  7. })
  8. @GET("users/{username}")
  9. Call<User> getUser(@Path("username") String username);
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马