美文网首页
Retrofit介绍

Retrofit介绍

作者: 米米在家 | 来源:发表于2018-03-08 13:36 被阅读0次

    本文是对Retrofit官网的翻译

    1.介绍(Intorduction)

    简单说来Retrofit实现的功能就是将HTTP API转化成了Java接口的形式。

    官网是这样描述的:Retrofit truns your HTTP API into a Java interface

    例子:

    public interface GitHubService {

      @GET("users/{user}/repos")

      Call> listRepos(@Path("user") String user);

    }

    用Retrofit这个类可以生成对上述接口的实现类:

    Retrofit retrofit = new Retrofit.Builder()

        .baseUrl("https://api.github.com/")

        .build();

    GitHubService service = retrofit.create(GitHubService.class);

    接口返回的每个call对象都可以实现和远程web服务器的同步或者一步的通信

    Call> repos = service.listRepos("octocat");

    用注解的形式来描述HTTP请求:

    URL参数是可以替换的并且提供请求参数

    对象可以转换成请求实体(例如JSON,protocol buffers)

    多重请求和文件上传

    2.API说明(API Declaration)

    接口方法需要的注解和参数来声明了这个请求如何处理

    2.1请求方法

    每个方法必须有关于HTTP的注解来提供请求方式和相对的URL。这里有五种关于请求方式的注解:GET,POST,DELETE,和HEAD。请求资源的相对URL地址也需要在注解中指出。

    @GET("users/list")

    你也可以在URL中声明你的请求参数

    @GET("users/list?sort=desc")

    2.2URL操作

    一个请求的URL可以通过方法中声明的替代模块或者请求参数来动态的更新。替代模块是一个被{}包裹的数字或者字符串。必须用@Path来注释对应的字符串来声明相应的参数。

    @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);

    2.3请求实体

    通过使用@Body注解可以实现将一个对象指定为HTTP的请求实体

    @POST("users/new")

    Call createUser(@Body User user);

    这个参数对象会被Retrofit实例中的converter进行转化。如果没有给Retrofit实例添加任何converter的话则只有RequestBody可以作为参数使用。

    2.4form encoded和multipart

    方法也可以被声明来发送form-encoded和multipart

    可以通过@FormUrlEncoded注解方法来发送form-encoded的数据。每个键值对需要用@Filed来注解键名,随后的对象需要提供值。

    @FormUrlEncoded

    @POST("user/edit")

    Call updateUser(@Field("first_name") String first, @Field("last_name") String last);

    也可以通过@Multipart注解方法来发送Mutipart请求。每个部分需要使用@Part来注解。

    @Multipart

    @PUT("user/photo")

    Call updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

    多部分请求的数据使用Retrofit的转换器或者自己实现的转换器来进行请求数据的序列化

    2.5表头操作

    你可以通过@Heather注解来给方法设置静态的表头

    @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);

    记住头部的值并不会相互覆盖,在请求中所有拥有相同名字的头部都会被保留

    可以通过@Header注解来实现头部的动态更新。相应的参数值必须提给表头。假如相应的值为null,则该头部会被忽略。否则的话, 值的 toString 方法将会被调用,并且使用调用结果。

    @GET("user")

    Call getUser(@Header("Authorization") String authorization)

    你可以使用okHttp interceptor为每个请求添加需要的头部

    2.6同步VS异步

    Call实例既可以同步的执行也可以异步执行。一个实例只能被执行一次,但是,当调用clone()将会产生一个新的实例供你使用。

    在Android中,回调方法运行在主线程,在JVM,回调方法将和执行HTTP请求处于同一线程

    3.Retrofit配置

    Retrofit类会通过你定义的API接口转化为可调用的对象。默认情况下,Retrofit会返还给你合理的默认值,但也允许你进行指定。

    3.1转化器(Converters)

    默认情况下,Retrofit只能将HTTP体反序列化为OKHttp的 ResonseBody 类型,而且只能接收 RequestBody类型作为 @Body。

    转化器的加入可以用于支持其他的类型。以下六个同级模块采用了常用的序列化库来为你提供方便。

    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

    下面提供一个使用GsonConverterFactory类生成 GitHubService的接口实现gson反序列化的例子。

    Retrofit retrofit = new Retrofit.Builder()

    .baseUrl("https://api.github.com")

    .addConverterFactory(GsonConverterFactory.create())

    .build();

    GitHubService service = retrofit.create(GitHubService.class);

    3.2自定义转化器

    如果你需要与没有使用Retrofit提供的内容格式的API进行交互的话或者是你希望使用一个不同的库来实现现有的格式,你也可以轻松创建使用自己的转化器。你需要创建一个继承自Converter.Factory的类并且在构建适配器的时候加入到实例里面。

    相关文章

      网友评论

          本文标题:Retrofit介绍

          本文链接:https://www.haomeiwen.com/subject/vmwefftx.html