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

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/50920944 一种类型安全的Java HTTP客户端库Retrofit作者:chszs,未经博主允许不得转载。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/50920944

一种类型安全的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);
目录
相关文章
|
11天前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
61 29
|
14天前
|
负载均衡 监控 安全
优化HTTP代理IP安全稳定性的关键要点
随着科技发展,越来越多企业依赖HTTP代理IP。为确保其安全稳定,建议采取以下措施:选择可靠服务商、使用HTTPS加密、定期更换IP、监控可用性、设置访问控制、使用负载均衡、配置防火墙、定期更新维护及用户教育。这些方法能有效提升代理IP的安全性和稳定性。
42 3
|
21天前
|
数据采集 缓存 负载均衡
动态HTTP代理与静态HTTP代理的区别及HTTP代理的常见用途与类型
HTTP代理在网络通信中扮演重要角色,优化数据传输并提供隐私保护和访问控制。本文对比动态与静态HTTP代理,探讨其特点、优劣势及适用场景。静态代理地址固定,适合稳定环境;动态代理灵活切换服务器,增强隐私保护。此外,介绍HTTP代理的常见用途(如缓存加速、匿名浏览、绕过限制等)及类型(透明、普匿、匿名、高匿、正向、反向代理),帮助用户根据需求选择合适的代理方式。最后提醒用户遵守法律法规,确保安全使用。
42 1
|
3月前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
130 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
3月前
|
负载均衡 监控 安全
HTTP代理IP的安全与稳定技术与策略的结合
随着科技与互联网的发展,企业对代理的需求日益增长。为加强HTTP代理IP的安全性和稳定性,可采取用户教育、使用加密协议、定期更换IP、监控可用性、设置访问控制、负载均衡、配置防火墙及定期更新维护等措施。这些方法能有效提升代理服务的安全性和可靠性。
86 7
|
5月前
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
141 1
使用Netty实现文件传输的HTTP服务器和客户端
|
5月前
|
JSON Java fastjson
Java Http 接口对接太繁琐?试试 UniHttp 框架吧
UniHttp 是一个声明式的 HTTP 接口对接框架,旨在简化第三方 HTTP 接口的调用过程。通过注解配置,开发者可以像调用本地方法一样发起 HTTP 请求,无需关注请求的构建和响应处理细节。框架支持多种请求方式和参数类型,提供灵活的生命周期钩子以满足复杂的对接需求,适用于企业级项目的快速开发和维护。GitHub 地址:[UniAPI](https://github.com/burukeYou/UniAPI)。
|
5月前
|
JSON 网络协议 网络安全
详解新一代 HTTP 请求库:httpx
详解新一代 HTTP 请求库:httpx
455 1
|
5月前
|
JavaScript 安全 Java
谈谈UDP、HTTP、SSL、TLS协议在java中的实际应用
下面我将详细介绍UDP、HTTP、SSL、TLS协议及其工作原理,并提供Java代码示例(由于Deno是一个基于Node.js的运行时,Java代码无法直接在Deno中运行,但可以通过理解Java示例来类比Deno中的实现)。
140 1
|
5月前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
183 1