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

时间: 2024-11-02 20:54:45

Retrofit:类型安全的REST客户端for 安卓&Java的相关文章

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

转载请标明出处,否则死全家.选择[复制链接]即可得到出处. (* ************************************************ *)(* *)(* *)(* 设计:爱吃猪头肉 & Flying Wang 2015-04-15 *)(* 上面的版权声明请不要移除. *)(* *)(* ************************************************ *) 本人所在的群(① FireMonkey[移动开发] 165232328) 对

红叶倾城一键网页游戏服务端+客户端(无须安装Java)源码

倾城的一键安装版服务端(包括客户端) , 无须安装Java,直接启动服务端就可进入游戏!!!新开服添加首个GM的方法:注册帐号并登陆游戏创建角色名称后,再服务端控制台中输入gmGrade 玩家角色名称 255即成功升级该角色为GM(注意输入的命令的大小写)//////////////////////////////////////////changeHeroLevel 玩家角色名称 级别/addPlayerTreasure 玩家角色名称 数量                /addGoods 物

航空订票客户端应用安卓源码

航空订票客户端应用安卓源码,本项目是一个简单的航空订票项目源码,服务端已经挂了,直接把登录逻辑注释掉截的主界面图,整个风格比较简洁清爽,项目貌似是个半成品,很多图片都没有替换,翻了翻源码登录注册时间选择列表展示这些功能也都做了(不过服务端挂了没办法演示),项目代码写的比较规范,注释量也还说的过去,感兴趣的朋友自己下载研究一下吧,项目编译版本4.4.2默认编码GBK <ignore_js_op> Android应用源码航空订票软件客户端登录 <ignore_js_op> Androi

Dagger:快速的依赖注入for 安卓&amp;Java

2014年5月8日 星期四 15:29 官网: http://square.github.io/dagger/ GitHub: https://github.com/square/dagger JavaDocs: http://square.github.io/dagger/javadoc/index.html 注:来自我的OneNote笔记,其实官网给的教程挺好的,最好下载GitHub上的例子来看 使用方法: 例子: coffee example. 声明依赖性:使用javax.inject.I

Python服务器与多种客户端(Python/Java/Android)之间的通信

概述: 我们不会一直满足于客户端程序的开发,因为太过受限了.为了打破这样的受限,你需要做的就是去编写服务器端代码.以及如何在服务器与客户端之间的通信.以下将对此以Python为服务器,并分别以Python.Java.Android为客户端作一个简单的介绍. 服务器端: test_tcp_server.py #!/usr/bin/env python from socket import * from time import ctime HOST = '' PORT = 21567 BUFSIZ

Android 客户端Socket 与 Java服务端ServerSocket 简单小例子

新建一个Java项目 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public

非常不错的新闻客户端应用安卓源码

这段时间做的一个新闻客户端,界面优美,数据都是从百度新闻那里直接抓取的,有json和html解析.上面的滑动Tab是通过自定义View自己画出来的,列表的图片都是通过异步软引用方式加载的,可以流畅的运行.另外新闻详情是使用webview加载部分html显示的,效果非常好,比直接解析html要好很多.整体较为美观,流畅. 以下是部分截图展示和源码:<ignore_js_op><ignore_js_op><ignore_js_op><ignore_js_op>&

安卓java层操作数据库

一.在Android中查询数据库用到两个重要的类:  1.SQLiteDatabase:用来创建,删除,执行SQL命令,并执行其他常见的数据库管理任务. 2.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) 返回Cursor对象 table:数据库里边表的名称 columns:需要查询出来数据库

JS判断客户端是安卓还是iOS

if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { alert(navigator.userAgent); window.location.href ="iPhone.html"; } else if (/(Android)/i.test(navigator.userAgent)) { alert(navigator.userAgent); window.location.href ="Android.html