简单介绍及官方文档的坑

  • 官方文档 http://square.github.io/retrofit/
  • Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp做网络请求
  • Retrofit也就成了最火的网络请求框架之一,想着来研究一下Retrofit了…先看了看官方文档,发现各种坑,Retrofit是结合着注解来做的,思路新颖,但是不符合大部分开发程序员的思维习惯,一开始使用的时候,不太适应…附上官方文档的介绍
Retrofit turns your HTTP API into a Java interface.public interface GitHubService {@GET("users/{user}/repos")Call<List<Repo>> listRepos(@Path("user") String user);
}
The Retrofit class generates an implementation of the GitHubService interface.Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").build();GitHubService service = retrofit.create(GitHubService.class);
Each Call from the created GitHubService can make a synchronous or asynchronous HTTP request to the remote webserver.Call<List<Repo>> repos = service.listRepos("octocat");

快速入门,从Hello 百度走起

  • 想快速入门Retrofit,我们最简单的想法是能请求一下www.baidu.com,然后将信息打印一下,但是发现在Retrofit入门的时候,访问www.baidu.com竟然成了奢求…,大部分的文章都是模仿着官方文档来写的…
  • 先一起来写一个访问百度,展示数据的示例
  • 第一步:gradle文件中进行配置
 compile 'com.squareup.retrofit2:retrofit:2.0.0-beta2'compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta2'compile 'com.squareup.retrofit2:converter-scalars:2.0.0'
  • 第二步:定义一个接口,接口中使用注解注明请求方式,及对应的请求路径
public interface DataService {//指定get请求方式  指定路径 有时候路径除了baseUrl还有一部分比如 http://write.blog.csdn.net/mdeditor  //http://write.blog.csdn.net/ 一般是baseUrl//而 mdeditor是相对路径的@GETCall<String> baidu(@Url String url);
}
  • 第二步:进行请求
//创建Retrofit对象Retrofit retrofit = new Retrofit.Builder()//指定baseurl,这里有坑,最后后缀出带着“/” .baseUrl("http://www.baidu.com/")//设置内容格式,这种对应的数据返回值是String类型.addConverterFactory(ScalarsConverterFactory.create())//定义client类型.client(new OkHttpClient())//创建.build();//通过retrofit和定义的有网络访问方法的接口关联DataService dataService = retrofit.create(DataService.class);//在这里又重新设定了一下baidu的地址,是因为Retrofit要求传入具体,如果是决定路径的话,路径会将baseUrl覆盖掉Call<String> baidu = dataService.baidu("http://wwww.baidu.com");//执行异步请求baidu.enqueue(new Callback<String>() {@Overridepublic void onResponse(Call<String> call, Response<String> response) {Toast.makeText(MainActivity.this,  response.body(), Toast.LENGTH_SHORT).show();}@Overridepublic void onFailure(Call<String> call, Throwable t) {}});
  • 通过上述代码,咱们就可以完整的看见百度的html界面了,算是对Retrofit做一个入门

其他请求-QQ吉凶测试

  • 第三方网站聚合数据上的测试地址,key有可能过期,大家测的时候可以自己申请key 官网 https://www.juhe.cn

    http://japi.juhe.cn/qqevaluate/qq?key=96efc220a4196fafdfade0c9d1e897ac&qq=295424589

  • 返回数据内容

{"error_code":0,"reason":"success","result":{"data":{"conclusion":"[大吉+官运+财运+才艺]如龙得云,青云直上,智谋奋进,才略奏功","analysis":"欲望难足希望高,计谋成功财力豪,猜疑嫉妒性自改,如龙乘云势运开。智能超人贯彻大志,富贵无比,不甘寂寞,叱吒风云之大吉数,但容易发生牢骚及贪心、欲望太多而永不知足,为其缺点。切忌沉迷投机,可免贻误前程。"}}}

对于Retrofit可以直接生成对应的json

  • 第一步:生成对应的Bean,例如 QQData

  • 第二步:在接口中定义请求方法

    • GET请求
    • 请求相对路径
    • 参数内容
    • Call代表是一个请求
