Retrofit学习入门

Retrofit的使用

  1. 设置权限与添加依赖
  2. 定义请求接口
  3. 通过创建一个retrofit生成一个接口的实现类(动态代理)
  4. 调用接口请求数据

设置权限与添加依赖

权限:首先确保在AndroidManifest.xml中请求了网络权限 :

<uses-permission android:name="android.permission.INTERNET" />

(2)Studio用户,在app/build.gradle文件中添加如下代码:

dependencies {compile'com.squareup.retrofit2:retrofit:2.0.2'compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'
}

定义请求接口

public interface GankioService {@GET("data/福利/10/{page}")Call<GirlData> getGirls(@Path("page") int page);@GET("data/Android/10/{page}")Call<AndroidData> getAndroidData(@Path("page") int page);
}

请求的URL可以在函数中使用替换块和参数进行动态更新,替换块是{ and }包围的字母数字组成的字符串,相应的参数必须使用相同的字符串被@Path进行注释

然后创建一个retrofit

public static GankioService buildGankioService() {if (mGankioService == null) {Retrofit retfGank = new Retrofit.Builder().baseUrl("http://gank.io/api/").addConverterFactory(GsonConverterFactory.create()).build();mGankioService = retfGank.create(GankioService.class);}return mGankioService;}

retfGank.create(GankioService.class)用到了动态代理

大家一看就发现了 create方法返回了一个动态代理对象,那么动态代理是什么呢 :
—在运行时, 动态代理类 实现了一个或者一组接口,目的是,其中任何一个接口的实例的方法调用将会被指派到统一的另一个接口的方法中。
InvocationHandler 中覆写的 invoke() 方法,在进行原本的方法调用之前或者之后,可以做点事情。
所以当我们调用 httpStores.getUser(hashMap);的时候其实是走了动态代理的invoke方法,在这里Retrofit巧妙的理由注解把接口转换成了一个HTTP请求

