Retrofit官方解析

转自:http://ranseti.top/article/retrofit

Retrofit是Square公司支持的开源资源,适用于Android和Java的类型安全的HTTP客户端,了解Square公司点击https://squareup.com/global/en/pos,更多Square开源资源点击http://square.github.io/



Introduction(介绍)

Retrofit turns your HTTP API into a Java interface.
把你的HTTP API改造成java接口。

public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}

The Retrofit class generates an implementation of the GitHubService interface.
Retrofit生成的GitHubService接口的实现。

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();

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

Each Call from the created GitHubService can make a synchronous or asynchronous HTTP request to the remote webserver.
来自创建的GitHubService的每个调用都可以向远程Web服务器发出同步或异步的HTTP请求。

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

Use annotations to describe the HTTP request:
使用注释来描述HTTP请求:

  • URL parameter replacement and query parameter support(URL参数替换和查询参数支持)
  • Object conversion to request body (e.g., JSON, protocol buffers)(将对象转换为请求正文(例如,JSON,协议缓冲区))
  • Multipart request body and file upload(Multipart 请求正文和文件上传)



API Declaration(API声明)

Annotations on the interface methods and its parameters indicate how a request will be handled.(接口方法及其参数的注解指示如何处理请求.)

REQUEST METHOD 请求方法
Every method must have an HTTP annotation that provides the request method and relative URL. There are five built-in annotations: GET, POST, PUT, DELETE, and HEAD. The relative URL of the resource is specified in the annotation.(每个方法都必须有一个提供请求方法和相对URL的HTTP注释。 有五个内置的注释:GET,POST,PUT,DELETE和HEAD。 资源的相对URL是在注释中指定的。)

@GET("users/list")

You can also specify query parameters in the URL.(您也可以在URL中指定查询参数。)

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

URL MANIPULATION(URL操作)
A request URL can be updated dynamically using replacement blocks and parameters on the method. A replacement block is an alphanumeric string surrounded by { and }. A corresponding parameter must be annotated with @Path using the same string.(请求URL可以使用方法中的替换块和参数动态更新。 替换块是由{和}包围的字母数字字符串。 相应的参数必须用@Path使用相同的字符串进行注释。)

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);

Query parameters can also be added.(查询参数也可以被添加。)

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);

For complex query parameter combinations a Map can be used.(对于复杂的查询参数组合,可以使用Map。)

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

REQUEST BODY(请求体)
An object can be specified for use as an HTTP request body with the @Body annotation.(可以指定一个对象作为带有@Body注解的HTTP请求体。)

@POST("users/new")
Call<User> createUser(@Body User user);

The object will also be converted using a converter specified on the Retrofit instance. If no converter is added, only RequestBody can be used.(该对象也将使用Retrofit实例上指定的转换器进行转换。 如果没有添加转换器,则只能使用RequestBody。)
</br>
FORM ENCODED AND MULTIPART(表格编码和multipart)
Methods can also be declared to send form-encoded and multipart data.(方法也可以被声明为发送表单编码和multipart数据。)
Form-encoded data is sent when @FormUrlEncoded is present on the method. Each key-value pair is annotated with @Field containing the name and the object providing the value.(当方法中存在@FormUrlEncoded时,将发送表单编码的数据。 每个键值对都用@Field进行注释,包含名称和提供值的对象。)

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

Multipart requests are used when @Multipart is present on the method. Parts are declared using the @Part annotation.(当@Multipart出现在方法中时,使用Multipart请求。 参数是使用@Part注释声明的。)

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

Multipart parts use one of Retrofit's converters or they can implement RequestBody to handle their own serialization.(Multipart使用Retrofit的转换器之一,或者他们可以实现RequestBody来处理自己的序列化。)


HEADER MANIPULATION(请求头)
You can set static headers for a method using the @Headers annotation.(你可以使用@Headers注解为一个方法设置静态头。)

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

Note that headers do not overwrite each other. All headers with the same name will be included in the request.(请注意,请求头不会相互覆盖。 所有名称相同的请求头将包含在请求中。)

A request Header can be updated dynamically using the @Header annotation. A corresponding parameter must be provided to the @Header. If the value is null, the header will be omitted. Otherwise, toString will be called on the value, and the result used.(请求标头可以使用@Header标注动态更新。 相应的参数必须提供给@Header。 如果该值为空,则标题将被省略。 否则,toString将被调用的值,并使用结果。)

@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)

Headers that need to be added to every request can be specified using an OkHttp interceptor.(需要添加到每个请求的头可以使用OkHttp拦截器来指定。)


SYNCHRONOUS VS. ASYNCHRONOUS(同步VS异步)

Call instances can be executed either synchronously or asynchronously. Each instance can only be used once, but calling clone() will create a new instance that can be used.(Call实例既可以同步执行,也可以异步执行。 每个实例只能使用一次,但调用clone()将创建一个可以使用的新实例。)

On Android, callbacks will be executed on the main thread. On the JVM, callbacks will happen on the same thread that executed the HTTP request.(在Android上,回调将在主线程上执行。 在JVM上,回调将在执行HTTP请求的同一个线程上发生。)



Retrofit Configuration(Retrofit配置)

Retrofit is the class through which your API interfaces are turned into callable objects. By default, Retrofit will give you sane defaults for your platform but it allows for customization.(Retrofit类是API接口转换为可调用对象的类。 默认情况下,Retrofit会为你的平台提供理智的默认值,但是可以自定义。)

CONVERTERS(转换器)

By default, Retrofit can only deserialize HTTP bodies into OkHttp's ResponseBody type and it can only accept its RequestBody type for @Body.(默认情况下,Retrofit只能将HTTP主体反序列化为OkHttp的ResponseBody类型,并且只能接受其@Body的RequestBody类型。)

Converters can be added to support other types. Six sibling modules adapt popular serialization libraries for your convenience.(可以添加转换器来支持其他类型。 为了您的方便,六个兄弟模块适应流行的序列化库。)

  • 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

Here's an example of using the GsonConverterFactory class to generate an implementation of the GitHubService interface which uses Gson for its deserialization.(下面是一个使用GsonConverterFactory类生成GitHubService接口的实现的示例,该接口使用Gson进行反序列化。)

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

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

CUSTOM CONVERTERS(自定义转换器)

If you need to communicate with an API that uses a content-format that Retrofit does not support out of the box (e.g. YAML, txt, custom format) or you wish to use a different library to implement an existing format, you can easily create your own converter. Create a class that extends the Converter.Factory class and pass in an instance when building your adapter.(如果您需要与使用Retrofit不支持的内容格式(例如,YAML,txt,自定义格式)的API进行通信,或者您希望使用不同的库来实现现有格式,则可以轻松地创建 你自己的转换器。 创建一个继承Converter.Factory类的类,并在构建适配器时传递一个实例。)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • 简介 刚接触Retrofit的时候,就写了一篇简单的使用介绍:Retrofit 2.0基本使用方法,算是对Retr...
    Whyn阅读 2,836评论 4 24
  • 文/涓娟 今天是2017年最后一天,也是三末,即周末、月末、年末,这个时间最适合对过去一年做个总结,总结这一年的得...
    郭晓娟阅读 154评论 0 0
  • 如果我记得没错,那么泸沽湖应该是我长这么大见过最美丽的自然风景。 这里也流传着一个美丽而动人的故事,关于肖淑明...
    控卫阅读 148评论 0 0
  • 原文链接 Flink中的每个函数和操作符都可以是有状态的(详细信息请参阅使用状态)。有状态的函数在单个元素/事件的...
    小C菜鸟阅读 1,813评论 0 0