Apache HTTPClient Tutorial 深度学习(一)
超文本传输协议(HTTP)可能是当今Internet上使用的最重要的协议。Web服务、网络支持的设备和网络计算的增长继续扩展了HTTP协议在用户驱动的Web浏览器之外的作用,同时增加了需要HTTP支持的应用程序的数量。尽管java.net包提供了通过HTTP访问资源的基本功能,但它并没有提供许多应用程序所需的全部灵活性或功能。HttpClient通过提供一个有效的、最新的、功能丰富的包来实现这一空白,它实现了最新HTTP标准和建议的客户端。在为基础HTTP协议提供强大支持的同时,HttpClient可能对构建HTTP敏感的客户端应用程序有兴趣,比如web浏览器、web服务客户端,或者利用或扩展HTTP协议来进行分布式通信的系统。
1. HttpClient 应用范围
•HTTP客户端传输是基于HttpCore类[http://hc.apache.org/httpcomponents-core/index.html]
•基于 I/O 阻塞
•内容不可见
2. HttpClient不支持的地方
•HttpClient并不是一个浏览器。它是一个客户端HTTP传输库。HttpClient的目的是传输和接收HTTP消息。HttpClient不会尝试处理内容,在HTML页面中执行javascript,尝试猜测内容类型,如果不是显式设置,或者重新格式化请求/重写位置uri,或者其他与HTTP传输无关的功能。
一、基本原理
1.1. Request execution
HttpClient最基本的功能是执行HTTP方法。HTTP方法的执行包含一个或多个HTTP请求/HTTP响应交换,通常由内部处理HttpClient。预期用户将提供一个要执行的请求对象,并且预计HttpClient将被执行将请求发送到目标服务器,返回对应的响应对象,或抛出异常如果执行成功。
很自然地,HttpClient API的主要入口点是定义了HttpClient接口的HttpClient接口合同上面所描述的。下面是一个以最简单的形式请求执行过程的例子:
1.1.1. HTTP request
所有HTTP请求都有一个请求行,其中包括一个方法名、一个请求URI和一个HTTP协议的版本。
HttpClient支持在HTTP/1.1规范中定义的所有HTTP方法:GET,头、POST、PUT、DELETE、TRACE和OPTIONS。每个方法类型都有一个特定的类。:HttpGet,HttpHead、HttpPost、HttpPut、HttpDelete、HttpTrace和http pop弹出。
请求-uri是一种统一的资源标识符,用于标识要应用的资源请求。HTTP请求uri由协议方案、主机名、可选端口、资源路径组成,可选的查询和可选的片段。
HttpClient提供URIBuilder实用程序类来简化请求uri的创建和修改。
1.1.2. HTTP response
HTTP响应是服务器在接收和解释后发送给客户机的一条消息一个请求消息。该消息的第一行包含了协议版本,后面是一个数字状态代码及其相关的文本短语。
1.1.3. Working with message headers
HTTP消息可以包含许多描述消息属性的头信息,比如内容长度、内容类型等。HttpClient提供了检索、添加、删除和删除的方法列举头。
1.1.4. HTTP entity
HTTP消息可以携带与请求或响应相关联的内容实体。实体可以找到在一些请求和一些响应中,因为它们是可选的。使用实体的请求被引用作为包含请求的实体。HTTP规范定义了包含请求方法的两个实体:POST和PUT。
响应通常被期望包含一个内容实体。这里也有例外比如对HEAD方法的响应和204,没有内容,304 Not修改,205重置内容响应。
HttpClient区分三种实体,这取决于它们的内容来源:
•streamed:内容是从一个流中接收的,或者是动态生成的。特别是,这类别包括从HTTP响应接收的实体。一般来说,流媒体是不存在的可重复的。
•self-contained:内容在记忆中或者通过独立于a的方式获得连接或其他实体。自包含的实体通常是可重复的。这种类型的实体将会主要用于包含HTTP请求的实体。
•wrapping:内容是从另一个实体获得的。
当从HTTP中流出内容时,这种区别对于连接管理非常重要响应。对于由应用程序创建的请求实体,并且仅使用HttpClient发送。流和自包含之间的差异是不重要的。在这种情况下,建议将不可重复的实体看作是流的,而那些可重复的实体则是自包含的。
1.1.5. Ensuring release of low level resources
为了确保系统资源的正确发布,必须关闭与内容流相关的内容流对于实体或响应本身
关闭内容流和关闭响应之间的区别在于前者将会试图通过使用实体内容来保持底层连接的存在立即关闭并丢弃连接。请注意,也需要HttpEntity writeto(OutputStream)方法来确保正确一旦实体被完全写出,系统资源就被释放。如果该方法获得一个实例io。
通过调用HttpEntity getcontent()来调用InputStream,它也将关闭流在最后条款。当使用流媒体实体时,可以使用有权使用的(HttpEntity)方法为了确保实体内容已经被完全消耗,并且底层的流已经被关闭。但是,当整个响应内容中只有一小部分需要时,可能会出现一些情况检索和执行对剩余内容和连接的性能损失可重用性过高,在这种情况下,通过关闭响应,可以终止内容流。
该连接将不会被重用,但是它所持有的所有级别资源将被正确地释放。
1.1.6. Consuming entity content(消费者)
使用它的HttpEntity getcontent(),使用实体的内容的推荐方法是或HttpEntity #用writeTo(OutputStream)方法。
HttpClient还附带了“有权”的类,它公开了几个静态方法,以便更容易地从一个实体读取内容或信息。而不是读取java.io。
输入流直接,可以在a中检索整个内容体使用来自这个类的方法的字符串/字节数组。然而,对有权的使用是强烈的除非响应实体来自一个受信任的HTTP服务器,并且被认为是不受鼓励的有限的长度。
在某些情况下,可能需要多次读取实体内容。在这种情况下实体内容必须以某种方式缓冲,无论是在内存还是在磁盘上。最简单的方法通过将原始实体包装成BufferedHttpEntity类来完成这一任务。这将导致将原始实体的内容读入内存中的缓冲区。在其他方面,实体包装器将会有最初的那个。
1.1.7. Producing entity content(生产者)
HttpClient提供了几个类,这些类可以用来高效地通过HTTP来传输内容连接。这些类的实例可以与实体封闭请求相关联,例如POST和PUT将实体内容封装到传出的HTTP请求中。HttpClient提供对于大多数常用的数据容器,例如字符串、字节数组、输入流和文件:StringEntity、ByteArrayEntity、InputStreamEntity和FileEntity。
请注意InputStreamEntity是不可重复的,因为它只能从底层数据读取流一次。通常建议实现一个自包含的自定义的HttpEntity类而不是使用通用的inputstream实体。FileEntity是一个很好的起点。
1.1.8. Response handlers(相应处理程序)
处理响应的最简单和最方便的方法是使用ResponseHandler接口,其中包括handleResponse(响应)方法。这个方法
完全使用户不必担心连接管理。当使用一个ResponseHandler,HttpClient将自动负责确保连接的释放对于连接管理器,不管请求执行是成功还是导致异常。
About Me:
Github地址:https://github.com/noseparte
Email:noseparte@aliyun.com有java与hadoop相关的技术问题,可以发私信与我交流。