前段时间研究了下Android里面非常火爆的网络请求库OkHttp,这篇文章主要来介绍下OkHttp的常用请求的使用方式,后面一篇文章会介绍本人基于OkHttp封装的一个操作更简单、更适用于项目的网络请求库TigerOkHttp,其源码及Demo地址为:https://github.com/huyongli/TigerOkHttp

一、说明

对于OkHttp的基本介绍,以及为什么要使用OkHttp而不再使用HttpURLConnection或者是HttpClient,各位自己找度娘去,我这里就不再废话了。

使用OkHttp之前,需要先下载OkHttp.jar包,大家可以在https://github.com/square/okhttp去下载OkHttp的最新jar包以及源码,

同时因为OkHttp内部依赖okio,所以大家还要自行下载okio.jar包,下载地址在这里https://github.com/square/okio

二、使用教程

1.Get请求

  1. //创建OkHttpClient对象,用于稍后发起请求
  2. OkHttpClient client = new OkHttpClient();
  3. //根据请求URL创建一个Request对象
  4. Request request = new Request.Builder().url("https://github.com/huyongli/TigerOkHttp").build();
  5. //根据Request对象发起Get同步Http请求
  6. Response response = client.newCall(request).execute();
  7. //根据Request对象发起Get异步Http请求,并添加请求回调
  8. client.newCall(request).enqueue(new Callback() {
  9. @Override
  10. public void onResponse(final Response response) throws IOException {
  11. //请求成功,此处对请求结果进行处理
  12. //String result = response.body().string();
  13. //InputStream is = response.body().byteStream();
  14. //byte[] bytes = response.body().bytes();
  15. }
  16. @Override
  17. public void onFailure(Request request, IOException e) {
  18. //请求失败
  19. }
  20. });

上面的代码示例演示了OkHttp中一个普通的Http  get请求是如何实现的,对于上面的代码,作一下简单的说明

1. 既然是get请求,当然得先构造好你要请求的URL

2.有了请求URL,紧接着就是需要通过这个URL构造一个请求对象Request

3.当然有时候可能你需要对这个Http请求添加一些自定义的请求头信息header,这时你在构造Request对象之前通过Request.Builder
builder = new Request.Builder()
创建的builder 对象来添加自己需要添加的请求头信息builder.addHeader(key,
value)

4.OkHttp是自带请求缓存控制策略的,如果你想改变某个请求的缓存控制策略,你也可以通过builder对象来修改缓存策略builder.cacheControl()

5.通过上述步骤构造好请求对象Request之后,通过OkHttpClient创建一个Call任务对象,这个对象有execute()和cancel()等方法对Call任务对象进行执行和取消

6.如果是同步阻塞请求的话,直接执行Call对象的execute()方法即可得到请求结果。

7.如果是异步请求的话,就需要执行Call对象的enqueue(new
Callback(){})
方法,将任务对象添加到任务请求调度队列中,同时添加请求回调接口。

8.请求成功之后,可以得到一个Response对象,如果想获得返回的字符串结果则可以通过response.body().string(),如果想获得返回结果的二进制数据的话可以通过response.body().bytes(),如果想获得返回的InputStream的话可以通过response.body().byteStream()

9.通过上面我们可以发现在Response对象中我们可以获取InputStream对象,所以从此处我们可以看出在异步请求onResponse(Response response)回调方法中我们可以通过IO方式来进行写文件,所以在此回调中我们可以进行大文件的下载处理,同时也说明此回调并不是在UI线程中执行的,所以此处如果要进行UI操作的话各位需要自行处理下。

2.Post请求