调用接口请求数据

 private void loadFromInternet(int page) {start = page;final Call<GirlData> girlDataCall = mService.getGirls(page);girlDataCall.enqueue(new Callback<GirlData>() {@Overridepublic void onResponse(Call<GirlData> call, Response<GirlData> response) {mGirlData = response.body();List<Girl> newGirls = mGirlData.getGirls();// check if newGirls should be added into local girlsif (checkShouldAdded(newGirls)){addGirlsToDB(newGirls);}else{shouldLoadFromInternet = false;}mView.showMore(newGirls);mView.finishRefresh();}@Overridepublic void onFailure(Call<GirlData> call, Throwable t) {mView.finishRefresh();mView.showSnackBar();}});}

其中GirlData是由接口返回的json数据格式决定的

public class GirlData {/*** error : false* results : [{"_id":"56eb5db867765933d9b0a8fc","_ns":"ganhuo","createdAt":"2016-03-18T09:45:28.259Z","desc":"3.18","publishedAt":"2016-03-18T12:18:39.928Z","source":"chrome","type":"福利","url":"http://ww1.sinaimg.cn/large/7a8aed7bjw1f20ruz456sj20go0p0wi3.jpg","used":true,"who":"张涵宇"},{"_id":"56e8d0bb67765933d8be90be","_ns":"ganhuo","createdAt":"2016-03-16T11:19:23.692Z","desc":"3.16","publishedAt":"2016-03-17T11:14:16.306Z","source":"chrome","type":"福利","url":"http://ww4.sinaimg.cn/large/7a8aed7bjw1f1yjc38i9oj20hs0qoq6k.jpg","used":true,"who":"张涵宇"},{"_id":"56e8ce3967765933d8be90bd","_ns":"ganhuo","createdAt":"2016-03-16T11:08:41.957Z","desc":"3.16","publishedAt":"2016-03-16T11:24:01.505Z","source":"chrome","type":"福利","url":"http://ww3.sinaimg.cn/large/610dc034gw1f1yj0vc3ntj20e60jc0ua.jpg","used":true,"who":"代码家"},{"_id":"56e764116776592d80511280","_ns":"ganhuo","createdAt":"2016-03-15T09:23:29.580Z","desc":"3.15","publishedAt":"2016-03-15T11:45:57.350Z","source":"chrome","type":"福利","url":"http://ww4.sinaimg.cn/large/7a8aed7bjw1f1xad7meu2j20dw0ku0vj.jpg","used":true,"who":"张涵宇"},{"_id":"56e619a46776591744cf05c0","_ns":"ganhuo","createdAt":"2016-03-14T09:53:40.126Z","desc":"3.14","publishedAt":"2016-03-14T11:55:19.66Z","source":"chrome","type":"福利","url":"http://ww1.sinaimg.cn/large/7a8aed7bjw1f1w5m7c9knj20go0p0ae4.jpg","used":true,"who":"张涵宇"},{"_id":"56e220ca67765966681b3a23","_ns":"ganhuo","createdAt":"2016-03-11T09:35:06.879Z","desc":"3.11--一周年快乐!!!","publishedAt":"2016-03-11T12:37:20.4Z","source":"chrome","type":"福利","url":"http://ww4.sinaimg.cn/large/7a8aed7bjw1f1so7l2u60j20zk1cy7g9.jpg","used":true,"who":"张涵宇"},{"_id":"56e0f0e86776596669cc2511","_ns":"ganhuo","createdAt":"2016-03-10T11:58:32.298Z","desc":"3.10","publishedAt":"2016-03-10T12:54:31.68Z","source":"chrome","type":"福利","url":"http://ww4.sinaimg.cn/large/7a8aed7bjw1f1rmqzruylj20hs0qon14.jpg","used":true,"who":"张涵宇"},{"_id":"56df891167765947765e2ad1","_ns":"ganhuo","createdAt":"2016-03-09T10:23:13.778Z","desc":"3.9","publishedAt":"2016-03-09T12:06:26.401Z","source":"chrome","type":"福利","url":"http://ww2.sinaimg.cn/large/7a8aed7bjw1f1qed6rs61j20ss0zkgrt.jpg","used":true,"who":"张涵宇"},{"_id":"56de2b1b6776592b6192bf46","_ns":"ganhuo","createdAt":"2016-03-08T09:30:03.578Z","desc":"3.8","publishedAt":"2016-03-08T12:55:59.161Z","source":"chrome","type":"福利","url":"http://ww3.sinaimg.cn/large/7a8aed7bjw1f1p77v97xpj20k00zkgpw.jpg","used":true,"who":"张涵宇"},{"_id":"56dd06b56776592b6246e979","_ns":"ganhuo","createdAt":"2016-03-07T12:42:29.664Z","desc":"3.7","publishedAt":"2016-03-07T12:49:24.470Z","source":"chrome","type":"福利","url":"http://ww1.sinaimg.cn/large/7a8aed7bjw1f1o75j517xj20u018iqnf.jpg","used":true,"who":"张涵宇"}]*/private boolean error;@SerializedName("results")private List<Girl> girls;public boolean isError() {return error;}public void setError(boolean error) {this.error = error;}public List<Girl> getGirls() {return girls;}public void setGirls(List<Girl> girls) {this.girls = girls;}}

是不是很简单而且很优雅
当然Retrofit的内部实现更优雅使用了很多设计模式这里推荐一位大神的文章

Retrofit分析-经典设计模式案例 - 简书

下面在说一下Okhttp的拦截器Interceptor 这真的是一个用起来非常爽的东西实现起来也非常简单
上代码

public class OkhttpInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
//取到当前请求的Requset
Request oldRequest = chain.request();
//取到请求的URL ,对你的URL进行修改,比如拼接一个UID什么的
//也可以使用addQueryParameter拼接参数
String url = oldRequest.url().toString()+"?="+uid;
Request newRequest = oldRequest.newBuilder()
.method(oldRequest.method(), oldRequest.body())
.url(url)
.build();
return chain.proceed(newRequest); }
}
当然你也可以增加请求参数
HttpUrl.Builder urlBuilder = oldRequest.url()newBuilder()
.scheme(oldRequest.url().scheme()) .addQueryParameter("key", "value")
只需要把url里的参数改为urlBuilder就行了

当然具体的业务需求也会遇到一些问题比如当我们的后台用的是https的时候,需要用到自签名证书,而OKhttp3已经没有了setCertificates设置自签名证书时怎么办,没关系我们还有万能的反射呢,下面我们就利用反射把https给过滤掉

SSLContext sc = null;
try {
sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { }
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { }
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null; } }
},
new SecureRandom());
} catch (Exception e) {
e.printStackTrace();
}
HostnameVerifier hv1 = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}};
String workerClassName = "okhttp3.OkHttpClient";
try {
sClient = new OkHttpClient.Builder().build();
Class workerClass = Class.forName(workerClassName);
Field hostnameVerifier = workerClass.getDeclaredField("hostnameVerifier"); hostnameVerifier.setAccessible(true);
hostnameVerifier.set(sClient, hv1);
Field sslSocketFactory = workerClass.getDeclaredField("sslSocketFactory"); sslSocketFactory.setAccessible(true);
sslSocketFactory.set(sClient, sc.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}

这个反射只是用在忽略https上,现在国内主流还是http,一般是用不上的,拦截器的话要debug看看清楚,你可以在http执行请求之前做一些操作,比如加一些请求参数或者是判断什么的。

参考链接

30分钟上手最火android网络请求框架Retrofit - 简书

Retrofit2.0使用 - OPEN 开发经验库

快速Android开发系列网络篇之Retrofit - AngelDevil - 博客园

Retrofit分析-经典设计模式案例 - 简书

Retrofit 解析 JSON 数据 - 简书

Retrofit2.0

我在stackoverflow回答的关于Retrofit2.0的相关问题

使用RxJava与Retrofit2.0使用的实例:Retrofit 2.0 RxJava Sample

JW大神的文章

吴小龙Android Retrofit 2.0使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

autotools入门笔记(一)

GNU autotools作用&#xff1a;收集系统配置信息并自动生成Makefile文件。 GNU autotools主要包括三个工具&#xff1a;autoconf、automake、libtool&#xff0c;还有很多辅助的工具&#xff0c;包括&#xff1a;autoheader、aclocal、autoscan。 ● autoscan检测源文件生成con…

本田、大众宣布智能路口研究新进展 以安全为重点

编译&#xff1a;网易智能摘要&#xff1a;每年&#xff0c;在十字路口发生的交通事故约占交通事故死亡人数的20%&#xff0c;这就是为什么汽车制造商和供应商都下定决心要创造出智能的十字路口&#xff0c;利用尖端技术来减少&#xff08;或者最好是能够避免&#xff09;在十字…

智能连接:5G、AI和IoT的组合如何改变美洲

来源&#xff1a;199IT互联网数据中心摘要&#xff1a;GSMA发布了新报告“智能连接&#xff1a;5G、AI和IoT的组合如何改变美洲”&#xff0c;强调了该地区如何从这些科技中受益。GSMA Intelligence预测&#xff0c;到2025年全球5G连接数量将达到13亿&#xff0c;覆盖全球40%的…

刚刚,生物学横扫诺贝尔3大奖,两名女性获奖!化学奖授予试管中的“进化论”...

来源&#xff1a;Deeptech深科技北京时间 10 月 3 日下午 5 点 45 分&#xff0c;2018 诺贝尔化学奖揭晓——诺贝尔委员会宣布&#xff0c;将此奖项一半颁给女科学家Frances H. Arnold&#xff0c;另一半则由George P. Smith、 Gregory P. Winter两人共享。此次诺贝尔化学奖表彰…

MACIOS Socket编程

转自 https://github.com/kejinlu/objc-doc/blob/master/Socket%E7%BC%96%E7%A8%8B.md 大纲 一.Socket简介二.BSD Socket编程准备 1.地址2.端口3.网络字节序4.半相关与全相关5.网络编程模型三.socket接口编程示例四.使用select五.使用kqueue六.使用流注:文档中设计涉及的代码也…

Android缓存学习入门

本文主要包括以下内容 利用LruCache实现内存缓存 利用DiskLruCache实现磁盘缓存 LruCache与DiskLruCache结合实例 利用了缓存机制的瀑布流实例 内存缓存的实现 public class PhotoWallAdapter extends ArrayAdapter<String> implements OnScrollListener {/*** 记录…

2018年人工智能之自动驾驶研究报告

来源&#xff1a;AMiner未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xf…

MyEclipse+Tomcat 启动时出现 configuration error occured during startup错误的解决方法

配置好Tomcat server&#xff0c;启动Tomcat&#xff0c;报如下错误&#xff1a; 解决方法如下&#xff1a; 选中Tomcat 6中的JDK一项&#xff0c;这里要特别注意&#xff0c;默认的是JRE的运行环境&#xff0c;这里要设定成JDK的&#xff0c;否则&#xff0c;MyEclipse无法正常…

硅谷首场AI硬件峰会干货报告:AI芯片井喷期即将到来

来源&#xff1a;智东西摘要&#xff1a;英特尔和英伟达对AI芯片的角逐&#xff0c;AI芯片行业的创业者机会。AI芯片不仅是未来十年半导体行业中最有希望的增长机会之一&#xff0c;而且还是有可能破坏传统计算市场的力量。现今 99&#xff05;的AI软件尚未编写&#xff0c;只有…

揭开神秘的“记忆”面纱!

来源&#xff1a;生物谷摘要&#xff1a;大脑记忆&#xff0c;对于我们每个人来说都是一种非常神奇的经历&#xff0c;近些年来&#xff0c;科学家们通过大量研究揭开了大脑记忆的奥秘&#xff0c;本文中&#xff0c;小编就对相关研究进行整理&#xff0c;分享给大家&#xff0…

数据结构之AVL树

AVL树是高度平衡的而二叉树。它的特点是&#xff1a;AVL树中任何节点的两个子树的高度最大差别为1。 旋转 如果在AVL树中进行插入或删除节点后&#xff0c;可能导致AVL树失去平衡。这种失去平衡的可以概括为4种姿态&#xff1a;LL(左左)&#xff0c;LR(左右)&#xff0c;RR(右…

语义分割领域开山之作:Google提出用神经网络搜索实现语义分割

来源&#xff1a; AI科技评论1. Introduction在 arxiv 浏览论文的时候&#xff0c;单独看文章名不知道属于 CV 哪个领域&#xff0c;怀着对一作 Liang-Chieh 敬畏的心&#xff0c;在摘要中扫描到 PASCAL VOC 2012 (semantic image segmentation)&#xff0c;浏览全文才明白&…

美国发布《评估和强化制造与国防工业基础及供应链弹性》报告

来源&#xff1a;蓝海星智库10月5日&#xff0c;美国发布《评估和强化制造与国防工业基础及供应链弹性》非密版报告&#xff0c;这是特朗普第13806号行政令要求的&#xff0c;由国防部工业政策办公室领导&#xff0c;商务部、劳工部、能源部和国土安全部等多个政府部门参与&…

本届诺奖得主“牛”在哪儿?专业数据分析给出论文干货

来源&#xff1a;科技日报摘要&#xff1a;北京时间10月2日下午5时52分&#xff0c;2018年诺贝尔物理学奖揭晓。获奖者为美国科学家阿瑟阿什金&#xff08;Arthur Ashkin&#xff09;、法国科学家热拉尔穆鲁&#xff08;Gerard Mourou&#xff09;和加拿大科学家唐娜斯特里克兰…

码农老婆的网店

码农老婆的网店&#xff1a;清泓美肤苑 转载于:https://www.cnblogs.com/8090sns/p/3162690.html

联合国发布AI报告:自动化和AI对亚洲有巨大影响【附报告下载】

来源&#xff1a;网易智能选自 | 联合国开发计划署编译 | nariiy、小小科技的飞速发展将深刻地影响社会变革&#xff0c;第四次工业革命以人工智能、自动化和生物科技等创新技术为代表&#xff0c;并将可能改变现有的生产、管理和治理体系&#xff0c;各国将如何接受并适应即将…

关于自动驾驶汽车法律政策的十点思考

来源&#xff1a;智车科技摘要&#xff1a;自动驾驶技术的发展将带来全面的社会和经济影响。历史地看&#xff0c;传统汽车成为了人们最主要的代步工具&#xff0c;塑造了如今的城市。那么&#xff0c;自动驾驶技术在重塑汽车的同时&#xff0c;也将塑造未来的城市和人类生活。…

数据结构之二叉堆

二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树&#xff0c;按照数据的排列方式可以分为两种&#xff1a;最大堆和最小堆。 最大堆&#xff1a;父结点的键值总是大于或等于任何一个子节点的键值&#xff1b; 最小堆&#xff1a;父结点的键值总是小于或等于任何一个子…

手术革命:这三家公司如何用AR技术辅助医疗手术

来源&#xff1a;资本实验室作为一种重要的职业&#xff0c;外科医生特别是手术医生需要具备丰富的专业知识&#xff0c;还需要掌握精准的手术操作技术&#xff0c;这都需要不断的学习与练习。受学习资料、手术练习材料等软硬件条件的制约&#xff0c;医生进行手术学习和手术操…

C# Socket初探

闲着无聊&#xff0c;写了个简单的C/S Socket程序&#xff0c;功能很简单&#xff0c;服务器在9000端口监听socket接入&#xff0c;只要有接入&#xff0c;就发送"Welcome."消息给客户端。 代码分2块&#xff0c;server端&#xff1a; class Program{static void Mai…