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 ...
随机推荐
- 【git】借助github学习成果
1.创建分支 git branch dev //创建分支 git checkout dev //切换分支 或者用一句 git checkout -b dev 删除一个分支 git check ...
- python学习笔记11(函数二): 参数的传递、变量的作用域
一.函数形参和实参的区别 形参全称是形式参数,在用def关键字定义函数时函数名后面括号里的变量称作为形式参数. 实参全称为实际参数,在调用函数时提供的值或者变量称作为实际参数. >>> ...
- DB天气 Alpha版使用说明
一 产品介绍 DB天气是一款能够准确预报天气的软件,它的特点在于它的简洁的设计风格,以及贴心的预报方式.是一款非主流的小清新的天气APP. 二 功能介绍 下面介绍一下DB天气的主界面以及天气功能的实现 ...
- iOS百度地图路径规划和POI检索详细总结-b
路径规划.png 百度地图的使用 百度地图API的导入网上说了许多坑,不过我遇到的比较少,这里就放两个比较常见的吧.坑一: 奥联WIFI_xcodeproj.png 如上图所示,在infoplist里 ...
- CentOS服务器 6.6 安装MySQL5.5.46
原文:http://www.linuxidc.com/Linux/2012-06/62288.htm 稍微修改了几个空格的错误 一.安装cmake# 安装所需依赖包(这段指令是一直输入的)yum -y ...
- Java连接redis的使用示例
在多线程下使用Jedis 在不同的线程中使用相同的Jedis实例会发生奇怪的错误.但是创建太多的实现也不好因为这意味着会建立很多sokcet连接,也会导致奇怪的错误发生.单一Jedis实例不是线程安全 ...
- 18:字符串-char型字符串
1 什么是字符串? 字符串是以空字符(\)结尾的字符数组.空字符的assii码为:0, 空格的ascii码为322 \0的作用'\0'是一个空字符标志,它的ASSII码为0,C++有好多处理字符串的函 ...
- hibernate多对一单向外键
hibernate多对一单向外键: 描述:
- centos64位安装32位C/c++库
yum install glibc.i686 glibc-devel.i686 yum install libstdc++.i686yum install libstdc++-devel.i686yu ...
- python:Attempted relative import in non-package
problem:Attempted relative import in non-package 所谓相对路径其实就是相对于当前module的路径,但如果直接执行脚本,这个module的name就是“ ...