Retrofit
Retrofit
标签(空格分隔): 第三方&开源
Retrofit是一套RESTful架构的Android(Java)客户端实现,基于注解,提供JSON to POJO(Plain Ordinary Java Object,简单Java对象),POJO to JSON,网络请求(POST,GET,PUT,DELETE等)封装。
相关资料:
RESTful百度百科
RESTful API设计
Retrofit 原理
Retrofit 简单使用
Retrofit Github工程地址
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 接口的实现;
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.build();
GitHubService service = restAdapter.create(GitHubService.class);
获取接口的实现后就可以调用接口函数来和服务器交互了;
List<Repo> repos = service.listRepos("octocat");
从上面的示例可以看出, Retrofit 使用注解来声明HTTP请求
- 支持 URL 参数替换和查询参数
- 返回结果转换为Java对象(返回结果可以为JSON, protocol buffers)
- 支持 Multipart请求和文件上传
具体使用文档
函数和函数参数上的注解声明了请求方式
1、请求方式
每个函数都必须带有 HTTP 注解来表明请求方式和请求的URL路径。类库中有5个HTTP注解:GET, POST, PUT,DELETE和HEAD。注解中的参数为请求的相对URL路径。
@GET("/users/list")
在URL路径中也可以指定URL参数
@GET("/users/list?sort=desc")
2、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);
3、请求体(Request Body)
通过@Body注解可以声明一个对象作为请求体发送到服务器。
@POST("/users/new")
void createUser(@Body User user, Callback<User> cb);
对象将被RestAdapter使用对应的转换器转换为字符串或者字节流提交到服务器。
4、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来自己处理序列化。
5、异步 VS 同步
每个函数可以定义为异步或者同步。
5.1、具有返回值的函数为同步执行的
@GET("/user/{id}/photo")
Photo listUsers(@Path("id") int id);
5.2、异步执行函数没有返回值并且要求函数最后一个参数为Callback对象
@GET("/user/{id}/photo")
void listUsers(@Path("id") int id, Callback<Photo> cb);
- 在 Android 上,callback对象会在主(UI)线程中调用。
- 在普通Java应用中,callback在请求执行的线程中调用。
6、服务器结果转换为Java对象
使用RestAdapter的转换器把HTTP请求结果(默认为JSON)转换为Java对象,Java对象通过函数返回值或者Callback接口指定
// 通过返回值指定要转换的Java的对象的类型
@GET("/users/list")
List<User> userList();
// 通过Callback的泛型参数来制定要转换的Java对象的类型
@GET("/users/list")
void userList(Callback<List<User>> cb);
7、如果要直接获取HTTP返回的对象,使用Response对象。
// 通过返回值的方式指定
@GET("/users/list")
Response userList();
// 通过Callback的泛型参数指定
@GET("/users/list")
void userList(Callback<Response> cb);
8、Retrofit涉及的重要知识点
- 动态代理
- 注解
- Handler + MessageQueue + Thread + Looper机制
- OKHttp请求网络
- GSON用来转换Java POJO和解析JSON
Retrofit的更多相关文章
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...
- Android Retrofit 2.0 使用-补充篇
推荐阅读,猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava 4.RxBus 5.Android MVP+Retrofit+RxJava实践小 ...
- Android MVP+Retrofit+RxJava实践小结
关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...
- 快速Android开发系列网络篇之Retrofit
Retrofit是一个不错的网络请求库,用官方自己的介绍就是: A type-safe REST client for Android and Java 看官网的介绍用起来很省事,不过如果不了解它是怎 ...
- android快捷开发之Retrofit网络加载框架的简单使用
大家都知道,安卓最大的特点就是开源化,这自然会产生很多十分好用的第三方API,而基本每一个APP都会与网络操作和缓存处理机制打交道,当然,你可以自己通过HttpUrlConnection再通过返回数据 ...
- Retrofit结合RxJava使用指南
Retrofit结合RxJava使用指南 Retrofit是一个当前很流行的网络请求库, 官网的介绍是: "Type-safe HTTP client for Android and Jav ...
- 用Retrofit发送请求中添加身份验证
用Retrofit发送请求中添加身份验证====================在安卓应用开发中, retrofit可以极大的方便发送http网络请求,不管是GET, POST, 还是PUT, DEL ...
- 82.Android之MVP+Retrofit+RxJava实践小结
转载:http://wuxiaolong.me/2016/06/12/mvpRetrofitRxjava/ 关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛 ...
- retrofit一点点理解
retrofit是什么? retrofit可以认为是一款基于http协议的rpc框架.基于java的. 它可以连到支持restful的服务器,将服务器返回的json数据反序列化成java对象. 用途 ...
- retrofit使用随记
1.请求接口 public interface RetrofitApi { /*注册*/ /*登录*/ @FormUrlEncoded //post请求带这个 @POST("url" ...
随机推荐
- FIM相关报错汇总
1.错误1:FIM在修改MA名字的时候报错: The management agent cannot be deleted or renamed because the working directo ...
- [ASE][Daily Scrum]11.13
今天的计划如下: View Shilin Liu 修复残缺地图下的行进问题 Client Jiafan Zhu(回学校了) 和服务器端对接测试 Yiming Liao ...
- Java多线程学习(转载)
Java多线程学习(转载) 时间:2015-03-14 13:53:14 阅读:137413 评论:4 收藏:3 [点我收藏+] 转载 :http://blog ...
- SQLSERVER执行性能统计工具SQLQueryStress
SQLSERVER执行时间统计工具SQLQueryStress 有时候需要检测一下SQL语句的执行时间,相信大家都会用SET STATISTICS TIME ON开关打开SQLSERVER内置的时间统 ...
- 为什么在Mac中无法用k web运行ASP.NET 5程序
k web对应的命令如下: "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebLi ...
- Java中的Set, List, Map漫谈
在编程语言中,集合是指代表一组对象的对象.Java平台专门有一个集合框架(Collections Framework).集合框架是指表示和操作集合的统一架构,隔离了集合的操作和实现细节. 集合框架中的 ...
- Spring - 初始化spring容器
2016.01.12 学习linux内核的过程中发现变相的提升了自己的工程能力.以前觉得spring这些东西很复杂麻烦.然而,学了linux内核再看这些东西,发现好简单. 学习spring首先就要学习 ...
- javascript中对象函数继承的概念
什么是函数对象?这个对象既是通常意义上的对象,又可以加上括号直接执行的函数. 产生函数对象的方式有两种:1.通过function关键字产生:var fn = function(){};2.实例化Fun ...
- paip.windows io监控总结
paip.windows io监控总结 io的主要参数是个.disk queue length 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专 ...
- iOS应用性能调优的25个建议和技巧
本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/,你还可以 ...