Retrofit:类型安全的REST客户端for 安卓&Java
Retrofit:类型安全的REST客户端for 安卓&Java
2014年5月5日 星期一
21:11
官网: http://square.github.io/retrofit/
GitHub地址: https://github.com/square/retrofit
JavaDocs地址: http://square.github.io/retrofit/javadoc/index.html
本随笔是对官网教程的一个翻译,放出来供大家参考!
大纲
@GET,@POST,@PUT,@DELETE,@HEAD
@Path :{id}
@Query :name=value
@QueryMap
@Body :传对象
@FormUrlEncoded,@Field
@Multipart,@Part :TypedFile 发送文件
@Headers ,@Header
RequestInterceptor :通过拦截器添加Header
Callback(void返回),Observable:异步
返回Response
setConverter:配置Gson,自动以转换器
setErrorHandler:设置错误处理
概览:将你的请求API定义在一个Java 接口中:
|
public interface GitHubService { @GET("/users/{user}/repos") List<Repo> listRepos(@Path("user") String user); } |
然后通过RestAdapter类来生成一个该接口的实现。
|
RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .build(); GitHubService service = restAdapter.create(GitHubService.class); |
然后就可以调用了:
|
List<Repo> repos = service.listRepos("octocat"); |
一. 通过注解来进行HTTP请求:
- URL参数替换和query参数支持(就是?name=value&…的意思)
- 自定进行POJO类转换(自动将响应转换成POJO类,GSON)
- Multipart请求对象和文件上传支持(请求中包含多种媒体类型,如图片等)
二. 请求方法:
支持GET,POST,PUT,DELETE,HEAD
- 正常的请求:
|
//请求方法:通过注解进行请求 //普通请求 @GET("/users/list") //请求中可以直接加query parameter:sort=desc @GET("/users/list?sort=desc") //可以通过@Path注解和{name}语法替换参数:id @GET("/group/{id}/users") List<User> groupList(@Path("id") int groupId); //可以通过@Query添加请求参数:sort @GET("/group/{id}/users") List<User> groupList(@Path("id") int groupId, @Query("sort") String sort); //可以通过@QueryMap批量添加请求参数:options @GET("/group/{id}/users") List<User> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options); |
- 特殊的请求:
|
//通过@Body可以直接发送一个对象,通过RestAdapter进行转换 @POST("/users/new") void createUser(@Body User user, Callback<User> cb); //通过@FormUrlEncoded和@Field注解发送form-encoded data?TODO @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); |
- 添加Header
|
//静态添加方式 //添加单个头部 @Headers("Cache-Control: max-age=640000") @GET("/widget/list") List<Widget> widgetList(); //@Headers多个头部信息:可以有重复的名字 @Headers({ "Accept: application/vnd.github.v3.full+json", "User-Agent: Retrofit-Sample-App" }) @GET("/users/{username}") User getUser(@Path("username") String username); //动态添加头部 //动态添加头部:authorization @GET("/user") void getUser(@Header("Authorization") String authorization, Callback<User> callback) //添加所有信息 //如果想将头部加到所有的请求上,可以通过RequestIntercepter类。 RequestInterceptor requestInterceptor = new RequestInterceptor() { @Override public void intercept(RequestFacade request) { request.addHeader("User-Agent", "Retrofit-Sample-App"); } }; RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .setRequestInterceptor(requestInterceptor) .build(); |
- 同步异步和rx.Observable
|
//有返回的方法是同步方法 @GET("/user/{id}/photo") Photo getUserPhoto(@Path("id") int id); //最后一个方法是Callback<T>的话就是异步请求(T是要返回的数据) @GET("/user/{id}/photo") void getUserPhoto(@Path("id") int id, Callback<Photo> cb); //Retrofit同时集成了R小Java去支持返回一个rx.Observable来支持异步请求 @GET("/user/{id}/photo") Observable<Photo> getUserPhoto(@Path("id") int id); |
三. 返回对象类型:可以通过函数返回类型,Callback,Observable得到
|
//通过返回对象 @GET("/users/list") List<User> userList(); //通过Callback @GET("/users/list") void userList(Callback<List<User>> cb); //通过Observable @GET("/users/list") Observable<List<User>> userList(); |
可以返回原生的Http Response:通过返回Response
|
@GET("/users/list") Response userList(); @GET("/users/list") void userList(Callback<Response> cb); @GET("/users/list") Observable<Response> userList(); |
四. RestAdapter 配置:可以默认配置也可以自定义
- 配置Gson:自定义GSON实例的例子
|
Gson gson = new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .registerTypeAdapter(Date.class, new DateTypeAdapter()) .create(); RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .setConverter(new GsonConverter(gson)) .build(); GitHubService service = restAdapter.create(GitHubService.class); |
- 返回数据类型的配置(可以支持XML):默认是JSON,也可以定义Convertor去支持xml等其他返回数据格式(如默认还有一个SimpleXMLConverter)
|
RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.soundcloud.com") .setConverter(new SimpleXMLConverter()) .build(); SoundCloudService service = restAdapter.create(SoundCloudService.class); |
- 自定义转换器:去实现Converter接口皆可。
- 自定义同步请求的错误处理器:ErrorHandler
|
class MyErrorHandler implements ErrorHandler { @Override public Throwable handleError(RetrofitError cause) { Response r = cause.getResponse(); if (r != null && r.getStatus() == 401) { return new UnauthorizedException(cause); } return cause; } } RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .setErrorHandler(new MyErrorHandler()) .build(); |
Maven集成:
|
<dependency> <groupId>com.squareup.retrofit</groupId> <artifactId>retrofit</artifactId> <version>1.5.0</version> </dependency> |
Retrofit:类型安全的REST客户端for 安卓&Java的更多相关文章
- 客户端是选择Java Swing还是C# Winform
登录|注册 mentat的专栏 目录视图 摘要视图 订阅 [专家问答]韦玮:Python基础编程实战专题 [知识库]Swift资源大集合 [公告]博客新皮肤上线啦 ...
- 关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10
关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10 转载请标明出处,否则死全家.选择[复制链接]即可得到出处. (* ...
- 大数据实操2 - hadoop集群访问——Hadoop客户端访问、Java API访问
上一篇中介绍了hadoop集群搭建方式,本文介绍集群的访问.集群的访问方式有两种:hadoop客户端访问,Java API访问. 一.集群客户端访问 Hadoop采用C/S架构,可以通过客户端对集群进 ...
- Dagger:快速的依赖注入for 安卓&Java
Dagger:快速的依赖注入for 安卓&Java 2014年5月8日 星期四 15:29 官网: http://square.github.io/dagger/ GitHub: https: ...
- 连接mysql客户端报错: java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'
报这个错可能是因为用了低版本的的客户端.驱动连接高版本的mysql服务器. 解决方式有三种:升级客户端版本.修改服务端认证方式和适应服务端认证方式. 我是通过升级客户端版本解决,参考一下链接: Upg ...
- Jaeger的客户端采样配置(Java版)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Socket通信客户端设计(Java)
public class Client extends JFrame implements Runnable{ private JPanel jPanel= new JPanel(); private ...
- 针对安卓java入门:类和对象
定义类 class Dog { String name; int age; void jump(){ } } 生成对象: public class Test { public static void ...
- 【转】安卓Java的虚拟机区别
Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野.它对内存的高效使用,和在低速CPU上表现出的高性能,确实令 ...
随机推荐
- Coding and Paper Letter(四十五)
资源整理. 1 Coding: 1.Python库gempy,一种基于Python的开源三维结构地质建模软件,它允许从界面和方向数据隐式(即自动)创建复杂的地质模型. 它还支持随机建模以解决参数和模型 ...
- 【BZOJ1014】火星人(Splay,哈希)
[BZOJ1014]火星人(Splay,哈希) 题面 BZOJ 题解 要动态维护这个串,一脸的平衡树. 那么用\(Splay\)维护这个哈希值就好了. 每次计算答案的时候二分+Splay计算区间哈希值 ...
- 洛谷 P3373 【模板】线段树 2 解题报告
P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上\(x\) 2.将某区间每一个数加上\(x\) 3.求出某区间每一个数的和 输入输出格式 ...
- redis的sort排序
Redis排序命令是sort,完整的命令格式如下:SORT key [BY pattern] [LIMIT start count] [GET pattern] [ASC|DESC] [ALPHA] ...
- CVE-2017-16995 Ubuntu16.04本地提权漏洞复现
0x01 前言 该漏洞由Google project zero发现.据悉,该漏洞存在于带有 eBPF bpf(2)系统(CONFIG_BPF_SYSCALL)编译支持的Linux内核中,是一个内存任意 ...
- HTTP协议格式【转】
原文链接:https://www.jianshu.com/p/8fe93a14754c 一.URI结构 HTTP使用统一资源标识符(URI)来传输数据和建立连接.URL(统一资源定位符)是一种特殊种类 ...
- 009.C++ const使用
1.引例 class complex { public: complex(, ) : re (r), im (i) {} complex& operator += (const complex ...
- Kruskal-Wallis test
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...
- 使用RVM轻松部署Ruby环境
Ruby用得不多,但发现有业务需要部署指定的版本和插件.起初找了一些Fedora的src.rpm重新打包,发现依赖问题比较多,最终还是费劲的把el6的包编出来了. 不巧今天又有业务要求el5的包,原本 ...
- 【算法日记】Dijkstra最短路径算法
上一篇再说广度优先搜索的适合提到了图. 狄克斯拉特算法是在图的基础上增加了 加权图的概念.就是节点和节点之间是有不同距离的 1.算法实例 用Dijkstra算法找出以A为起点的单源最短路径步骤如下 算 ...