public interface DataService {@GET("/qqevaluate/qq")Call<QQData> getQQData(@Query("key") String appkey, @Query("qq") String qq);}
  • 第三步:开始请求
 Retrofit retrofit = new Retrofit.Builder().baseUrl("http://japi.juhe.cn").addConverterFactory(GsonConverterFactory.create()).build();DataService dataService = retrofit.create(DataService.class);final Call<QQData> qqData = dataService.getQQData("96efc220a4196fafdfade0c9d1e897ac", "11111111");qqData.enqueue(new Callback<QQData>() {@Overridepublic void onResponse(Response<QQData> response, Retrofit retrofit) {String reason = response.body().getReason();Toast.makeText(MainActivity.this, response.body().getReason(), Toast.LENGTH_SHORT).show();}@Overridepublic void onFailure(Throwable t) {Toast.makeText(MainActivity.this, "--" + t.getMessage().toString(), Toast.LENGTH_SHORT).show();}});
  • 以上是Retrofit的简单应用,当然对于Retrofit还有一些其他的方式
 ///https://zhidao.baidu.com/daily/view//路径拼接的形式,v代表是其中的一个参数,可以在这个位置进行拼接@GET("daily/{v}")Call<String> baiduzhidao(@Path("v") String v);//在注解中指定路径,定义相对应的参数的集合@GET("qqevaluate/qq")Call<QQData> getQQDataMap(@QueryMap Map<String,String> map);//对应Post请求,参数的注解是@Field@POST("qqevaluate/qq")Call<QQData>  postQQData(@Field("key") String key,@Field("qq") String qq);//必须指定进行表单编码@FormUrlEncoded//指定参数是map形式 @FieldMap@POST("qqevaluate/qq")Call<QQData> postQQDataMap(@FieldMap Map<String,String> map);

自己封装一个简易的Retrofit请求

  • 对于Retrofit,我们发现确实有一些特色,请求也比较简单,但是,当在一个大的项目中,不可能每一请求都到接口中声明一下。所以有必要进行简易的封装

  • 封装一个简易的请求接口


