`

HttpClient基础(转)

阅读更多

(转)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

分享到:
评论

相关推荐

    Java HttpClient 全部的jar包

    它是HttpClient进行网络通信的基础。 7. `httpmime-4.x.x.jar`: 这个库扩展了HttpClient,支持MIME类型的HTTP请求,如上传文件、处理多部分表单数据等。 8. `log4j-1.2.x.jar`: 这是一个日志记录框架,通常与...

    HttpClient所需jar包(全) httpClient.4.13jar

    2. `httpcore-4.x.x.jar`: 这是HttpClient的基础组件,提供了网络通信的基本功能,如套接字连接和输入/输出流处理。 3. `httpmime-4.x.x.jar`: 这个库扩展了HttpClient,支持在HTTP请求中处理MIME类型的数据,比如...

    HttpClient重新封装的HttpClient类

    然而,这个基础版本的`HttpClient`存在一些问题,如资源管理不当可能导致泄露,以及缺少重试和超时策略等。因此,对`HttpClient`进行重新封装是非常常见的实践,以解决这些问题并增加额外的功能。 重新封装的`...

    httpclient-4.5.3 api 中文版

    2. **请求与响应**:HttpClient 使用`HttpRequestBase`作为所有HTTP请求的基础类,如`HttpGet`, `HttpPost`等。这些类提供了设置请求方法、URL、头部、实体内容的方法。响应则由`HttpResponse`表示,包含了状态码、...

    Android HttpClient用到的jar包

    2. **创建HttpClient对象**:创建一个`HttpClient`实例,这是所有HTTP操作的基础。在较旧的Android版本中,我们可以使用`DefaultHttpClient`,但在新版本中,由于HttpClient已被弃用,建议使用其他替代方案,如...

    httpclient post json 数据

    1. **创建HttpClient实例**:首先,你需要创建一个HttpClient对象,这是发送所有HTTP请求的基础。通常,你可以在需要的地方创建它,但为了性能考虑,建议在应用生命周期中保持单个实例。 ```csharp var ...

    httpclient4.4 jar包

    2. `HttpCore`:这是HttpClient的基础组件,负责网络I/O操作,如TCP连接管理和数据传输。HttpCore提供了低级别的API,为HttpClient提供了高效的连接管理和请求处理能力。 3. `Fluent API`:这是一个增强的接口,...

    httpclient 4.5.1

    HttpClient 4.5.1 是该库的一个重要版本,它在前一版本的基础上进行了一系列的改进和优化,以提供更稳定、更高效的服务。本文将详细介绍 HttpClient 4.5.1 的核心功能、使用方法及其主要特性。 一、HttpClient 概述...

    Android HttpClient工具类

    1. **HttpClient实例**:这是所有操作的基础,通过`HttpClient client = new DefaultHttpClient();`创建。`DefaultHttpClient`是HttpClient的一个实现,提供了基本的HTTP通信功能。 2. **HttpParams**:这是一个...

    httpclient4.1.4 API

    一、HttpClient基础 HttpClient的核心类是`org.apache.http.client.HttpClient`,它是执行HTTP请求的入口点。创建HttpClient实例后,可以调用`execute()`方法发起GET、POST等不同类型的HTTP请求。例如: ```java ...

    httpClient发送HTTP请求

    首先,HTTPS协议是在HTTP基础上增加了SSL/TLS(安全套接层/传输层安全)协议,用于加密通信和验证服务器身份。在使用HttpClient进行HTTPS通信时,可能会遇到证书错误,这是因为HttpClient默认只信任已安装在JVM...

    HttpClient4.3教程 PDF格式

    它是现代Web技术的基础,支持从简单的网页浏览到复杂的电子商务交易等各种应用。随着技术的发展,越来越多的设备和应用开始使用HTTP协议进行通信。然而,Java标准库中的***包虽然提供了基础的HTTP功能,但对于许多...

    apache-httpclient应用所有jar

    **HttpClient 使用基础** 要使用HttpClient,首先需要在项目中引入对应的jar包。在这个压缩包中,"apache-httpclient"包含了HttpClient所需的所有依赖。以下是一些基本的使用步骤: 1. **创建HttpClient实例**: ...

    HttpClient入门陆小马功钟浩.pdf

    以上知识点为HttpClient入门的基础内容,对于想要学习如何在Java中进行HTTP网络编程的人来说是必须掌握的基本技能。随着技术的发展,虽然4.0.1版可能不是现在最新的版本,但其核心的使用方法和API设计思路仍然具有...

    httpclient-4.5.jar

    `AsyncClientHttpRequestExecutor`和`FutureCallback`接口提供了异步操作的基础。 5. **源码分析**:一同发布的`httpclient-4.5-sources.jar`文件,包含了HttpClient 4.5的源代码,对于开发者来说,这是一份宝贵的...

    httpClient.jar

    1. **HttpCore**: 这是HttpClient的基础,负责处理低级别的网络通信,如TCP/IP连接。HttpCore提供了连接管理器,允许复用已建立的连接,提高性能。 2. **HttpClient API**: 包含了发起HTTP请求和解析响应的核心类,...

    httpClient4jar包

    它是HttpClient和其他HTTP相关组件的基础,为HttpClient提供了底层的HTTP协议支持。 httpasyncclient-4.1.jar是HttpClient的异步版本,适用于需要处理大量并发HTTP请求的场合。它基于Java的异步I/O模型,可以并发...

    HttpClientUtil工具类发送get和post请求,支持http和https,支持发送文件

    首先,HttpClientUtil工具类通常会封装HttpClient的基本操作,以便于开发者在应用中便捷地调用。GET和POST请求是HTTP协议中最常见的两种请求方法。GET请求用于获取服务器上的资源,而POST请求则常用于向服务器提交...

    httpclient-4.5所需jar包

    2. **httpcore-4.4.x.jar**:HTTP Core是HTTPClient的基础,提供了网络通信的底层实现,如TCP连接管理、HTTP协议解析等。这个库是HTTPClient必须的依赖。 3. **httpmime-4.5.jar**:这个库主要用于处理MIME类型的...

    android httpclient demo

    1. **GET请求**:GET是最基础的HTTP请求方法,用于获取服务器上的资源。在HttpClient中,可以通过`HttpGet`类来创建GET请求。示例代码如下: ```java HttpGet httpGet = new HttpGet("http://example.com/resource"...

Global site tag (gtag.js) - Google Analytics