【Android 进阶】Retrofit2 目前最优雅的网络请求框架
来源:互联网 发布:windows store被卸载了 编辑:程序博客网 时间:2024/06/11 21:36
身为 Geek 的我们,面对不断更新换代的技术是不是有点感到迷茫呢?其实只要掌握正确的学习方法,新的技术也就不畏惧了。
福利来了
推荐一位大牛【人称:面哥】呕心沥血的一篇经验分享:
程序员之路-学习经验总结分享
正是面哥的鞭策,我决定开始看英文的技术文档,学习新技术也是直接看官网的技术文档,本篇文章就是我在 Retrofit2 的官网看完英文文档 Retrofit 以及参考多篇博文之后总结出来的。
欢迎关注我的微信公众号
不只是原创技术文章,更多的是对生活的思考总结
Retrofit
Retrofit
是一个 Square 开发的类型安全的 REST 安卓客户端请求库。这个库为网络认证、API 请求以及用 OkHttp 发送网络请求提供了强大的框架 。
Retrofit 把 REST API 返回的数据转化为 Java 对象,就像 ORM 框架那样,把数据库内的存储的数据转化为相应的 Java
bean对象。 那么我们知道 Retrofit 是一个类型安全的网络框架,而且它是使用 REST API 的.
REST :
Resources Representational State Transfer
资源表现层状态转化 每一个 URI 代表一种资源
客户端和服务器之间,传递这种资源的某种 表现层(“资源”具体呈现出来的形式,比如.txt,.png,.jpg)
客户端通过四个 HTTP 动词(GET 用来获取资源,POST 用来新建或更新资源,PUT 用来更新资源,DELETE 用来删除资源)对服务器端资源进行操作,实现”表现层状态转化”
Retrofit 的简单使用
这里使用官方的例子介绍,也是以github的api做测试
第零步:
添加依赖:
//okHttp compile 'com.squareup.okhttp3:okhttp:3.2.0'//retrofit compile 'com.squareup.retrofit2:retrofit:2.0.2' compile 'com.squareup.retrofit2:converter-gson:2.0.2' compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
准备 api 接口:
https://api.github.com/users/wu-leaf/repos
需要封装的 javabean 类
其中我抽取出用来测试的属性如下4个:
public class Repo { private int id; private String name; private String full_name; private String fork; //get\set方法
第一步:
改造你的 HTTP API 变成一个 Java 接口。
public interface GitHubService { @GET("users/{user}/repos") Call<List<Repo>> listRepos(@Path("user") String user);}
第二步:
Retrofit 生成一个 GitHubService 接口的实现
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .build();GitHubService service = retrofit.create(GitHubService.class);
来自创建的 GitHubService 的每个调用都可以向远程Web服务器发出同步或异步 HTTP 请求。
Call<List<Repo>> repos = service.listRepos("wu-leaf");
第三步:
异步调用
repos.enqueue(new Callback<List<Repo>>() { @Override public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) { Log.d("TAG",response.body().toString()); response_tv.setText(response.body().toString()); } @Override public void onFailure(Call<List<Repo>> call, Throwable t) { if (call.isCanceled()){ Log.d("TAG",t.toString()); }else{ Log.e("TAG",t.toString()); } } });
同步调用:
当然不能在主线程调用
Call<Repo> clone = repos.clone(); Response<Repo> response = clone.execute(); Repobody = response.body();
这个例子是不是挺简单的,现在现在正式了解下常用 api 吧
常用 API 介绍
接口方法及其参数的注释指示如何处理请求。
请求方法
每个方法必须具有提供请求方法和相对 URL 的 HTTP 注释。 有五个内置注释:GET,POST,PUT,DELETE和HEAD。 资源的相对 URL 在注释中指定。
@GET("users/list")
您还可以在 URL 中指定查询参数。
@GET("users/list?sort=desc")
URL 相关操作
可以使用替换块(占位符)和方法上的参数动态更新请求 URL。 替换块是由{and}包围母数字字符串。 相应的参数必须使用相同的字符串用 @Path 注释。
@GET("group/{id}/users")Call<List<User>> groupList(@Path("id") int groupId);
也可以添加查询参数。
@GET("group/{id}/users")Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
对于复杂的查询参数组合,可以使用 Map。
@GET("group/{id}/users")Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
请求体
可以指定一个对象用作带有 @Body 注释的 HTTP 请求体。
@POST("users/new")Call<User> createUser(@Body User user);
该对象也将使用 Retrofit 实例上指定的转换器进行转换。 如果没有添加转换器,则只能使用 RequestBody。
提交表单和多部分数据
方法也可以声明为发送提交表单和多部分数据。
当方法上存在 @FormUrlEncoded 时,将发送表单编码的数据。 每个键值对都使用包含名称的@Field和提供值的对象进行注释。
@FormUrlEncoded@POST("user/edit")Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
多部分请求时使用 @Multipart 存在的方法。部分使用 @Part 注释声明。
@Multipart@PUT("user/photo")Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
多部分使用 Retrofit 的转换器,或者它们可以实现 RequestBody 来处理自己的序列化。
请求头操作
您可以使用 @Headers 注释为方法设置静态头。
@Headers("Cache-Control: max-age=640000")@GET("widget/list")Call<List<Widget>> widgetList();
@Headers({ "Accept: application/vnd.github.v3.full+json", "User-Agent: Retrofit-Sample-App"})@GET("users/{username}")Call<User> getUser(@Path("username") String username);
请注意,请求头不会相互覆盖。 具有相同名称的所有请求头将包含在请求中。
请求头可以使用 @Header 注释动态更新。 必须向 @Header 提供相应的参数。 如果值为 null,则将省略请求头。 否则,toString 将被调用的值,并使用结果。
@GET("user")Call<User> getUser(@Header("Authorization") String authorization)
需要添加到每个请求的标头可以使用 OkHttp 拦截器指定。
同步 vs 异步
Call 实例可以同步或异步执行。 每个实例只能使用一次,但调用 clone()将创建一个可以使用的新实例。
在 Android 上,回调将在主线程上执行。 在 JVM 上,回调将发生在执行 HTTP 请求的同一线程上。
Retrofit 配置
Retrofit 是将 API 接口转换为可调用对象的类。 默认情况下,Retrofit 将为您的平台提供正常默认值,但它允许自定义。
转换器:
默认情况下,Retrofit 只能将 HTTP 主体反序列化为 OkHttp 的 ResponseBody 类型,并且它只能接受 @Body 的 RequestBody 类型。
可以添加转换器以支持其他类型。 六个同级模块适应流行的序列化库为您方便使用。
- Gson: com.squareup.retrofit2:converter-gson
- Jackson: com.squareup.retrofit2:converter-jackson
- Moshi: com.squareup.retrofit2:converter-moshi
- Protobuf: com.squareup.retrofit2:converter-protobuf
- Wire: com.squareup.retrofit2:converter-wire
- Simple XML: com.squareup.retrofit2:converter-simplexml
- Scalars (primitives, boxed, and String):
- com.squareup.retrofit2:converter-scalars
下面是一个使用GsonConverterFactory类来生成GitHubService接口的实现的例子,它使用Gson进行反序列化。
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com") .addConverterFactory(GsonConverterFactory.create()) .build();GitHubService service = retrofit.create(GitHubService.class);
自定义转换器
如果您需要与使用 Retrofit 不支持开箱即用的内容格式(例如 YAML,txt,自定义格式)的API进行通信,或者希望使用其他库来实现现有格式,则可以轻松创建 你自己的转换器。 创建一个扩展 Converter.Factory 类的类,并在构建适配器时传递实例。
依赖方式:
MAVEN
<dependency> <groupId>com.squareup.retrofit2</groupId> <artifactId>retrofit</artifactId> <version>2.2.0</version></dependency>
GRADLE
compile 'com.squareup.retrofit2:retrofit:2.0.2' compile 'com.squareup.retrofit2:converter-gson:2.0.2'
Retrofit 需要至少 Java 7 或 Android 2.3。
PROGUARD 混淆
如果在项目中使用 Proguard,请在配置中添加以下行:
# Platform calls Class.forName on types which do not exist on Android to determine platform.-dontnote retrofit2.Platform# Platform used when running on RoboVM on iOS. Will not be used at runtime.-dontnote retrofit2.Platform$IOS$MainThreadExecutor# Platform used when running on Java 8 VMs. Will not be used at runtime.-dontwarn retrofit2.Platform$Java8# Retain generic type information for use by reflection by converters and adapters.-keepattributes Signature# Retain declared checked exceptions for use by a Proxy instance.-keepattributes Exceptions
推荐文章:
retrofit 介绍:
Retrofit 用法详解
国外的一系列教程
Retrofit 2.0: The biggest update yet on the best HTTP Client Library for Android
Android 网络框架 Retrofit2.0 介绍、使用和封装
你真的会用 Retrofit2 吗? Retrofit2 完全教程
Retrofit2 完全解析 探索与 okhttp 之间的关系
设置缓存:
Retrofit2.0+okHttp3 缓存机制以及遇到的问题
使用 Retrofit 和 OkHttp 实现网络缓存。无网读缓存,有网根据过期时间重新请求
浏览器 HTTP 缓存原理分析
浏览器缓存
Restful API 介绍
理解 RESTful 架构
深入浅出 REST
版权印为您的作品印上版权68298168
- 【Android 进阶】Retrofit2 目前最优雅的网络请求框架
- Android RxJava2+Retrofit2搭建网络请求框架
- Retrofit2+Rxjava2网络请求框架的封装
- Android 网络请求框架 Retrofit2.0实践使用总结
- Android 网络请求框架 Retrofit2.0实践使用总结
- Android 网络请求框架Retrofit2.0使用笔记
- 基于RxJava2+Retrofit2的简单易用网络请求框架
- 简单上手的Retrofit2+Rxjava2网络请求框架
- 简单实现RxJava2+Okhttp+Retrofit2的网络请求框架封装
- 目前最流行的运行时权限请求框架
- Android 网络框架_目前(2016年11月7日)最流行的网络框架OKHttp3
- Retrofit2网络框架的使用
- Java&Android开源库代码剖析】のandroid-async-http(如何设计一个优雅的Android网络请求框架,同...
- Android 你必须了解的网络框架Retrofit2.0
- Android 你必须了解的网络框架Retrofit2.0
- Android进阶#(4/12)HTTP网络请求_网络框架的设计与实现
- Android学习之网络请求库Retrofit2
- Android 实现Retrofit2.0请求网络
- SSH框架整合之那些年踩过的坑
- 1005. Spell It Right (20)
- 树和二叉树的转换
- 开发博客期间看到的优秀资料
- (function(){})()
- 【Android 进阶】Retrofit2 目前最优雅的网络请求框架
- web测试专题技术
- 《经久不衰的Spring框架:SpringMVC 统括》
- LeetCode 54. Spiral Matrix
- 12、spring的bean基础(4)
- SPOJ : Interesting Subset 想法题
- jQuery的属性与样式
- 队列,栈和递归
- HDU1018_Big Number_取10的对数