Http客户端再封装
Android系统上推荐的Http客户端从Apache变成[HttpURLConnection],主要理由包括
*
不过因为UrlConnection这组接口时间较早(Java 1.0),
接口的设计并不好[Traps1][Traps2]。下面提供一个更现代的接口[Source]。
总体设计
一个Http申请分成几个步骤,其中括号引用的步骤为可选操作。
请求构造 => (生成请求内容) => 执行请求 => 响应处理 => 响应结果 这几个部分。
一个典型的请求操作可以写为
HttpClient.get("url").with(pname, value).toFile("file name").execute().close();
由于使用HttpURLConnection做为底层实现,它自动上复用实际的Socket连接.
其中HttpClient为工厂,提供以Http方法为方法名的默认HttpRequest构造。
还可以通过注册HttpRequestHandler来设置默认的HttpRequest参数。
与HttpURLConnection不同,execute实际的IO请求发生的地方,它先会调用HttpResponseHandler, 可以
预处理HttpResponse的消息头等内容.
HttpResponse对应一次服务器响应, 除了基本的Reader/InputStream接口外,它还提供一些方便方法,如
写入文件等。
大部情况下,不需要显式对execute的返回值做处理,因为它会在HttpResponseHandler中处理。
如果显示处理HttpResponse需要注意,它可能阻塞,超时,并抛出异常。
一些复杂的情况处理
大部分处理都使用到了两个接口中即HttRequestHandler和HttpResponseHandler,前者在构造Request时,
调用,主要处理Requset的相关头域, 后者主要是用于读取响应中的头域,另外可以对错误响应做处理。
需要注意,HttpRequestHandler可能有多个,调用次序不确定, HttpResponseHandler只能有一个,在进
行实际IO时调用.
Cookie使用
通过setCookie(pname, value, host)或setCookieManager来向Request添加请求。
通过getCookie()得到一个cookie的容器。
TLS加密
Url会根据https前缀自动选用Https协议,但需要提供相应的TLS连接用证书和验证能力。这些都可以
通过httpRequestHandler完成。
Multipart attachement
与Post方法一样,添加内容是通过在ReqestHandler中完成,主要方式通过
getInputStream();
beginMultiPart(MimeType, boundary);
addContent(name, Readable);
addContent(name, MimeType, Readable);
endMultiPart();
close();
一些引用
[Source]https://github.com/anthonyhl/httpclient
[HttpURLConnection]:http://developer.android.com/reference/java/net/HttpURLConnection.html
[Traps1]:http://www.javaworld.com/article/2075162/core-java/dodge-the-traps-hiding-in-the-urlconnection-class.html
[Traps2]:http://www.blogjava.net/supercrsky/articles/247449.html
Http客户端再封装的更多相关文章
- iOS开发之网络请求(基于AFNetworking的再封装)
最近一直很忙也没有什么时间写博客了.放假了休息一下,就写一篇博客来总结一下最近做项目中出现过的问题吧!!! 首先,在项目中我的起到了什么作用,无非就是把美工(UI设计师)给我们的图显示出来,然后再和服 ...
- 对Zlib单元进行再封装
对Zlib单元进行再封装 低版本DELPHI,如D7,ZLIB.pas单元封装的很简陋,因此有必要再封装,以增加使用的便利性. 高版本DELPHI,zlib.pas本身提供的接口已经相当完善. Zli ...
- 打印 Logger 日志时,需不需要再封装一下工具类?
在开发过程中,打印日志是必不可少的,因为日志关乎于应用的问题排查.应用监控等.现在打印日志一般都是使用 slf4j,因为使用日志门面,有助于打印方式统一,即使后面更换日志框架,也非常方便.在 < ...
- 跨平台的游戏客户端Socket封装,调整
原文链接:http://www.cnblogs.com/lancidie/archive/2013/04/13/3019359.html 头文件: #pragma once #ifdef WIN32 ...
- RecyclerView再封装
RecyclerView做为ListView的替代品,已经出了很久了,既然是替代品,那自然有些ListView没有的优点.比如说:可以随意切换list,grid,stagger.可以指定一个或多个it ...
- c# AutoMapper 使用方式和再封装
安装方式:使用vs自带的nuget管理工具,搜索AutoMapper ,选择第一个安装到你的项目即可. 我从网上找了一些资料, 参考网址:http://blog.csdn.net/csethcrm/a ...
- 新浪微博客户端(3)-封装UIBarButtonItem
单独给NavigationBar上的两个NavigationItem设置图片显得比较麻烦,下面对创建单个UIBarButtonItem的过程进行封装. UIBarButtonItem+Extensio ...
- mvc中使用Pagination,对其进行再封装
对其进行再次封装: (function($) { $["fn"]["easyPaging"] = function(o) { if (!o.pageSelect ...
- select客户端模型封装——回调方式快速建立客户端
SockClient.h #pragma once #include<functional> #define _WINDOWS #ifdef _WINDOWS #define _WINSO ...
随机推荐
- Delphi回调函数的使用-例子
Delphi回调函数的使用-例子 功能大体描述:Form1中有一个Edit和一个Button,当点击BUTTON时弹出FORM2,FORM2中也有一个EDIT和一个BUTTON,当点击FORM2中的B ...
- EntityFramework 学习 一 Querying with EDM 从EDM查询
前面我们已经创建EDM.DbContext和实体类,接下来我们学习不同的查询实体方法,转变为数据库的SQL查询 Entity Framework支持3种查询方式:1)LINQ to Entities ...
- jQuery横向手风琴图片滑块
jQuery横向手风琴图片滑块是一款非常不错的jQuery特效横向手风琴图片滑块插件,可以自动播放,也可以鼠标滑过时切换.+ 欢迎喜欢的朋友下载研究 源码下载页:http://www.huiyi8.c ...
- cocos2d-x3.0rc打包apk遇到的一些问题记录
下载cocos2d-x3.0rc后根据官方教程进行环境配置等等一系列过程没有遇到什么问题 打包apk时出现一些问题: 按照官方教程cmd下运行cocos run -p android -m relea ...
- 分享知识-快乐自己:PageHelper 分页关键基础代码
关键代码:点我下载样式 详细介绍 //使用分页插件 jQuery("#pagination").pagination(data.total, { items_per_page: ...
- 前端多媒体(7)—— 在浏览器中实现rtmp推流
示例:https://young-cowboy.github.io/gallery/rtmp_client/index.html 在国内的直播场景中通常使用,rtmp协议作为推流协议.RTMP是Rea ...
- cmd cvf war包
1.进入要打包的目录下 --> cmd d: cd \路径 jar -cvf 包名.war * 2.解压 进入需要解压的目录 cd /depa123/webapps/css jar -xvf / ...
- oracle隐含参数的查看与修改
v$parameter视图中查询参数的时候其实都是通过x$ksppi和x$ksppcv这两个内部视图中得到的. 1. 可以通过如下方式查询当前实例的所有隐含参数: col name for a30 ...
- BZOJ2288:[POJ Challenge]生日礼物
浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...
- android开发 解析服务器端xml文件数据存储到android客户端SQLite数据库
以下面xml文件为例对其解析(假设此xml就在服务器端Server项目下的servlet包下的MenuServlet文件的输出流中): <?xml version="1.0" ...