Retrofit框架使用笔记

2024-06-13 05:38
文章标签 使用 笔记 框架 retrofit

本文主要是介绍Retrofit框架使用笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Retrofit使用

写个笔记以后回顾,嘿嘿….

Retrofit作用就是方便的把数据自动封装成JAVA对象,把REST API返回的数据转化成JAVA对象.

背景:Square公司框架之一,内置okhttp框架

开源框架地址:https://github.com/square/retrofit
英文文档官网:http://square.github.io/retrofit/ (英文好的童鞋可以直接看这个就OK,o(╯□╰)o);
相关框架:
RxJava:https://github.com/ReactiveX/RxJava
(注:使用方法先参考http://blog.csdn.net/lzyzsd/article/details/41833541 这个是翻译的文章还可以)
okhttp:https://github.com/square/okhttp
(注:后续文章介绍)


好的进入正题:

Retrofit框架是用来请求数据的所以说主要分为两部分:1.发送请求 2.接收数据

使用的三个步骤:

  1. 使用注解方式标注请求模板接口.
  2. RestAdapter实例化请求接口(接口当然不能直接被实例化,这里内部是反射实现的代理).
  3. 最后调用请求模板接口的方法获取数据.

下面贴上快速上手使用的代码:

//1.使用注解方式标注请求模板接口.
public interface GitHubService {@GET("/users/{user}/repos")//URL相对路径List<Repo> listRepos(@Path("user") String user);//Repo是JSON封装成的JAVA对象
}//2.RestAdapter实例化(使用了建造者模式)
RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint("https://api.github.com")//URL域名.build();GitHubService service = restAdapter.create(GitHubService.class);//3.最后调用请求模板接口的方法.
List<Repo> repos = service.listRepos("octocat");//List<Repo>就是返回的已封装好的请求数据

注:上面使用了github API,直接返回的就是JSON数据,参考网站:

是不是感觉使用起来很简洁.结合RxAndroid使用效果更好.

下面说下详细使用:

一.请求部分:

这个框架的请求方式是采用的注解方式指明请求相对路径框架,然后参数指明具体内容
请求方法有:GET, POST, PUT, DELETE, and HEAD(GET,POST最常用)

URL操作

{}中的表示待定参数,路径中的参数使用@Path(“XXX”)

@GET("/group/{id}/users")
List<User> groupList(@Path("id") int groupId);

@Query用于查询参数如同”?”作用

@GET("/group/{id}/users")
List<User> groupList(@Path("id") int groupId, @Query("sort") String sort);

@QueryMap用于有多个查询参数

@GET("/group/{id}/users")
List<User> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
请求体(主要是用于@POST方式)
@POST("/users/new")
void createUser(@Body User user, Callback<User> cb);//Callback参数下面讲解
表单提交

@FormUrlEncoded注明是表单提交
@Field注明表单中的键,方法的参数就是值了噻.

@FormUrlEncoded
@POST("/user/edit")
User updateUser(@Field("first_name") String first, @Field("last_name") String last);

下面部分不太常用可以跳过
多部分提交
@Multipart 多部分
@PUT(“XXX”) 提交相对路径

@Multipart
@PUT("/user/photo")
User updateUser(@Part("photo") TypedFile photo, @Part("description") TypedString description);
请求头

@Headers(“”)请求头设置

@Headers("Cache-Control: max-age=640000")
@GET("/widget/list")
List<Widget> widgetList();

注:所有头都不会覆盖,同名的会一并提交
若请求头要被添加到每一个请求,可以通过RequestInterceptor对象指定,如下:

RequestInterceptor requestInterceptor = new RequestInterceptor() {@Overridepublic void intercept(RequestFacade request) {request.addHeader("User-Agent", "Retrofit-Sample-App");}
};RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint("https://api.github.com").setRequestInterceptor(requestInterceptor).build();

Retrofit支持RxAndroid(RxJava家族中一员),可以优化异步操作.后续文章介绍

二:接收数据部分

有两种方式处理数据的方式
方式一:操作框架已经转换好的数据
1. 返回值为封装好的数据
2. 无返回值,有Callback类型的回调参数
3. 返回RxAndroid Observable对象

@GET("/users/list")
List<User> userList();@GET("/users/list")
void userList(Callback<List<User>> cb);@GET("/users/list")
Observable<List<User>> userList();@GET("/users/list")
Response userList();
Callback使用说明
//List<GithubClient.Contributor>是请求返回的数据callback = new Callback<List<GithubClient.Contributor>>() {@Overridepublic void success(List<GithubClient.Contributor> contributors, Response response) {Logger.d(GithubActivity.this.getClass().getCanonicalName(), contributors.size());}@Overridepublic void failure(RetrofitError error) {Logger.d("Activity", error.getMessage());}};GithubClient.getContributors(callback);

方式二:直接操作原始HTTP 响应数据

@GET("/users/list")
Response userList();@GET("/users/list")
void userList(Callback<Response> cb);@GET("/users/list")
Observable<Response> userList();
RestAdapter配置

json转换器
Retrofit默认使用GSON转换JSON数据
若想自定义GSON转换器请参考:https://sites.google.com/site/gson/gson-user-guide 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);

其实自定义个GSON转换器都不太常用,可能我们更加需要XML转换器
框架源码里面示例实现了个SimpleXML转换器:github地址
使用了Simple框架
替换转换器代码

RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint("https://api.soundcloud.com").setConverter(new SimpleXMLConverter()).build();SoundCloudService service = restAdapter.create(SoundCloudService.class);

框架实现的转换器列表地址

自定义错误处理器
需要实现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();

注:被检测的错误,必须被声明在接口中,最好如同上面代码做的那样传递cause对象.

日志
为了更详细查看请求和响应,你可以直接在RestAdapter调用日志级别方法,四个等级
BASIC, FULL, HEADERS, and NONE.代码如下:

RestAdapter restAdapter = new RestAdapter.Builder().setLogLevel(RestAdapter.LogLevel.FULL).setEndpoint("https://api.github.com").build();

注:这当然是调试阶段使用,后面记得删了.

JAR下载:地址
Maven:

<dependency><groupId>com.squareup.retrofit</groupId><artifactId>retrofit</artifactId><version>(insert latest version)</version>
</dependency>

Gradle

compile 'com.squareup.retrofit:retrofit:(insert latest version)'

自动使用okhttp框架
maven

<dependency><groupId>com.squareup.okhttp</groupId><artifactId>okhttp</artifactId><version>2.0.0</version>
</dependency>

gradle

compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'
compile 'com.squareup.okhttp:okhttp:2.0.0'

最后献上相关文章:

retrofit实现分析

这篇关于Retrofit框架使用笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056429

相关文章

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解