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 接口封装类库的更多相关文章

  1. 【开源项目12】Retrofit – Java(Android) 的REST 接口封装类库

    Retrofit官网:http://square.github.io/retrofit/ Retrofit 和Java领域的ORM概念类似, ORM把结构化数据转换为Java对象,而Retrofit ...

  2. Java微信公众平台接口封装源码分享

    前言:      这篇博客是在三月初动手项目的时候准备写的,但是为了完成项目只好拖延时间写这篇博客,顺便也可以在项目中应用我自己总结的的一些经验.今天看来,这些方法的应用还是可以的,至少实现了我之前的 ...

  3. 对接外网post,get接口封装类库

    public class HttpHelper { public static string GetAsync(string url)  { HttpWebRequest request = WebR ...

  4. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  5. 大数据中HBase的Java接口封装

    该文前提为已经搭建好的HBase集群环境,参见 HBase集群搭建与配置 ,本文主要是用Java编写一个Servlet接口,部署在Tomcat服务器上,用于提供http的接口供其他地方调用,接口中集成 ...

  6. Android 网络编程 API笔记 - java.net 包相关 接口 api

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  7. 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 ...

  8. java Vamei快速教程04 封装和接口

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型.对 ...

  9. 基于Zabbix API文档二次开发与java接口封装

    (继续贴一篇之前工作期间写的经验案例) 一.           案例背景 我负责开发过一个平台的监控报警模块,基于zabbix实现,需要对zabbix进行二次开发. Zabbix官方提供了Rest ...

随机推荐

  1. PDF合并

    要求:将多个table导出到一个PDF里,然后打印. 问题分析:要求将四个table放一个PDF打印,四个table的列各不相同,第一个是表头,其他三个是列表,列比表头多很多,如果直接生成一个exce ...

  2. MVC使用的MetaModel代码生成器模板

    代码生成器能使从一些重复的工作中缓解下来 在最近开发MVC项目中使用到了MetaModel用来设定Model的显示名称,数据限制的代码生成模板,自己第一做代码生成模板还有很多缺陷. 下面是模板代码: ...

  3. 如何在Linux下重命名多个文件

    在Linux中,当你想要改变一个文件名,使用mv命令就好了.然而mv不能使用通配符重命名多个文件.可以用sed.awk或者与xargs结合使用来处理多个文件的情况.然而,这些命令行即繁琐又不友好,并且 ...

  4. iOS工程中的info.plist文件

    我们建立一个工程后,会在Supporting files下面看到一个"工程名-Info.plist"的文件,这个是对工程做一些运行期配置的文件,很重要,不能删除. 如果你在网上下载 ...

  5. C#和Js 编码和解码方法

    Server.UrlDecode(); Server.UrlEncode(); Server.HtmlDecode(); Server.HtmlEncode();

  6. 把Ubuntu打造成Mac Macbuntu

    Macbuntu:把 Ubuntu 一键打造成完整的 Mac 风格 23八 2010 # 作者:riku/ 本文采用CC BY-NC-SA 2.5协议授权,转载请注明本文链接. Macbuntu 是一 ...

  7. 1972: [Sdoi2010]猪国杀 - BZOJ

    题目太长,我只发链接吧 wikioi(排版看起来舒服一点):http://www.wikioi.com/problem/1834/ bzoj:http://www.lydsy.com:808/Judg ...

  8. 1021: [SHOI2008]Debt 循环的债务 - BZOJ

    Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的 ...

  9. Oracle创建触发器实现主键自增

    CREATE OR REPLACE TRIGGER "trigger_empl" before insert on extjsTest1.t_empl for each row b ...

  10. 图片流滚动效果html代码(复制)

    <!doctype html> <html> <head>     <meta charset="utf-8" />     < ...