上面对OkHttp的Get请求分析完之后,OkHttp的整个请求流程和处理流程就清晰,Post请求和Get请求的流程都是一样,区别只是在于Request对象构造上有区别。

  1. //创建OkHttpClient对象
  2. OkHttpClient client = new OkHttpClient();
  3. //通过FormEncodingBuilder对象添加多个请求参数键值对
  4. FormEncodingBuilder builder = new FormEncodingBuilder();
  5. builder.add("method", "post").add("param", value);
  6. //通过FormEncodingBuilder对象构造Post请求体
  7. RequestBody body = builder.build();
  8. //通过请求地址和请求体构造Post请求对象Request
  9. Request request = new Request.Builder().url(url).post(body).build();

上面的代码演示了如何构造普通Post请求(不包含文件上传)的请求体和请求对象,请求对象构造成功之后,后面的请求过程和处理流程就和Get请求是一样的了。

3.文件上传

  1. //多个图片文件列表
  2. List<File> list = new ArrayList<File>();
  3. //多文件表单上传构造器
  4. MultipartBuilder multipartBuilder = new MultipartBuilder().type(MultipartBuilder.FORM);
  5. //添加一个文本表单参数
  6. multipartBuilder.addFormDataPart("method", "upload上传");
  7. for(File file : list) {
  8. if(file.exists()) {
  9. multipartBuilder.addFormDataPart(file.getName(), file.getName(), RequestBody.create(MediaType.parse("image/png"), file));
  10. }
  11. }
  12. //构造文件上传时的请求对象Request
  13. Request request = new Request.Builder().url(url).post(multipartBuilder.build()).build();

文件上传时的重点是通过MultipartBuilder构造器添加要上传的文件和表单参数,OkHttp中文件上传时,没有可以直接实现上传进度显示的接口,这个需要手动对OkHttp中的请求体进行扩展,这篇文章中就不写了,在下篇文章介绍TigerOkHttp时我会进行介绍。

4.文件下载

文件下载功能在第一点Get请求的几点说明中已经介绍过了,无论你是通过Get请求还是Post请求,只需要从请求结果对象Response中获取到结果输入流InputStream,然后通过IO操作进行写文件即可实现文件下载功能。在通过IO操作写文件时,也可以自行实现下载进度显示的功能。

5.编码问题

在OkHttp中,无论是Get请求还是Post请求所有参数的编码方式都是默认采用UTF-8的编码方式进行编码。

所以在进行Get请求或Post请求时,文本参数都不需要我们进行手动编码,但是在服务端进行参数解析时,需要做简单的处理,这里我只说明tomcat下运行的Java后台服务的处理方式:

1.针对Get请求,我们只需要在tomcat的server.xml文件中设置默认编码方式(URIEncoding=”UTF-8″ )为UTF-8即可,注意此编码设置只对Get请求有效。

2.针对Post请求,我们在解析获取参数值之前需要手动设置请求的编码方式为UTF-8,如:req.setCharacterEncoding(“UTF-8”);

以上就是OkHttp最基本的用法,下篇文章我会介绍我自己基于OkHttp更进一步封装的网络请求库TigerOkHttp,它主要包含了如下功能特点:

1.一般的get同步阻塞请求和异步请求

2.一般的post同步阻塞请求和异步请求

3.实现了文件上传功能(包含文件上传进度回调显示)

4.实现了大文件下载功能,只需要指定文件下载路径即可,也包含了下载进度的回调显示

5.实现了请求结果的自动解析,用户也可以根据需求扩展自定义结果解析类

6.对所有请求都支持直接将结果解析转换为JavaBean对象或集合

7.支持对返回结果结构的自定义,例如设置返回结果结构为:{flag:1|0,error:错误信息,result:请求结果},结果解析的时候会按照此结构进行结果解析

8.支持取消某个请求

