研究支付时碰到了 httpclient 围观

HttpClient最重要的功能是执行HTTP方法。一个HTTP方法的执行包含一个或多个HTTP请求/HTTP响应交换,一般由HttpClient的内部来处理。而指望用户提供一个要执行的请求对象,而HttpClient指望传输请求到目标服务器并返回对应的响应对象,或者当执行不成功时抛出异常。javascript

interface HttpClient ,html

实现类有AbstractHttpClient、AndroidHttpClientjava

 DefaultHttpClient extends AbstractHttpClientapache

 

一个简单的HttpClient执行例子编程

 

HttpClient httpclient = new DefaultHttpClient();浏览器

HttpGet httpget = new HttpGet("http://localhost/");缓存

HttpResponse response = httpclient.execute(httpget);服务器

HttpEntity entity = response.getEntity();dom

if (entity != null) {工具

InputStream instream = entity.getContent();

int l;

byte[] tmp = new byte[2048];

while ((l = instream.read(tmp)) != -1) {

}

}

   /** 

* 为HttpClient添加请求超时时间
* @return
*/
public HttpClient getHttpClient(){  
   BasicHttpParams httpParams = new BasicHttpParams();  
   HttpConnectionParams.setConnectionTimeout(httpParams, 5000);  //设置请求超时10秒钟 
   HttpConnectionParams.setSoTimeout(httpParams, 5000);  //设置等待数据超时时间10秒钟
   HttpClient client = new DefaultHttpClient(httpParams);  
   return client;  
}  

 

1. HttpClient的范围

  • 基于HttpCore[http://hc.apache.org/httpcomponents-core/index.html]的客户端HTTP运输实现库
  • 基于经典(阻塞)I/O
  • 内容无关

2. 什么是HttpClient不能作的

  • HttpClient不是一个浏览器。它是一个客户端的HTTP通讯实现库。HttpClient的目标是发送和接收HTTP报文。HttpClient不会去缓存内容,执行嵌入在HTML页面中的javascript代码,猜想内容类型,从新格式化请求/重定向URI,或者其它和HTTP运输无关的功能。

第一章 基础

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。

请求的URI是统一资源定位符,它标识了应用于哪一个请求之上的资源。HTTP请求URI包含一个协议模式,主机名称,可选的端口,资源路径,可选的查询和可选的片断。

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 处理报文头部

一个HTTP报文能够包含不少描述如内容长度,内容类型等信息属性的头部信息。

HttpClient提供获取,添加,移除和枚举头部信息的方法。

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"

得到给定类型的全部头部信息最有效的方式是使用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报文到独立头部信息元素的方法方法。

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

 暂时先整理到这里,附上转载连接:http://blog.csdn.net/yujian_bing/article/details/8174572

相关文章
相关标签/搜索