Android的OkHttp开源框架的使用方法
前段时间研究了下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 对象来添加自己需要添加的请求头信息
builder = new Request.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请求对象Request
- Request request = new Request.Builder().url(url).post(body).build();
上面的代码演示了如何构造普通Post请求(不包含文件上传)的请求体和请求对象,请求对象构造成功之后,后面的请求过程和处理流程就和Get请求是一样的了。
3.文件上传
- //多个图片文件列表
- List<File> list = new ArrayList<File>();
- //多文件表单上传构造器
- 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));
- }
- }
- //构造文件上传时的请求对象Request
- 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开源框架的使用方法的更多相关文章
- Android常用优秀开源框架
Android常用优秀开源框架 https://github.com/Ericsongyl/AOSF AOSF:全称为Android Open Source Framework,即Android优秀开 ...
- Android开发常用开源框架:图片处理
https://blog.csdn.net/SGQ_CSDN/article/details/79910709 Android开发常用开源框架:图片处理 框架名称 功能描述 Android Unive ...
- Android中使用开源框架android-image-indicator实现图片轮播部署
之前的博文中有介绍关于图片轮播的实现方式,分别为(含超链接): 1.<Android中使用ViewFlipper实现屏幕切换> 2.<Android中使用ViewPager实现屏幕页 ...
- Android中使用开源框架PagerSlidingTabStrip实现导航标题
此开源框架官网地址:https://github.com/astuetz/PagerSlidingTabStrip 可以理解为配合ViewPager使用的交互式页面指示器控件. 话不多说,先上效果图: ...
- Android常用优秀开源框架整理
前言 AOSF:全称为Android Open Source Framework,即Android优秀开源框架汇总.包含:网络请求okhttp,图片下载glide,数据库greenDAO,链式框架Rx ...
- Android开发之开源框架OKHTTP的Get请求代码,得到json字符串方法
<span style="white-space:pre"> </span><pre name="code" class=&q ...
- Android中使用开源框架Fresco处理图片
本文为原创博文,转载请注明原文链接:http://www.cnblogs.com/panhouye/p/6278116.html 关于Fresco的优点大家自行谷歌吧,它太强大太优秀了,我这一片小博文 ...
- Android 优秀的开源框架整理
第一部分:系统架构 thinkAndroid https://github.com/white-cat/ThinkAndroid ThinkAndroid是一个免费的开源的.简易的.遵循Apache2 ...
- Android中使用开源框架citypickerview实现省市区三级联动选择
1.概述 记得之前做商城项目,需要在地址选择中实现省市区三级联动,方便用户快速的填写地址,当时使用的是一个叫做android-wheel 的开源控件,当时感觉非常好用,唯一麻烦的是需要自己整理并解析省 ...
随机推荐
- FBReader阅读引擎支持的功能
"三十年河东,三十年河西"是一句民间谚语,它的来源是:从前黄河河道不固定,经常会改道(历史上无数次发生).某个地方原来在河的东面,若干年后,因黄河水流改道,这个地方会变为在河的西面 ...
- 【Spring】HttpMessageConverter的作用及替换
相信使用过Spring的开发人员都用过@RequestBody.@ResponseBody注解,可以直接将输入解析成Json.将输出解析成Json,但HTTP 请求和响应是基于文本的,意味着浏览器和服 ...
- Asp.net mvc 下载文件
前言 最近有需求需要下载文件,可能是image的图片,也可能是pdf报告,也可能是微软的word或者excel文件. 这里就整理了asp.net mvc 和asp.net webapi 下载的方法 A ...
- NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.web.servlet.view.InternalResourceViewResolver' available
问题描述: 项目中需要配置多个视图解析器,所以使用ContentNegotiatingViewResolver来处理,在其内部设置了FreeMarkerViewResolver .InternalRe ...
- 洛谷 [P2486] 染色
树剖+线段树维护连续相同区间个数 注意什么时候长度要减一 #include <iostream> #include <cstdio> #include <cstdlib& ...
- BZOJ 1927: [Sdoi2010]星际竞速 [上下界费用流]
1927: [Sdoi2010]星际竞速 题意:一个带权DAG,每个点恰好经过一次,每个点有曲速移动到他的代价,求最小花费 不动脑子直接上上下界费用流过了... s到点连边边权为曲速的代价,一个曲速移 ...
- .NET Core版本七牛云SDK使用
一.问题背景 公司目前正在将一部分的业务从.NET平台准备迁移到.NET Core上去,同时也准备启用docker进行.NET Core的部署,在项目迁移过程中,不可避免的碰到有些SDK只有在.NET ...
- SpringBoot学习之Json数据交互
最近在弄监控主机项目,对javaweb又再努力学习.实际的项目场景中,前后分离几乎是所以项目的标配,全栈的时代的逐渐远去,后端负责业务逻辑处理,前端负责数据展示成了一种固定的开发模式.像thymele ...
- 保存文件名至txt文件中,不含后缀
准备深度学习的训练数据时,可能会用到将图片文件名保存到txt文件中,所以用python实现了该功能.输入参数只设了两个,图片存放路径,和输出的txt文件名. 代码里写死了只识别.jpg格式,并不进行目 ...
- laravel中实现短信发送验证码
前段时间想实现一个短信验证码的功能,但是卡了很长时间. 首先我用的是阿里云的短信服务业务,其首次接入流程如下: 在阿里云上开通短信服务后需要做的: 1,申请签名 2,申请模板 3,创建Acces ...