Android的OkHttp开源框架的使用方法的更多相关文章

  1. Android常用优秀开源框架

    Android常用优秀开源框架 https://github.com/Ericsongyl/AOSF AOSF:全称为Android Open Source Framework,即Android优秀开 ...

  2. Android开发常用开源框架:图片处理

    https://blog.csdn.net/SGQ_CSDN/article/details/79910709 Android开发常用开源框架:图片处理 框架名称 功能描述 Android Unive ...

  3. Android中使用开源框架android-image-indicator实现图片轮播部署

    之前的博文中有介绍关于图片轮播的实现方式,分别为(含超链接): 1.<Android中使用ViewFlipper实现屏幕切换> 2.<Android中使用ViewPager实现屏幕页 ...

  4. Android中使用开源框架PagerSlidingTabStrip实现导航标题

    此开源框架官网地址:https://github.com/astuetz/PagerSlidingTabStrip 可以理解为配合ViewPager使用的交互式页面指示器控件. 话不多说,先上效果图: ...

  5. Android常用优秀开源框架整理

    前言 AOSF:全称为Android Open Source Framework,即Android优秀开源框架汇总.包含:网络请求okhttp,图片下载glide,数据库greenDAO,链式框架Rx ...

  6. Android开发之开源框架OKHTTP的Get请求代码,得到json字符串方法

      <span style="white-space:pre"> </span><pre name="code" class=&q ...

  7. Android中使用开源框架Fresco处理图片

    本文为原创博文,转载请注明原文链接:http://www.cnblogs.com/panhouye/p/6278116.html 关于Fresco的优点大家自行谷歌吧,它太强大太优秀了,我这一片小博文 ...

  8. Android 优秀的开源框架整理

    第一部分:系统架构 thinkAndroid https://github.com/white-cat/ThinkAndroid ThinkAndroid是一个免费的开源的.简易的.遵循Apache2 ...

  9. Android中使用开源框架citypickerview实现省市区三级联动选择

    1.概述 记得之前做商城项目,需要在地址选择中实现省市区三级联动,方便用户快速的填写地址,当时使用的是一个叫做android-wheel 的开源控件,当时感觉非常好用,唯一麻烦的是需要自己整理并解析省 ...

随机推荐

  1. Nginx+Keepalived负载均衡高可用

    Nginx+Keepalived负载均衡高可用方案: Nginx 使用平台:unix.linux.windows. 功能: A.www web服务  http 80 b.负载均衡(方向代理proxy) ...

  2. C语言的格式符

    转至:http://blog.csdn.net/zhanzheng520/article/details/10434791   一.格式符含义 1.d格式符:按十进制格式输出. %d          ...

  3. 关于HDPHP,HDCMS 安装,空白问题

    这几天,框论坛发现,HDPHP,号称还不错. 微信,支付宝支付,短信,阿里云OSS,权限认证等,都有.对开发人员来说很好了.. 马上下载来试试, HDPHP官方文档说需要PHP5.6,不过貌似我5.5 ...

  4. JAVA并发编程学习笔记------协作对象之间发生的死锁

    一. 如果在持有锁时调用某个外部方法,那么将出现活跃性问题.在这个外部方法中可能会获取其他锁(这可能会产生死锁),或者阻塞时间过长,导致其他线程无法及时获得当前被持有的锁.如下代码: public c ...

  5. ABP官方文档翻译 6.2.1 ASP.NET Core集成

    ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...

  6. xBIM 使用Linq 来优化查询

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

  7. Eclipse EE遇到问题记录

    Eclipse EE可以进行Java web的开发,下面记录了使用Eclipse EE调试时遇到的一些问题. 1.tomcat启动timeout的设置,双击server,主窗口就变为了server的配 ...

  8. BZOJ 1982: [Spoj 2021]Moving Pebbles [博弈论 对称]

    给你N堆Stone,两个人玩游戏. 每次任选一堆,首先拿掉至少一个石头,然后移动任意个石子到任意堆中. 谁不能移动了,谁就输了... 以前在poj做过已经忘记了... 构造对称,选最多的一堆往其他堆分 ...

  9. POJ 3581 Sequence [后缀数组]

    Sequence Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6911   Accepted: 1543 Case Tim ...

  10. [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

    转载自:http://blog.csdn.net/eastmount/article/details/51231852 一. 文章介绍 源码下载地址:http://download.csdn.net/ ...