一种类型安全的Java HTTP客户端库Retrofit

一种类型安全的Java HTTP客户端库Retrofit

作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs

一、Retrofit介绍

Retrofit是一个开源的、类型安全的HTTP客户端,它适用于Android和Java平台,官方主页为:

http://square.github.io/retrofit/

Retrofit需要Java 7以上版本或Android 2.3以上版本的支持。

二、Retrofit依赖

Retrofit的Maven依赖:

<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.0.0</version>
</dependency>

Gradle依赖:

compile ‘com.squareup.retrofit2:retrofit:2.0.0‘

三、Retrofit用法

1、Retrofit定义HTTP服务接口GitHubService

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

2、Retrofit产生GitHubService接口的实现

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

从GitHubService接口的每一个Call都可以向远程服务器发起同步或异步的请求。

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

3、使用注释描述HTTP请求

  • URL参数替代和查询参数的支持
  • 对象转换成请求的Body
  • 请求的Body可分拆为多个部分,支持文件上传

四、API声明

接口方法和参数上的注释说明了应该如何处理请求。

1、请求方法

每一个方法都必须有一个HTTP注释,它提供了请求的方法和相关的URL。

Retrofit内建了五个注释:GET, POST, PUT, DELETE, and HEAD

相关的URL也由注释来指定。

@GET("users/list")

还可以在URL中指定查询参数。

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

2、URL操纵

请求的URL可以被动态更新——在方法中使用块或参数进行替代。替代块是一个字母和数字组成的字符串,并使用大括号{}包围。替代参数则必须使用@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);

3、请求BODY

HTTP请求的Body可以使用@Body注释进行指定。

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

对象可以使用Retrofit示例指定的转换器进行转换。如果没有添加转换器,那么就只使用RequestBody。

4、表单编码和MULTIPART

方法还可以声明为表单编码的数据或Multipart数据。

@FormEncoded注释修饰方法时,表示发送的数据是表单编码的数据。每一个键值对使用@Field注释进行修饰。

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

而Multipart请求则使用@Multipart注释来修饰方法,多个部分使用@Part注释进行修饰。

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

5、HEADER操纵

可以使用@Headers注释来为方法设置静态的Header。

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

要注意Header内容不会彼此覆写,使用了同样名字的Header内容都会包括到请求中。

请求的Header可以使用@Header注释进行动态更新,相应的参数也必须在@Header中提供,如果值为null,Header可以省略。否则会调用toString方法。

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

Headers需要添加到每一个请求中,通过OkHttp拦截器进行指定。

五、同步与异步

Call实例可以以同步或异步的方式执行,每一个实例只使用一次,但是调用clone()方法就会创建一个新实例,新实例也会使用。

在Android系统,主线程会执行回调;而在JVM中,在执行HTTP请求的同一个线程会发生回调。

Retrofit类通过你饿API接口来转变成可回调的对象。

六、转换器

默认情况下,Retrofit只能反序列化HTTP Body为OkHttp的ResponseBody类型,它使用@Body接受RequestBody。

可以添加转换器来支持其它类型。Retrofit提供了六个转换器:

  • 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);
时间: 2024-08-09 04:21:41

一种类型安全的Java HTTP客户端库Retrofit的相关文章

Alljoyn瘦客户端库介绍(官方文档翻译 下)

由于其他事情耽误,这个翻译现在才完成.接上篇—— 4 瘦客户端核心库架构 由于AllJoyn瘦客户端核心库(AJTCL)必须运行在那些功耗受限.计算能力有限.资源紧缺的设备上,因此它无法像运行在通用型计算机系统上那样使用和AllJoyn标准核心库(AJSCL)一样的架构. 一个AJSL或服务进程的分层结构如图3所示.<Introduction to the AllJoyn Framework>一文描述了这些层次结构的更详尽细节.需要特别注意的是, 每个Alljoyn客户端或服务器程序都会以这种

XMPP客户端库Smack 4.0.6版开发之一