public interface ProjectAPI {//http://www.baidu.com/aaa?key=123&qq=aaa@GETCall<String> getMethod(@Url String url);@FormUrlEncoded@POSTCall<String> postMethod(@Url String url, @FieldMap Map<String,String> map);}
  • 定义一个网络请求的管理类,需要注意的是这里的baseUrl创建了,如果url是在其基础上的,就会进行相应的拼接,如果url是全路径,就会覆盖掉baseUrl
public class HttpManger {/*** @param baseUrl  基础Url* @param url       附加Url* @param callback  添加请求回调,这里直接使用的是Retrofit自身的回调接口*/public static void getMethod(String baseUrl, String url, final Callback<String> callback) {Retrofit retrofit = new Retrofit.Builder().baseUrl(baseUrl).addConverterFactory(ScalarsConverterFactory.create()).build();ProjectAPI projectAPI = retrofit.create(ProjectAPI.class);Call<String> call = projectAPI.getMethod(url);call.enqueue(new Callback<String>() {@Overridepublic void onResponse(Call<String> call, Response<String> response) {//调用回调callback.onResponse(call, response);}@Overridepublic void onFailure(Call<String> call, Throwable t) {//调用回调callback.onFailure(call, t);}});}
  • Post请求方式的封装,参数通过map集合的方式进行传递
  public static void postMethod(String baseUrl, String url, Map<String, String> map, final Callback<String> callback) {//指定客户端Retrofit retrofit = new Retrofit.Builder().baseUrl(baseUrl).client(httpClient).addConverterFactory(ScalarsConverterFactory.create()).build();ProjectAPI projectAPI = retrofit.create(ProjectAPI.class);Call<String> call = projectAPI.postMethod(url, map);call.enqueue(new Callback<String>() {@Overridepublic void onResponse(Call<String> call, Response<String> response) {callback.onResponse(call, response);}@Overridepublic void onFailure(Call<String> call, Throwable t) {callback.onFailure(call, t);}});}
  • 方法调用-Get方式调用,这里的key大家可以替换一下
 HttpManger.getMethod("http://japi.juhe.cn/", "http://japi.juhe.cn/qqevaluate/qq?key=96efc220a4196fafdfade0c9d1e897ac&qq=295424589", new Callback<String>() {@Overridepublic void onResponse(Call<String> call, Response<String> response) {Toast.makeText(MainActivity.this, "--"+response.body(), Toast.LENGTH_SHORT).show();}@Overridepublic void onFailure(Call<String> call, Throwable t) {Toast.makeText(MainActivity.this, "--"+t.getMessage(), Toast.LENGTH_SHORT).show();}});
  • POST方式调用
Map<String, String> map=new HashMap<>();map.put("key","96efc220a4196fafdfade0c9d1e897ac");map.put("qq","111111111");HttpManger.postMethod(false,false,"http://japi.juhe.cn/","qqevaluate/qq",map,new Callback<String>(){@Overridepublic void onResponse(Call<String> call, Response<String> response) {Toast.makeText(MainActivity.this, "--"+response.body(), Toast.LENGTH_SHORT).show();}@Overridepublic void onFailure(Call<String> call, Throwable t) {Toast.makeText(MainActivity.this, "--"+t.getMessage(), Toast.LENGTH_SHORT).show();}});
  • 正好最近做到了Cookie的应用,在本讲解中进行一下讲解
  • 创建一个保存Cookie的拦截器,用于获取服务器打给客户端的Cookie信息
public class SaveCookiesInterceptor implements Interceptor {@Overridepublic okhttp3.Response intercept(Chain chain) throws IOException {//获取到响应Response originalResponse = chain.proceed(chain.request());//进行Cookie获取以及字符串的拼接,Cookie在使用的过程要//根据具体公司来定if (!originalResponse.headers("Set-Cookie").isEmpty()) {//根据Set-Cookie获取出的信息for (String header : originalResponse.headers("Set-Cookie")) {Log.i("AAAA----","=="+header+"==");String cookie = header.substring(0, header.indexOf(";") + 1);stringBuilder.append(cookie);}}//拼接时完成后将该Cookie保存到 SharedPreferences中SharedPreferencesUtils.saveString(MyApplication.context,"cookie",stringBuilder.toString());return originalResponse;}
}
  • 创建读取Cookie的拦截器
public class ReadCookiesInterceptor implements Interceptor {@Overridepublic okhttp3.Response intercept(Chain chain) throws IOException {Request.Builder builder = chain.request().newBuilder();String cookie = SharedPreferencesUtils.getString(MyApplication.context, "cookie", "");//将cookie添加到请求头中builder.addHeader("Cookie", cookie);return chain.proceed(builder.build());}
}
  • 在HttpManager中指定拦截器的使用,但是并不是所有的请求都要保存cookie或者所有的请求都要读取cookie,所以我们添加一个判断
 /*** * @param isReadCookie  是否要读取cookie* @param isSaveCookie  是否要保存cookie* @param baseUrl        基础Url* @param url            要拼接的url   * @param map            参数集合* @param callback       请求回调*/public static void postMethod(boolean isReadCookie, boolean isSaveCookie, String baseUrl, String url, Map<String, String> map, final Callback<String> callback) {OkHttpClient httpClient = null;if (isReadCookie && !isSaveCookie) {httpClient = new OkHttpClient.Builder().addInterceptor(new ReadCookiesInterceptor()).build();Log.i("AAA","只读不写");}if (isSaveCookie && !isReadCookie) {httpClient = new OkHttpClient.Builder().addInterceptor(new SaveCookiesInterceptor()).build();Log.i("AAA","只写不读");}if (isSaveCookie && isReadCookie) {httpClient = new OkHttpClient.Builder().addInterceptor(new SaveCookiesInterceptor()).addInterceptor(new ReadCookiesInterceptor()).build();Log.i("AAA","又写又读");} if (!isSaveCookie && !isReadCookie){httpClient = new OkHttpClient.Builder().build();Log.i("AAA","不写不读");}//指定客户端Retrofit retrofit = new Retrofit.Builder().baseUrl(baseUrl).client(httpClient).addConverterFactory(ScalarsConverterFactory.create()).build();
  • 好了,暂时写到这里,以上就是对Retrofit的一个简易封装,当然网上也有一些大神对Retrofit进行了封装。

参考资料:
Retrofit 使用详解http://blog.csdn.net/duanyy1990/article/details/52139294
Retrofit顶级封装 http://blog.csdn.net/gengqiquan/article/details/52329259
github引用地址 https://github.com/gengqiquan/HttpUtil

Retrofit 最简单的快速入门及自己封装相关推荐

  1. Retrofit 最简单的快速入门及封装

    Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp ...

  2. el-admin框架简单解析-快速入门(前端部分)

    目录 el-admin 简单了解 使用框架的四大步 el-admin前端部分解析 前端Vue目录结构 Layout 布局 mixins 混入模式 router 路由 store 状态管理 utils ...

  3. ccs一个简单的快速入门

    文章目录 1. 什么是css 网址 1.1 什么是css 1.2 发展史. 2.快速入门 选择器 1.三大基本选择器 2. 层次选择器 3.结构伪类选择器 4. 属性选择器(常用) 样式 三大样式 3 ...

  4. Retrofit+RxJava简单使用(入门专用= - =)

    首先老规矩加入所需要的依赖 这里要根据自己的gradle进行适配的依赖,否则会引起不必要的错误!!! 另外Retrofit是基于Okhttp请求,需要进行网络请求,所以这里我们还要加入网络权限:第一条 ...

  5. Freemarker简单概述及其数据类型的简单学习—快速入门(一)

    FreeMarker的主要学习内容 一.FreeMarker概述 FreeMarker中文官方手册(可结合学习)http://freemarker.foofun.cn/ FreeMarker学习笔记源 ...

  6. EventBus3.0简单使用快速入门

    加入引用 implementation 'org.greenrobot:eventbus:3.0.0' 自定义一个事件类 public class EventBusMessage {public St ...

  7. EasyX简单绘图快速入门

    众所周知EasyX是一款在C++环境上运行的图形交互库,如果你觉得C\C++好无聊,你可以玩玩这个,官网也有下载链接,我这里有15年的版本,但是无法发链接,如果想要的可以在评论区留言或者私信我 在De ...

  8. Shiro第一个程序:官方快速入门程序Qucickstart详解教程

    目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...

  9. ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例

    前言 最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录. 首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开 ...

最新文章

  1. axios请求接口http_使用axios请求接口,几种content-type的区别详解
  2. Spring Aop面向切面编程自动注入
  3. Parity Game CodeForces - 298C
  4. linux 下停止监听程序,Linux下启动Oracle服务和监听程序步骤
  5. c web mysql数据库_C连接Mysql数据库代码
  6. linux服务器重启ctrl,Linux禁止Ctrl+Alt+Del重启
  7. “this”不能在常量表达式中使用报错的解决方法
  8. SQL Server 数据库调整表中列的顺序操作
  9. tensorflow精进之路(二十四)——Object Detection API目标检测(中)(COCO数据集训练的模型—ssd_mobilenet_v1_coco模型)
  10. innodb下的mvcc_Mysql事务隔离以及MVCC实现原理
  11. 省选专练之数学 BZOJ2820 YY的GCD
  12. android缓存垃圾扫描功能吗,Android 系统缓存扫描与清理方法分析
  13. mybatis输出SQL格式化
  14. ZABBIX 监控WEB服务 统计PV和UV
  15. 安卓SDK——广告植入
  16. 模拟器修改hosts解析
  17. js html页面无嵌套导出的excel,javascript – Excel导出为html无法在Excel 2016中显示边框...
  18. N81 UCWEB 7.0,UC浏览器7.0版本
  19. ubuntu下cron不执行的常见问题
  20. 如何解压war后缀的文件:

热门文章

  1. LuaStudio源码分析2资源文件
  2. 大数据篇(3)在学习大数据的过程中教会你煮菜!!!
  3. [系统分享]Windows 10 家庭中文版 纯净无捆绑
  4. kubernetes ingress路由配置http body大小限制,访问k8s服务的时候报错:413 Request Entity Too Large
  5. Kubernetes的 apply命令和干运行--dry-run=server
  6. 算法寒假实习面试经过之 十一贝(offer) 联想研究院(电话一面 被拒)
  7. 5G网络硬盘,100M文件大小,联想研究院发布联想社区化数据服务
  8. 详解:502 Bad Gateway nginx/xxx
  9. 百度地图三维盒子模型标注
  10. 可以强制看非好友的朋友圈吗?