- 浏览: 218812 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
microwindlab:
你不应该加 --shell 参数,因为 --shell run ...
由mongodb的维护引发的 grep,awk,sed 与管道的应用 -
Jerryhome:
楼主超牛,值得好好学习
windows系统下的进程监测程序--实现过程记录 -
xb_91674981:
学习一下,模式在程序设计是很重要
《大话设计模式》一书的所有代码和UML类图 -
Jason(aijun):
正在学习,非常感谢分享。
《大话设计模式》一书的所有代码和UML类图 -
wurb_travelsky:
正在看这本书,C#的代码倒也不影响阅读
《大话设计模式》一书的所有代码和UML类图
(转)HttpClient基础
原文:http://www.cppblog.com/iuranus/archive/2010/07/04/119311.html
1.1 执行请求
HttpClient 的最重要的功能是执行 HTTP 方法。一个 HTTP 方法的执行涉及到一个或多个 HTTP 请求或 HTTP 响应的交流, HttpClient 通常是在内部处理的。用户将提供一个执行请求对象, HttpClient 发送请求到目标服务器返回一个相应的响应对象,如果执行失败则抛出一个异常。 所以, HttpClient API 的主要切入点是 HttpClient 的接口,它定义了上述约定。
下面是一个请求执行过程中的最简单形式的例子:
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://localhost/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
int l;
byte[] tmp = new byte[2048];
while ((l = instream.read(tmp)) != -1) {
}
}
1.1.1 HTTP 请求
所有的 HTTP 请求包含一个由请求行组成的一个方法名,一个请求的 URI 和一个 HTTP 协议的版本。
HttpClient 的支持在 HTTP/1.1 规范中定义的所有的 HTTP 方法: GET, HEAD, POST, PUT, DELETE, TRACE 和 OPTIONS 。每有一个方法都有一个对应的类: HttpGet , HttpHead , HttpPost , HttpPut , HttpDelete , HttpTrace 和 HttpOptions 。 所有的这些类均实现了 HttpUriRequest 接口,故可以作为 execute 的执行参数使用。请求 URI 是能够应用请求的统一资源标识符。 HTTP 请求的 URI 包含一个协议计划 protocol scheme ,主机名 host name, ,可选的端口 optional port ,资源的路径 resource path ,可选的查询 optional query 和可选的片段 optional fragment 。
HttpGet httpget = new HttpGet(
"http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=");
HttpClient 提供了一系列实用的方法来简化创建和修改请求 URI 。
URI 可以组装编程:
URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search",
"q=httpclient&btnG=Google+Search&aq=f&oq=", null);
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());
输出 >
http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=
查询字符串也可以通过添加参数列表来生成 :
List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("q", "httpclient"));
qparams.add(new BasicNameValuePair("btnG", "Google Search"));
qparams.add(new BasicNameValuePair("aq", "f"));
qparams.add(new BasicNameValuePair("oq", null));
URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search",
URLEncodedUtils.format(qparams, "UTF-8"), null);
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());
输出 >
http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=
1.1.2 HTTP 响应
HTTP 响应是由服务器收到和解释一个请求消息后返回给客户端的消息。该消息的第一行包含遵循的协议版本 , 他由一个数字状态代码及其相关的文本来表示。
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK, "OK");
System.out.println(response.getProtocolVersion());
System.out.println(response.getStatusLine().getStatusCode());
System.out.println(response.getStatusLine().getReasonPhrase());
System.out.println(response.getStatusLine().toString());
输出 >
HTTP/1.1
200
OK
HTTP/1.1 200 OK
1.1.3 Headers 处理
一个 HTTP 消息可以包含一系列 headers 参数描述信息,例如内容长度,内容类型等。 HttpClient 的提供方法来检索,添加,删除和枚举 headers 。
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK, "OK");
response.addHeader("Set-Cookie", "c1=a; path=/; domain=localhost");
response.addHeader("Set-Cookie","c2=b; path=\"/\", c3=c; domain=\"localhost\"");
Header h1 = response.getFirstHeader("Set-Cookie");
System.out.println(h1);
Header h2 = response.getLastHeader("Set-Cookie");
System.out.println(h2);
Header[] hs = response.getHeaders("Set-Cookie");
System.out.println(hs.length);
输出 >
Set-Cookie: c1=a; path=/; domain=localhost
Set-Cookie: c2=b; path="/", c3=c; domain="localhost"
2
最有效获取所有的给定类型的 headers 方式是使用 HeaderIterator 接口。
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK, "OK");
response.addHeader("Set-Cookie",
"c1=a; path=/; domain=localhost");
response.addHeader("Set-Cookie",
"c2=b; path=\"/\", c3=c; domain=\"localhost\"");
HeaderIterator it = response.headerIterator("Set-Cookie");
while (it.hasNext()) {
System.out.println(it.next());
}
输出 >
Set-Cookie: c1=a; path=/; domain=localhost
Set-Cookie: c2=b; path="/", c3=c; domain="localhost"
它还提供了方便的方法来解析 HTTP 消息的单个 header 元素
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK, "OK");
response.addHeader("Set-Cookie",
"c1=a; path=/; domain=localhost");
response.addHeader("Set-Cookie",
"c2=b; path=\"/\", c3=c; domain=\"localhost\"");
HeaderElementIterator it = new BasicHeaderElementIterator(
response.headerIterator("Set-Cookie"));
while (it.hasNext()) {
HeaderElement elem = it.nextElement();
System.out.println(elem.getName() + " = " + elem.getValue());
NameValuePair[] params = elem.getParameters();
for (int i = 0; i < params.length; i++) {
System.out.println(" " + params[i]);
}
输出 >
c1 = a
path=/
domain=localhost
c2 = b
path=/
c3 = c
domain=localhost
1.1.4 HTTP 实体
HTTP 消息的可以进行内容实体和请求或响应关联。可以在一些要求和一些回应中找到实体,因为它们是可选的。实体内附与请求之中。 HTTP 规范定义了两个实体内附方法: POST 和 PUT 。响应通常将会附上一个内容实体。但是响应 HEAD 方法和 204 No Content, 304 Not Modified, 205 Reset Content responses 除外。
HttpClient 的区分三种不同实体的地方在于内容来源于:
streamed 流媒体:内容是从收到的流,或在运行中产生的。特别是包括被从 HTTP 响应收到的实体。流媒体的实体一般不可重复。
self-contained 独立的:内容是在内存或以从一个连接或其他实体的独立获得的。独立的的实体,一般可重复的。这种类型的实体将主要用于内附在 HTTP 请求中。
wrapping 包装:实体内容是从另一个实体获得。
当得到一个 HTTP 响应流的内容的时候,这种区分对于连接管理是很重要的。对于请求实体,通过应用程序来创建和只通过使用的 HttpClient 发送,流和自载之间差别很小。在这种情况下,建议考虑非重复的流实体,以及那些重复的自载实体。
1.1.4.1 重复实体
一个实体可以是可重复的,这意味着它的内容可以被读取一次以上。唯一有可能是的独立的实体(如 ByteArrayEntity 或 StringEntity ())
1.1.4.2 使用 HTTP 实体
由于一个实体能够表示二进制和字符的内容,它可以提供编码的支持(支持文字、 IE 和字符内容)。
这个实体在执行封闭内容的请求的时候或者在请求成功和响应返回成功的时候被创建。
若要读取从实体内容,一可以通过检索 HttpEntity # getContent ()方法,它返回一个 java.io.InputStream ,或一个可以提供一个输出流的 HttpEntity # writeTo ( OutputStream 中)方法的输入流,这将返回已被写入给定的流的所有内容。
当通过传入的消息收到实体,方法 HttpEntity # getContentType ()和 HttpEntity # getContentLength ()方法可用于阅读通用元数据 metadata ,如 Content-Type , Content-Length headers (如果可用)。由于 Content-Type header 可以包含一个像 text/plain 或者 text/html 的文本 mime-types 的 character encoding , HttpEntity # getContentEncoding ()方法用来读取此信息。如果 headers 是不可用,返回的长度是 -1 , content type 并为 NUL 。如果 Content – Type header 可用,将返回一个 header 对象。
当创建了一个即将卸任的消息实体,该 meta data 必须提供由该实体的创造者。
StringEntity myEntity = new StringEntity("important message",
"UTF-8");
System.out.println(myEntity.getContentType());
System.out.print
发表评论
-
w3school html 学习笔记
2014-04-25 20:38 917当显示页面时,浏览 ... -
phpcms 笔记
2014-04-24 16:53 871Phpcms v9的pc_webserver一安装上,就不 ... -
dive into python 笔记
2014-02-13 17:23 661第三章 tuple 是没有app ... -
python 爬某高校C++题库小程序
2014-01-18 15:44 1442最近在学习C++,爬下一些题来,用于平时练手。 原理其实也 ... -
centos下饭强--obfucated-openssh sshcenter.info
2013-09-26 21:47 15481. git clone https://github.com ... -
android的【qq通讯录】导出短信,在iphone上恢复
2013-07-14 22:00 5973事件经过:朋友原来用android手机,现在新买了ipho ... -
python的一些记录
2013-05-03 13:53 1223正则表达式的一些常用元字符和语法: http://www. ... -
《程序设计导引及在线实践》学习
2012-05-31 17:13 1045P41 int MyItoa(char s[]) 将s中以 ... -
accelerated c++ 学习笔记
2012-04-26 00:53 1206Chapter 0 A namespace is a ... -
关于foreach与普通for的区别
2012-04-10 22:07 1334请问两者的区别 for(A a : alist) { ... -
学习Linux命令,读《系统程序员成长计划》
2012-03-06 16:41 1351linux命令小结: cat : ... -
base64,日期操作,jexl读取excel
2012-03-06 16:40 220607-22:学习base64的加密和解密,求几天前的日期和求两 ... -
无题。。好代码记录
2011-12-27 11:35 778编写函数expand(s1,s2),将字符串s1中类似于a-z ... -
数据结构:排序
2011-11-09 13:08 984排序一般分为:插入排序,选择排序,交换排序,归并排序和分配排序 ... -
c语言复习笔记
2011-11-07 17:24 2139指针部分: 1.指针类型说明 main(){ in ... -
并发学习笔记(更新中,java编程思想第四版21章)
2011-10-19 23:47 1597实现并发最直接的方式是在操作系统级别使用进程。 并发任 ... -
并发学习笔记(更新中,java编程思想第四版21章)
2011-10-19 21:05 0从今天起记录学习到的知识。 -
RMI 入门
2011-10-07 16:23 1568RMI : remote method invocation, ... -
《大话设计模式》一书的所有代码和UML类图
2011-08-29 16:08 4303如题,把《大话设计模式》一书的所有代码和UML类图写出来,见附 ... -
windows系统下的进程监测程序--实现过程记录
2011-05-26 22:50 6215单位的客服中心的服务器有个接口程序,这三天都出现了自动退出的情 ...
相关推荐
它是HttpClient进行网络通信的基础。 7. `httpmime-4.x.x.jar`: 这个库扩展了HttpClient,支持MIME类型的HTTP请求,如上传文件、处理多部分表单数据等。 8. `log4j-1.2.x.jar`: 这是一个日志记录框架,通常与...
2. `httpcore-4.x.x.jar`: 这是HttpClient的基础组件,提供了网络通信的基本功能,如套接字连接和输入/输出流处理。 3. `httpmime-4.x.x.jar`: 这个库扩展了HttpClient,支持在HTTP请求中处理MIME类型的数据,比如...
然而,这个基础版本的`HttpClient`存在一些问题,如资源管理不当可能导致泄露,以及缺少重试和超时策略等。因此,对`HttpClient`进行重新封装是非常常见的实践,以解决这些问题并增加额外的功能。 重新封装的`...
2. **请求与响应**:HttpClient 使用`HttpRequestBase`作为所有HTTP请求的基础类,如`HttpGet`, `HttpPost`等。这些类提供了设置请求方法、URL、头部、实体内容的方法。响应则由`HttpResponse`表示,包含了状态码、...
2. **创建HttpClient对象**:创建一个`HttpClient`实例,这是所有HTTP操作的基础。在较旧的Android版本中,我们可以使用`DefaultHttpClient`,但在新版本中,由于HttpClient已被弃用,建议使用其他替代方案,如...
1. **创建HttpClient实例**:首先,你需要创建一个HttpClient对象,这是发送所有HTTP请求的基础。通常,你可以在需要的地方创建它,但为了性能考虑,建议在应用生命周期中保持单个实例。 ```csharp var ...
2. `HttpCore`:这是HttpClient的基础组件,负责网络I/O操作,如TCP连接管理和数据传输。HttpCore提供了低级别的API,为HttpClient提供了高效的连接管理和请求处理能力。 3. `Fluent API`:这是一个增强的接口,...
HttpClient 4.5.1 是该库的一个重要版本,它在前一版本的基础上进行了一系列的改进和优化,以提供更稳定、更高效的服务。本文将详细介绍 HttpClient 4.5.1 的核心功能、使用方法及其主要特性。 一、HttpClient 概述...
1. **HttpClient实例**:这是所有操作的基础,通过`HttpClient client = new DefaultHttpClient();`创建。`DefaultHttpClient`是HttpClient的一个实现,提供了基本的HTTP通信功能。 2. **HttpParams**:这是一个...
一、HttpClient基础 HttpClient的核心类是`org.apache.http.client.HttpClient`,它是执行HTTP请求的入口点。创建HttpClient实例后,可以调用`execute()`方法发起GET、POST等不同类型的HTTP请求。例如: ```java ...
首先,HTTPS协议是在HTTP基础上增加了SSL/TLS(安全套接层/传输层安全)协议,用于加密通信和验证服务器身份。在使用HttpClient进行HTTPS通信时,可能会遇到证书错误,这是因为HttpClient默认只信任已安装在JVM...
它是现代Web技术的基础,支持从简单的网页浏览到复杂的电子商务交易等各种应用。随着技术的发展,越来越多的设备和应用开始使用HTTP协议进行通信。然而,Java标准库中的***包虽然提供了基础的HTTP功能,但对于许多...
**HttpClient 使用基础** 要使用HttpClient,首先需要在项目中引入对应的jar包。在这个压缩包中,"apache-httpclient"包含了HttpClient所需的所有依赖。以下是一些基本的使用步骤: 1. **创建HttpClient实例**: ...
以上知识点为HttpClient入门的基础内容,对于想要学习如何在Java中进行HTTP网络编程的人来说是必须掌握的基本技能。随着技术的发展,虽然4.0.1版可能不是现在最新的版本,但其核心的使用方法和API设计思路仍然具有...
`AsyncClientHttpRequestExecutor`和`FutureCallback`接口提供了异步操作的基础。 5. **源码分析**:一同发布的`httpclient-4.5-sources.jar`文件,包含了HttpClient 4.5的源代码,对于开发者来说,这是一份宝贵的...
1. **HttpCore**: 这是HttpClient的基础,负责处理低级别的网络通信,如TCP/IP连接。HttpCore提供了连接管理器,允许复用已建立的连接,提高性能。 2. **HttpClient API**: 包含了发起HTTP请求和解析响应的核心类,...
它是HttpClient和其他HTTP相关组件的基础,为HttpClient提供了底层的HTTP协议支持。 httpasyncclient-4.1.jar是HttpClient的异步版本,适用于需要处理大量并发HTTP请求的场合。它基于Java的异步I/O模型,可以并发...
首先,HttpClientUtil工具类通常会封装HttpClient的基本操作,以便于开发者在应用中便捷地调用。GET和POST请求是HTTP协议中最常见的两种请求方法。GET请求用于获取服务器上的资源,而POST请求则常用于向服务器提交...
2. **httpcore-4.4.x.jar**:HTTP Core是HTTPClient的基础,提供了网络通信的底层实现,如TCP连接管理、HTTP协议解析等。这个库是HTTPClient必须的依赖。 3. **httpmime-4.5.jar**:这个库主要用于处理MIME类型的...
1. **GET请求**:GET是最基础的HTTP请求方法,用于获取服务器上的资源。在HttpClient中,可以通过`HttpGet`类来创建GET请求。示例代码如下: ```java HttpGet httpGet = new HttpGet("http://example.com/resource"...