一.Smack库概述 Smack是一个开源.易用的XMPP/Jabber客户端库,它使用Java语言开发,由Jive Software开发. Smack的优点是编程简单. Smack的缺点是其API并非为大量并发用户设计,每个客户都要1个线程,占用资源相对较,因此用Smack做模拟测试时,1台机器只能模拟有限(数千个)客户. 截止2014年11月27日,Smack库已经发展到4.0.6版. 最新的好消息是Smack在4.1.0版后将直接支持Android系统,而无需再使用以前的Smack移植版a

java.util.stream 库简介

Java Stream简介 Java SE 8 中主要的新语言特性是拉姆达表达式.可以将拉姆达表达式想作一种匿名方法:像方法一样,拉姆达表达式具有带类型的参数.主体和返回类型.但真正的亮点不是拉姆达表达式本身,而是它们所实现的功能.拉姆达表达式使得将行为表达为数据变得很容易,从而使开发具有更强表达能力.更强大的库成为可能. Java SE 8 中引入的一个这样的库是 java.util.stream 包 (Streams),它有助于为各种数据来源上的可能的并行批量操作建立简明的.声明性的表达式.

OPCUA标准java实现 Milo库

Milo库今天跟大家来介绍一下一个OPC UA协议的开源库,我们使用的现场设备为西门子的S7-1500 CPU,西门子的S7-1500在V2.1版本后就直接可以作为OPC UA的服务器来供其他客户端访问.所以用OPC协议来进行数据采集就是最好的方式. 计算机语言采用java,所以也花了很大的力气来找OPC UA通信协议的java实现库,尽管OPC Foundation在Github上也有协议的java实现,但是各种学习的资源很有限,学习曲线比较陡峭.然后碰巧在Github上找到了一个OPC UA

Alljoyn瘦客户端库介绍(官方文档翻译)

Alljoyn瘦客户端库介绍(1) 1.简介 本文档对AllJoynTM瘦客户端的核心库文件(AJTCL)进行了详尽的介绍.本文档介绍了系统整体架构,AllJoyn框架结构,并着重于介绍如何将嵌入式设备加入AllJoyn系统整体架构中.1.1目的 本文档介绍了如何使一个受限于功耗.计算能力和内存的设备(嵌入式设备)加入AllJoyn分布式系统.具体而言,本文档包括了对AllJoyn面向嵌入式系统的方面的介绍,并着重描述了基于AllJoyn的系统的各个组件是如何与嵌入式设备协作以构建一个基于接近式

收集的Java科学计算库

将数学.物理.生物.航天.经济学等的计算集成到单一系统架构,提供了细致全面的计算系统. 科学计算框架 Catalano http://www.oschina.net/p/catalano Catalano Framework 是一个 Java 和 Android 的科学计算框架. 主要计算功能: 图像处理 模糊逻辑 数学计算 统计 机器学习 神经网络 科学计算可移植扩展工具包 PETSc http://www.oschina.net/p/petsc PETSc(Portable, Extensi

Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库

前面为JSTL中的常用EL函数,后面的为具体演示实例! JSTL简介: JSTL(Java Standard Tag Library) –Java标准标签库. SUN公司制定的一套标准标签库的规范. JSTL标签库,是由一些Java类组成的. JSTL组成: JSTL –Core 核心标签库. 重点 JSTL – I18N - 国际化标签库.Internationalization- I18N JSTL – SQL – 数据库操作标签(有悖于MVC设计模式),现在都不用这个. JSTL - Fu

XMPP客户端库Smack 4.0.6版开发之三

XMPP客户端库Smack 4.0.6版开发之三 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 六.建立连接的例子 XMPPConnection类用于创建一个到XMPP服务器的连接,代码例子如下: // 创建一个到jabber.org服务器的连接 AbstractXMPPConnection conn1 = new XMPPTCPConnection("username", "password", "jabb

即时聊天IM之三 XMPP协议客户端库的和Android端框架概述

合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:[email protected] smack介绍: 上一篇我介绍了服务端openfire整合现有系统用户,当服务器整合并且搭建完成后,需要做的工作就是写客户端聊天工具了.要么基于pc要么基于移动(Android和IOS).所以这一篇我们一起学习一下smack库,smack是用java写的开源客户端XMPP (Jabber)库,在老版本