文档章节

研究支付时碰到了 httpclient 围观

JAVA码猿
 JAVA码猿
发布于 2017/11/07 22:02
字数 1255
阅读 23
收藏 0

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

interface HttpClient ,

实现类有AbstractHttpClient、AndroidHttpClient

 DefaultHttpClient extends AbstractHttpClient

 

一个简单的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) {

}

}

   /** 

* 为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

本文转载自:http://blog.csdn.net/yujian_bing/article/details/8174572

共有 人打赏支持
JAVA码猿
粉丝 10
博文 60
码字总数 44107
作品 0
海淀
程序员
httpClient4.2官方文档研究

前言 超文本传输协议(HTTP)也许是最常用的在互联网上使用的协议。 Web服务,支持网络设备和网络计算的增长继续扩大用户驱动的Web浏览器的HTTP协议之外的作用,同时增加了一些应用程序需要H...

harries
2015/08/24
0
0
httpclient4.4 出现NoHttpResponseException的异常解决

httpclient4.4简单初始化httpclient的方式: 使用连接池初始化httpclient的方式: 但在测试过程中发现,有时候出现如下的异常,但重试一次就没有问题: 网上查了相关的报错信息,找到官网上的...

一路向北的兔斯基
2015/07/30
0
1
Apache HttpClient POST数据(https)

测试用的httpclient版本 <dependency> </dependency> 1.传键值对 http://www.androidsnippets.com/executing-a-http-post-request-with-httpclient 2.发送https请求 http://javaskeleton.bl......

cyper
2014/12/09
0
2
自己动手写压力测试-三剑客HttpClient+Async+Parallel

曾经沧海难为水 信息如水 压力如潮 功能实现阶段,我们对得要处理的信息分析得很细致,很透彻,所谓细如丝,透如水。然而,到了产品的阶段,要处理的信息却如同潮洪而至,原本的假设预想,通...

予沁安
2013/04/17
0
6
Android:HttpClient研究

HttpClient4 用法 由HttpClient3 升级到 HttpClient_4 必看 摘要:HttpClient程序包是一个实现了 HTTP 协议的客户端编程工具包,要想熟练的掌握它,必须熟悉HTTP协议。一个最简单的调用如下:...

boonya
2015/03/27
0
2

没有更多内容

加载失败,请刷新页面

加载更多

区块链入门教程以太坊源码分析ethdb源码分析

兄弟连区块链入门教程以太坊源码分析ethdb源码分析,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退...

兄弟连区块链入门教程
13分钟前
1
0
Eclipse下忽略掉node_modules目录相关配置

https://blog.csdn.net/yzf913214/article/details/72872523

张宏亮1982
14分钟前
1
0
在Python-dataframe中如何把出生日期转化为年龄?

我们在做数据挖掘项目或大数据竞赛时,如果个体是人的时候,获得的数据中可能有出生日期的Series,举个简单例子,比如这样的一些数: # -*- coding: utf-8 -*- import pandas as pd from ...

Mr_zebra
16分钟前
1
0
Android入门—activity生命周期

activity生命周期如下所示: onCreate()方法 创建activity时使用onStart()方法 当activity界面变为用户可见时调用onResume()方法 当activity界面获取到焦点时调用(界面按钮可点击,...

haoyuehong
18分钟前
1
0
使用C++ Builder 6编译产生错误

错误提示: [C++ Error] E2075 Incorrect project override option: Files\Borland\CBuilder6\lib\vcl60.csm[C++ Error] E2075 Incorrect project override option: Files\Borland\CBuilde......

simpower
21分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部