Retrofit – Java(Android) 的REST 接口封装类库
Retrofit 和Java领域的ORM概念类似, ORM把结构化数据转换为Java对象,而Retrofit 把REST API返回的数据转化为Java对象方便操作。同时还封装了网络代码的调用。
例如:
public interface GitHubService {
@GET("/users/{user}/repos")
List<Repo> listRepos(@Path("user") String user);
}
定义上面的一个REST API接口。 该接口定义了一个函数 listRepos , 该函数会通过HTTP GET请求去访问服务器的/users/{user}/repos路径并把返回的结果封装为List<Repo> Java对象返回。
其中URL路径中的{user}的值为listRepos 函数中的参数 user的取值。
然后通过 RestAdapter
类来生成一个 GitHubService
接口的实现;
GitHubService service = restAdapter.create(GitHubService.class);
获取接口的实现后就可以调用接口函数来和服务器交互了;
List<Repo> repos = service.listRepos("octocat");
从上面的示例可以看出, Retrofit 使用注解来声明HTTP请求
- 支持 URL 参数替换和查询参数
- 返回结果转换为Java对象(返回结果可以为 JSON, protocol buffers)
- 支持 Multipart请求和文件上传
具体使用文档
函数和函数参数上的注解声明了请求方式
请求方式
每个函数都必须带有 HTTP 注解来表明请求方式和请求的URL路径。类库中有5个HTTP注解: GET
, POST
, PUT
, DELETE
, 和 HEAD。 注解中的参数为请求的相对URL路径。
@GET("/users/list")
在URL路径中也可以指定URL参数
@GET("/users/list?sort=desc")
URL处理
请求的URL可以根据函数参数动态更新。一个可替换的区块为用 {
和 }
包围的字符串,而函数参数必需用 @Path
注解表明,并且注解的参数为同样的字符串
@GET("/group/{id}/users") //注意 字符串id
List<User> groupList(@Path("id") int groupId); //注意 Path注解的参数要和前面的字符串一样 id
还支持查询参数
@GET("/group/{id}/users")
List<User> groupList(@Path("id") int groupId, @Query("sort") String sort);
请求体(Request Body)
通过 @Body
注解可以声明一个对象作为请求体发送到服务器。
@POST("/users/new")
void createUser(@Body User user, Callback<User> cb);
对象将被 RestAdapter
使用对应的转换器转换为字符串或者字节流提交到服务器。
FORM ENCODED AND MULTIPART 表单和Multipart
函数也可以注解为发送表单数据和multipart 数据
使用 @FormUrlEncoded
注解来发送表单数据;使用 @Field
注解和参数来指定每个表单项的Key,value为参数的值。
@FormUrlEncoded
@POST("/user/edit")
User updateUser(@Field("first_name") String first, @Field("last_name") String last);
使用 @Multipart
注解来发送multipart数据。使用 @Part
注解定义要发送的每个文件。
@Multipart
@PUT("/user/photo")
User updateUser(@Part("photo") TypedFile photo, @Part("description") TypedString description);
Multipart 中的Part使用 RestAdapter
的转换器来转换,也可以实现 TypedOutput
来自己处理序列化。
异步 VS 同步
每个函数可以定义为异步或者同步。
具有返回值的函数为同步执行的。
@GET("/user/{id}/photo")
Photo listUsers(@Path("id") int id);
而异步执行函数没有返回值并且要求函数最后一个参数为Callback对象
@GET("/user/{id}/photo")
void listUsers(@Path("id") int id, Callback<Photo> cb);
在 Android 上,callback对象会在主(UI)线程中调用。而在普通Java应用中,callback在请求执行的线程中调用。
服务器结果转换为Java对象
使用RestAdapter的转换器把HTTP请求结果(默认为JSON)转换为Java对象,Java对象通过函数返回值或者Callback接口定义
@GET("/users/list")
List<User> userList(); @GET("/users/list")
void userList(Callback<List<User>> cb);
如果要直接获取HTTP返回的对象,使用 Response
对象。
@GET("/users/list")
Response userList(); @GET("/users/list")
void userList(Callback<Response> cb);
项目主页: http://square.github.io/retrofit/
参考项目: http://square.github.io/okhttp/
Android 示例项目: https://github.com/goodev/RetrofitDemo
本文转自:http://blog.chengyunfeng.com/?p=491
Retrofit – Java(Android) 的REST 接口封装类库的更多相关文章
- 【开源项目12】Retrofit – Java(Android) 的REST 接口封装类库
Retrofit官网:http://square.github.io/retrofit/ Retrofit 和Java领域的ORM概念类似, ORM把结构化数据转换为Java对象,而Retrofit ...
- Java微信公众平台接口封装源码分享
前言: 这篇博客是在三月初动手项目的时候准备写的,但是为了完成项目只好拖延时间写这篇博客,顺便也可以在项目中应用我自己总结的的一些经验.今天看来,这些方法的应用还是可以的,至少实现了我之前的 ...
- 对接外网post,get接口封装类库
public class HttpHelper { public static string GetAsync(string url) { HttpWebRequest request = WebR ...
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- 大数据中HBase的Java接口封装
该文前提为已经搭建好的HBase集群环境,参见 HBase集群搭建与配置 ,本文主要是用Java编写一个Servlet接口,部署在Tomcat服务器上,用于提供http的接口供其他地方调用,接口中集成 ...
- Android 网络编程 API笔记 - java.net 包相关 接口 api
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- Echarts 的 Java 封装类库 转自 https://my.oschina.net/flags/blog/316920
转自: https://my.oschina.net/flags/blog/316920 Echarts 的 Java 封装类库:http://www.oschina.net/p/echarts-ja ...
- java Vamei快速教程04 封装和接口
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型.对 ...
- 基于Zabbix API文档二次开发与java接口封装
(继续贴一篇之前工作期间写的经验案例) 一. 案例背景 我负责开发过一个平台的监控报警模块,基于zabbix实现,需要对zabbix进行二次开发. Zabbix官方提供了Rest ...
随机推荐
- Jar包下载
到maven上面下载 http://mvnrepository.com/artifact/redis.clients/jedis/2.9.0 到jarfire去下载 http://cn.jarfire ...
- linux学习笔记(3)-文件系统
三大类文件类型 普通文件:包括文本文件.数据文件.可执行的二进制程序文件 目录文件:linux系统把目录看成一种特殊的文件,利用它构成了文件系统的树形结构 设备文件:把设备也看成是一个文件,例如你的鼠 ...
- 1064: [Noi2008]假面舞会 - BZOJ
Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办 ...
- 1015: [JSOI2008]星球大战starwar - BZOJ
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...
- 如何使用 XSD
如何使用 XSD 一个简单的 XML 文档: 请看这个名为 "note.xml" 的 XML 文档: <?xml version="1.0"?> & ...
- 使用Flexbox实现CSS竖向居中
竖向居中需要一个父元素和一个子元素合作完成. <div class="flexbox-container"> <div>Blah blah</div& ...
- js原生removeclass方法
//如果列表中有存在给定的值就删除 // function removeClass(ele,txt){ // var str = ele.className, // ary = str.split(/ ...
- uva 11143
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 5100 #include& ...
- oracle-number(5,2)
insert into emp values(70000.123); 只能存储 整数的前3位, 小数点后面的2位
- jsp 获取表单值, 提交类型为multipart/form-data处理
//tt.jsp<script type="text/javascript"> function doSubmit(){ alert("aaaaaa" ...