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请求:

  1. URL参数替换和query参数支持(就是?name=value&…的意思)
  2. 自定进行POJO类转换(自动将响应转换成POJO类,GSON)
  3. Multipart请求对象和文件上传支持(请求中包含多种媒体类型,如图片等)

二. 请求方法:

支持GET,POST,PUT,DELETE,HEAD

  1. 正常的请求:

//请求方法:通过注解进行请求

//普通请求

@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);

  1. 特殊的请求:

//通过@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);

  1. 添加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();

  1. 同步异步和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 配置:可以默认配置也可以自定义

  1. 配置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);

  1. 返回数据类型的配置(可以支持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);

  1. 自定义转换器:去实现Converter接口皆可。
  2. 自定义同步请求的错误处理器: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的更多相关文章

  1. 客户端是选择Java Swing还是C# Winform

      登录|注册     mentat的专栏       目录视图 摘要视图 订阅 [专家问答]韦玮:Python基础编程实战专题     [知识库]Swift资源大集合    [公告]博客新皮肤上线啦 ...

  2. 关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10

    关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10 转载请标明出处,否则死全家.选择[复制链接]即可得到出处. (* ...

  3. 大数据实操2 - hadoop集群访问——Hadoop客户端访问、Java API访问

    上一篇中介绍了hadoop集群搭建方式,本文介绍集群的访问.集群的访问方式有两种:hadoop客户端访问,Java API访问. 一.集群客户端访问 Hadoop采用C/S架构,可以通过客户端对集群进 ...

  4. Dagger:快速的依赖注入for 安卓&Java

    Dagger:快速的依赖注入for 安卓&Java 2014年5月8日 星期四 15:29 官网: http://square.github.io/dagger/ GitHub: https: ...

  5. 连接mysql客户端报错: java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'

    报这个错可能是因为用了低版本的的客户端.驱动连接高版本的mysql服务器. 解决方式有三种:升级客户端版本.修改服务端认证方式和适应服务端认证方式. 我是通过升级客户端版本解决,参考一下链接: Upg ...

  6. Jaeger的客户端采样配置(Java版)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. Socket通信客户端设计(Java)

    public class Client extends JFrame implements Runnable{ private JPanel jPanel= new JPanel(); private ...

  8. 针对安卓java入门:类和对象

    定义类 class Dog { String name; int age; void jump(){ } } 生成对象: public class Test { public static void ...

  9. 【转】安卓Java的虚拟机区别

    Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野.它对内存的高效使用,和在低速CPU上表现出的高性能,确实令 ...

随机推荐

  1. linux内核分析 第三周 构造一个简单的Linux系统MenuOS

    一.计算机的三个法宝 存储程序计算机,函数调用堆栈,中断二.操作系统的两把剑:1.中断上下文的切换,保存现场和恢复现场2.进程上下文的切换. 三.linux内核源代码的分析: ·arch/目录保存支持 ...

  2. 【noip2018】【luogu5021】赛道修建

    题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 mm 条赛道. C 城一共有 nn 个路口,这些路口编号为 1,2,…,n1,2,…,n,有 n-1n−1 条适合于修建赛道的双向通 ...

  3. python基础----递归函数(二分法、最大深度递归)

    递归函数 定义:在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. #例子1 # age()=age()+ n= age(n)=age(n-)+ # age()=ag ...

  4. 扶苏的bitset浅谈

    bitset作为C++一个非常好用的STL,在一些题目中巧妙地使用会产生非常不错的效果.今天扶苏来分享一点bitset的基础语法和应用 本文同步发布于个人其他博客,同时作为P3674题解发布. 本文感 ...

  5. Linux之Libcurl库的介绍与应用20170509

    一.LibCurl简介 LibCurl是免费的客户端URL传输库,支持FTP,FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE ,LDAP等 ...

  6. POJ2234:Matches Game(Nim博弈)

    Matches Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12325   Accepted: 7184 题目链 ...

  7. python学习(十一)测试和调试

    最近学习了python的错误处理和几种测试方法 1 try except 可以通过try except方式捕捉异常 try: print('try...') r = 10/0 print('resul ...

  8. 题解【bzoj2301 [HAOI2011]Problem b】

    Description 求有多少个数对 \((x,y)\) ,满足$ a \leq x \leq b$ ,\(c \leq y \leq d\) ,且 \(\gcd(x,y) = k\),\(\gcd ...

  9. Kubernetes - Deploy Containers Using YAML

    In this scenario, you'll learn how to use Kubectl to create and launch Deployments, Replication Cont ...

  10. tf.train.batch的偶尔乱序问题

    tf.train.batch的偶尔乱序问题 觉得有用的话,欢迎一起讨论相互学习~Follow Me tf.train.batch的偶尔乱序问题 我们在通过tf.Reader读取文件后,都需要用batc ...