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 ...
随机推荐
- RabbitMQ之Exchange Direct模式
场景: 生产者发送消息到交换机并指定一个路由key, 消费者队列绑定到交换机时要指定路由key(key匹配就能接受消息,key不匹配就不能接受消息) 例如:我们可以把路由key设置为insert ,那 ...
- java深入探究07-jdbc上
1.连接数据库三种方式 //连接数据库的URL private String url = "jdbc:mysql://localhost:3306/day17"; // jdbc协 ...
- Nginx HTTP反向代理基础配置
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...
- [SQL类] SQL优化大全(推荐)
概要 优化的理由 1. 大小写对SQL语句的影响(ORACLE) 2. 尽量使用(NOT) EXISTS 替代( NOT)IN这样的操作 3. 在海量查询时尽量少用格式转换 4. 查询海量数据是,可以 ...
- hibernate复习第(三)天
今日要点: 1.继承关系映射 一个表对应一个映射树(subclass) 一个子类一个表,子类只有父类没有的字段(joined-subclass) 鉴别器和内连接结合使用(subclass join) ...
- Python 爬虫 —— 网页内容解析(lxml)
0. xpath 语法 找到所有 <img src=....> 图像的链接: xpath = './/img/@src' img_urls = html.xpath(xpath) @修饰节 ...
- OpenCV - Android Studio 中集成Opencv环境(不包含opencv_contrib部分)
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,支持的运行环境也是非常的多,这篇文章主要讲的是Android环境集成OpenCV(IDE是Android Studio,我想Eclip ...
- WC2010 BZOJ1758 重建计划_长链剖分
题目大意: 求长度$\in [L,U]$的路径的最大边权和平均值. 题解 首先二分就不用说了,分数规划大家都懂. 这题有非常显然的点分治做法,但还是借着这个题学一波长链剖分. 其长链剖分本身也没啥,就 ...
- 线段树Final版本
结构体是个好东西... 看着逼格很高 #include<iostream> #include<cstdio> #include<cstdlib> #include& ...
- vc++ 访问php webService
之前做了一个VC++访问c#制作的WebService,没有问题,接着我又做了一个VC++访问php制作的WebService ,结果老是出现Client错误.这个php WebService是用Ze ...