前段时间研究了下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请求

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

上面的代码示例演示了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对象构造上有区别。

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

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

3.文件上传

//多个图片文件列表 List list = new ArrayList();//多文件表单上传构造器MultipartBuilder multipartBuilder = new MultipartBuilder().type(MultipartBuilder.FORM);//添加一个文本表单参数multipartBuilder.addFormDataPart("method", "upload上传");for(File file : list) {    if(file.exists()) {        multipartBuilder.addFormDataPart(file.getName(), file.getName(), RequestBody.create(MediaType.parse("image/png"), file));    }}//构造文件上传时的请求对象RequestRequest 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.支持取消某个请求

原文地址请进我的独立博客

write by laohu

2016-1-5 17:09:57

更多相关文章

  1. 代码在android 8 上面正常运行在 android 9 上面却不能联网问题
  2. Android(安卓)自动更新之状态栏下载
  3. Android(安卓)内存溢出解决方案(OOM) 整理总结
  4. u-boot-2010.09-rc2 移植 6410 笔记之一
  5. Android小程序--模拟焰火粒子和瀑布粒子
  6. Android(安卓)adbd配置
  7. ionic build android 结果卡在下载gradle
  8. Android开源:数据库ORM框架GreenDao学习(二)数据库查询篇
  9. Instant Run详解

随机推荐

  1. SystemUI
  2. 整理出15个Android很有用的代码片段(技巧
  3. Android去掉抽屉
  4. Myeclipse中搭建Android开发环境
  5. Android(安卓)常用开源库
  6. android系统目录解析
  7. Android必学-AsyncTask基础
  8. Android 创建与解析XML(二)—— Dom方式
  9. Android中Notification的简单使用
  10. android permission权限