Android 初识Retrofit
什么是 Retrofit ?
Retrofit 是一套 RESTful 架构的 Android(Java) 客户端实现,基于注解,提供 JSON to POJO(Plain Ordinary Java Object ,简单 Java 对象),POJO to JSON,网络请求(POST,GET, PUT,DELETE 等)封装。
配置环境
在build.gradle中添加
..... //编译RxJava
compile 'io.reactivex:rxjava:1.1.6' //编译RxAndroid
compile 'io.reactivex:rxandroid:1.2.1' //编译Retrofit及其相关库,包括Gson
compile 'com.squareup.okhttp3:okhttp:3.3.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
说明:
Retrofit默认依赖于okhttp,所以需要集成okhttp。
API返回的数据为JSON格式,在此我使用的是Gson对返回数据解析.请使用最新版的Gson 。
接口
这里我们调试借助百度名人名言API
该接口的API主机地址为:http://apistore.baidu.com;
需要访问的接口:avatardata/mingrenmingyan/lookup;
需要一个key等于apikey的Header和一个keyword等于名人名言的查询关键字,而且该请求为GET请求.
接口返回json格式:
{
"total": ,
"result": [
{
"famous_name": "佚名",
"famous_saying": "婚姻是一家私人专门银行,存储真爱和默契,提取幸福和快乐。夫妻双方互为账户,且存折是活期的,可以随存随取,而家庭则是这家银行里的柜台,通过它,夫妻双方可以把自己的喜怒哀乐尽情地存进对方的银行里,并可随时提取微笑、鼓励、安慰、体贴、温柔等利息。"
},
{
"famous_name": "英国",
"famous_saying": "真爱无坦途"
},
{
"famous_name": "狄太人",
"famous_saying": "一个人真爱的时候,甚至会想不到自己是爱着对方。"
},
{
"famous_name": "佚名",
"famous_saying": "所有的阻碍,全是对真爱的淬炼。"
},
{
"famous_name": "罗兰",
"famous_saying": "当你真爱一个人的时候,你是会忘记自己的苦乐得失,而只是关心对方的苦乐得失的。"
},
{
"famous_name": "罗兰",
"famous_saying": "当两人之间有真爱情的时候,是不会考虑到年龄的问题,经济的条件,相貌的美丑,个子的高矮,等等外在的无关紧要的因素的。假如你们之间存在着这种问题,那你要先问问自己,是否真正在爱才好。"
},
{
"famous_name": "佚名",
"famous_saying": "真正的勇气是来自内心的真爱。"
},
{
"famous_name": "佚名",
"famous_saying": "天国般的幸福,存在于对真爱的希望。"
},
{
"famous_name": "狄太人",
"famous_saying": "一个人真爱的时候,甚至会想不到自己是爱着对方"
},
{
"famous_name": "Shakespeare",
"famous_saying": "通向真爱的路从无坦途。"
}
],
"error_code": ,
"reason": "Succes"
}
定义实体类
我们根据上面API返回的json数据来创建一个Famous数据对象,我们可以利用AndroidStudio插件 GsonFormat 快速方便的将json数据转为Java 对象。
Famous.java
public class Famous {
//下面变量的定义要与接口中的字段名字保持一致
public int total;
public int error_code;
public String reason;
public List<FamousInfo> result;
public static class FamousInfo {
public String famous_name;
public String famous_saying;
}
}
注意:如果你的字段有跟json不一样的,要在字段上面加注解@SerializedName,@SerializedName是指定Json格式中的Key名。
如上面的错误码字段,你就像定义为code,而服务器返回的是error_code,这个时候就应该这么写:
@SerializedName("error_code")
public int code;
使用
首先定义
public abstract class BaseApi {
public static final String API_SERVER = "服务器地址"
private static final OkHttpClient mOkHttpClient = new OkHttpClient();
private static Retrofit mRetrofit;
protected static Retrofit getRetrofit() {
if (Retrofit == null) {
Context context = Application.getInstance().getApplicationContext();
//设定30秒超时
mOkHttpClient.setConnectTimeout(, TimeUnit.SECONDS);
//设置拦截器,以用于自定义Cookies的设置
mOkHttpClient.networkInterceptors()
.add(new CookiesInterceptor(context));
//设置缓存目录
File cacheDirectory = new File(context.getCacheDir()
.getAbsolutePath(), "HttpCache");
Cache cache = new Cache(cacheDirectory, * * );
mOkHttpClient.setCache(cache);
//构建Retrofit
mRetrofit = new Retrofit.Builder()
//配置服务器路径
.baseUrl(API_SERVER + "/")
//设置日期解析格式,这样可以直接解析Date类型
.setDateFormat("yyyy-MM-dd HH:mm:ss")
//配置转化库,默认是Gson
.addConverterFactory(GsonConverterFactory.create())
//配置回调库,采用RxJava
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//设置OKHttpClient为网络客户端
.client(mOkHttpClient)
.build();
}
return mRetrofit;
}
}
定义FamousApi
public class FamousApi extends BaseApi{
//定义接口
private interface FamousService {
@GET("/avatardata/mingrenmingyan/lookup")
Observable<Famous> getFamousList(@Header("apiKey") String apiKey,
@Query("keyword") String keyword,
@Query("page") int page,
@Query("rows") int rows);
}
protected static final FamousService service = getRetrofit().create(FamousService.class);
public static Observable<UserProfileResp> getFamousList(int userId){
return service.getFamousList(userId);
}
}
最终使用:
public void getFamousList(){
FamousApi.getFamousList("apiKey","人才",,)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Famous>(){
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Famous famous) {
List<FamousInfo> list = famous.result;
//填充UI
}
});
}
如下效果:
参考demo:https://github.com/jdsjlzx/RetrofitDemo
Android 初识Retrofit的更多相关文章
- Android MVP+Retrofit+RxJava实践小结
关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...
- Android之Retrofit详解(转载)
说明:该文章转载于https://www.jianshu.com/p/a3e162261ab6 前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下 ...
- Android开发 - Retrofit 2 使用自签名的HTTPS证书进行API请求
为了确保数据传输的安全,现在越来越多的应用使用Https的方式来进行数据传输,使用https有很多有点,比如: HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议,要比ht ...
- 【Android】Retrofit 2.0 的使用
一.概述 Retrofit是Square公司开发的一个类型安全的Java和Android 的REST客户端库.来自官网的介绍: A type-safe HTTP client for Android ...
- Android RxJava+Retrofit完美封装
作者简介 本篇来自 小河马 的投稿,分享了自己是如何进行 RxJava+Retrofit 的封装.本文的技术点自然没话说,另外对于这种模块化的思路,希望能帮助到大家.最后提前祝大家周末愉快以及圣诞快乐 ...
- Android 基于Retrofit+Rxjava搭建的简单易用的网络架构
装逼開始之前,为大家推荐两篇文章,用来更好的学习Retrofit和Rxjava. 在这里我们要感谢互联网装逼行业勇于献身,甘于奉献的的大婶们. 我仅代表个人,给您们跪舔了. Retrofit:Retr ...
- Android 使用Retrofit请求API数据
概览 Retrofit 是一个Square开发的类型安全的REST安卓客户端请求库.这个库为网络认证.API请求以及用OkHttp发送网络请求提供了强大的框架 .理解OkHttp 的工作流程见 这个 ...
- Android OkHttp + Retrofit 取消请求的方法
本文链接 前言 在某一个界面,用户发起了一个网络请求,因为某种原因用户在网络请求完成前离开了当前界面,比较好的做法是取消这个网络请求.对于OkHttp来说,具体是调用Call的cancel方法. 如何 ...
- Android OkHttp + Retrofit 断点续传
本文链接 前面我们已经知道如何使用OkHttp+Retrofit下载文件. 下载文件时,可能会遇到一些意外情况,比如网络错误或是用户暂停了下载. 再次启动下载,如果又要从头开始,会白白浪费前面下载好的 ...
随机推荐
- docker 查看容器信息---格式化
镜像,ID,端口号,状态 docker ps -a --format "table {{.Image}}\t{{.ID}}\t{{.Ports}}\t{{.Status}}" 列出 ...
- 洛谷 P3224 [HNOI2012]永无乡
题面 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 \(n\) 座岛排名,名次用 \(1\) 到 \(n\) 来表示.某些岛 ...
- 查看centos CPU、内存、版本等信息
2018-12-29 查看当前linux的系统版本 cat /etc/redhat-release 查看内核版本 uname -a 查看CPU是32位还是64位 getconf LONG_BIT 查看 ...
- Java中String与Date格式之间的转换
转自:https://blog.csdn.net/angus_17/article/details/7656631 经常遇到string和date之间的转换,把相关的内容总结在这里吧: 1.strin ...
- HTTP请求的常用方法有哪些
HTTP请求的常用方法有:GET方法.POST方法.HEAD方法.PUT方法.DELETE方法.CONNECT方法.OPTIONS方法.TRACE方法.下面本篇文章就给大家介绍具体介绍一下HTTP请求 ...
- C语言实现全排列和回溯法总结
一.递归实现全排列 #include"cstdio" ]; void print_permutation(int n,int *A,int cur){ if(cur==n){ ;i ...
- springboot 上传图片与回显
在网上找了很多例子,不能完全契合自己的需求,自行整理了下.需求是这样的:项目小,所以不需要单独的图片服务器,图片保存在服务器中任意的地方,并且可以通过访问服务器来获取图片.话不多说上代码: 1.依赖 ...
- 【Javascript】Javascript原型与继承
一切都是对象! 以下的四种(undefined, number, string, boolean)属于简单的值类型,不是对象.剩下的几种情况——函数.数组.对象.null.new Number(10) ...
- PHP中的PHP_EOL和DIRECTORY_SEPARATOR
1. PHP_EOL是php中的换行符,跨平台 1.1.换行符: unix系列用 \n windows系列用 \r\n mac用 \r PHP中可以用PHP_EOL来替代,以提高代码的源代码级可移植性 ...
- ES6内容
iterator 遍历器iterator makeIterator是个遍历器,生成遍历器对象it var it = makeIterator(['a', 'b']); it.next() // { v ...