搜档网
当前位置:搜档网 › HttpURLConnection, HttpClient机制分析

HttpURLConnection, HttpClient机制分析

HttpURLConnection, HttpClient机制分析
HttpURLConnection, HttpClient机制分析

HttpURLConnection, HttpClient机制分析

HttpClient

httpClient.execute(Method) 直接发送请求并读取响应,而 method.getResponseBody 其实只是从response缓存中进行读取

HttpClient委托HttpConnectionManager管理连接,委托HttpMethodDirector执行方法,其本身是无状态线程安全的。

connectManager分为:

SimpleHttpConnectorManager为默认选项。会复用连接,但是如果host改变了,则会打开新的链接。

MultiThreadedHttpConnectionManager 为每个host作了一个连接池,放在map中,key =hostConfig value = connectPool,每次根据host从池子中获取连接,并复用之

DummyConnectionManager 则不管host,一律重新建立连接

每次new HttpClient()会新建socket,可以通过 commons-pool,自行实现连接池:[java]view plaincopy

1.public class PoolableHttpClientFactory implements Poolabl

eObjectFactory {

2.

3.private int timeout;

4.public PoolableHttpClientFactory(int timeout) {

5.this.timeout = timeout;

6. }

7.

8.public Object makeObject() throws Exception {

9. HttpClient httpClient = new HttpClient();

10. HttpConnectionManagerParams configParams = h

ttpClient.getHttpConnectionManager().getParams();

11. configParams.setConnectionTimeout(timeout);

12. configParams.setSoTimeout(timeout);

13. httpClient.getParams().setConnectionManagerT

imeout(timeout);

14.return httpClient;

15. }

16.

17.public void destroyObject(Object obj) throws Exc

eption {

18. }

19.

20.public boolean validateObject(Object obj) {

21.return true;

22. }

23.

24.public void activateObject(Object obj) throws Ex

ception {

25. }

26.

27.public void passivateObject(Object obj) throws E

xception {

28. }

29.

30.}

[java]view plaincopy

1.ExecutorService s = Executors.newFixedThreadPool(2);

2.

3.final ObjectPool pool = new GenericObjectPool(

4.new PoolableHttpClientFactory(2000),

5.10,

6. GenericObjectPool.WHEN_EXHAUSTED_FAIL,

7.3000, 2, 1, false, false, 60000, 10, 60000, false

);

8.

9.for(int i = 0; i < 2; ++i)

10.s.execute(new Runnable() {

11.public void run() {

12.while(true) {

13.try {

14. Thread.sleep(new Random().nextInt(50

0));

15.

16. PostMethod method = new PostMethod("

http://127.0.0.1:8080/index");

17. HttpClient hc = (HttpClient) pool.bo

rrowObject();

18. hc.executeMethod(method);

19. String resp = method.getResponseBody

AsString();

20.if(resp.indexOf("jack") == -

1) System.out.println(resp);

21.

22. method.releaseConnection();

23. pool.returnObject(hc);

24. } catch(Exception e) {

25. e.printStackTrace();

26. }

27. }

28. }

29.});

TIP ===================

HttpMethod.setParams(HttpMethodParams)指的是“超时时间”这样的连接属性

对于请求参数,PostMethod.addParameter(k,v) 而GetMethod则需要自行组装url了,记得作 URLEncoder.encode()

HttpURLConnection

1、new URL("http://xx.xx").openConnection(); 会打

开 https://www.sodocs.net/doc/ad3003401.html,.www.protocol.http.HttpURLConnection, 其conn.connect()函数会从

https://www.sodocs.net/doc/ad3003401.html,.www.http.HttpClient内部的静态连接缓冲池中获取HttpClient连接,对应到一个Socket连接。静态连接池是一个HashTable, key = URL, value = HttpClient

2、HttpURLConnection.getInputStream()会返回

https://www.sodocs.net/doc/ad3003401.html,.www.protocol.http.HttpURLConnection$HttpInputStream,其

connection.getInputStream.close()函数并不关闭Socket,而是将连接还给连接池。HttpClient

httpClient.execute(Method) 直接发送请求并读取响应,而 method.getResponseBody 其实只是从response缓存中进行读取

HttpClient委托HttpConnectionManager管理连接,委托HttpMethodDirector执行方法,其本身是无状态线程安全的。

connectManager分为:

SimpleHttpConnectorManager为默认选项。会复用连接,但是如果host改变了,则会打开新的链接。

MultiThreadedHttpConnectionManager 为每个host作了一个连接池,放在map中,key =hostConfig value = connectPool,每次根据host从池子中获取连接,并复用之

DummyConnectionManager 则不管host,一律重新建立连接

每次new HttpClient()会新建socket,可以通过 commons-pool,自行实现连接池:[java]view plaincopy

1.public class PoolableHttpClientFactory implements Poolabl

eObjectFactory {

2.

3.private int timeout;

4.public PoolableHttpClientFactory(int timeout) {

5.this.timeout = timeout;

6. }

7.

8.public Object makeObject() throws Exception {

9. HttpClient httpClient = new HttpClient();

10. HttpConnectionManagerParams configParams = h

ttpClient.getHttpConnectionManager().getParams();

11. configParams.setConnectionTimeout(timeout);

12. configParams.setSoTimeout(timeout);

13. httpClient.getParams().setConnectionManagerT

imeout(timeout);

14.return httpClient;

15. }

16.

17.public void destroyObject(Object obj) throws Exc

eption {

18. }

19.

20.public boolean validateObject(Object obj) {

21.return true;

22. }

23.

24.public void activateObject(Object obj) throws Ex

ception {

25. }

26.

27.public void passivateObject(Object obj) throws E

xception {

28. }

29.

30.}

[java]view plaincopy

1.ExecutorService s = Executors.newFixedThreadPool(2);

2.

3.final ObjectPool pool = new GenericObjectPool(

4.new PoolableHttpClientFactory(2000),

5.10,

6. GenericObjectPool.WHEN_EXHAUSTED_FAIL,

7.3000, 2, 1, false, false, 60000, 10, 60000, false

);

8.

9.for(int i = 0; i < 2; ++i)

10.s.execute(new Runnable() {

11.public void run() {

12.while(true) {

13.try {

14. Thread.sleep(new Random().nextInt(50

0));

15.

16. PostMethod method = new PostMethod("

http://127.0.0.1:8080/index");

17. HttpClient hc = (HttpClient) pool.bo

rrowObject();

18. hc.executeMethod(method);

19. String resp = method.getResponseBody

AsString();

20.if(resp.indexOf("jack") == -

1) System.out.println(resp);

21.

22. method.releaseConnection();

23. pool.returnObject(hc);

24. } catch(Exception e) {

25. e.printStackTrace();

26. }

27. }

28. }

29.});

TIP ===================

HttpMethod.setParams(HttpMethodParams)指的是“超时时间”这样的连接属性

对于请求参数,PostMethod.addParameter(k,v) 而GetMethod则需要自行组装url了,记得作 URLEncoder.encode()

HttpURLConnection

1、new URL("http://xx.xx").openConnection(); 会打

开 https://www.sodocs.net/doc/ad3003401.html,.www.protocol.http.HttpURLConnection, 其conn.connect()函数会从

https://www.sodocs.net/doc/ad3003401.html,.www.http.HttpClient内部的静态连接缓冲池中获取HttpClient连接,对应到一个Socket连接。静态连接池是一个HashTable, key = URL, value = HttpClient

2、HttpURLConnection.getInputStream()会返回

https://www.sodocs.net/doc/ad3003401.html,.www.protocol.http.HttpURLConnection$HttpInputStream,其

connection.getInputStream.close()函数并不关闭Socket,而是将连接还给连接池。HttpClient

httpClient.execute(Method) 直接发送请求并读取响应,而 method.getResponseBody 其实只是从response缓存中进行读取

HttpClient委托HttpConnectionManager管理连接,委托HttpMethodDirector执行方法,其本身是无状态线程安全的。

connectManager分为:

SimpleHttpConnectorManager为默认选项。会复用连接,但是如果host改变了,则会打开新的链接。

MultiThreadedHttpConnectionManager 为每个host作了一个连接池,放在map中,key =hostConfig value = connectPool,每次根据host从池子中获取连接,并复用之

DummyConnectionManager 则不管host,一律重新建立连接

每次new HttpClient()会新建socket,可以通过 commons-pool,自行实现连接池:[java]view plaincopy

1.public class PoolableHttpClientFactory implements Poolabl

eObjectFactory {

2.

3.private int timeout;

4.public PoolableHttpClientFactory(int timeout) {

5.this.timeout = timeout;

6. }

7.

8.public Object makeObject() throws Exception {

9. HttpClient httpClient = new HttpClient();

10. HttpConnectionManagerParams configParams = h

ttpClient.getHttpConnectionManager().getParams();

11. configParams.setConnectionTimeout(timeout);

12. configParams.setSoTimeout(timeout);

13. httpClient.getParams().setConnectionManagerT

imeout(timeout);

14.return httpClient;

15. }

16.

17.public void destroyObject(Object obj) throws Exc

eption {

18. }

19.

20.public boolean validateObject(Object obj) {

21.return true;

22. }

23.

24.public void activateObject(Object obj) throws Ex

ception {

25. }

26.

27.public void passivateObject(Object obj) throws E

xception {

28. }

29.

30.}

[java]view plaincopy

1.ExecutorService s = Executors.newFixedThreadPool(2);

2.

3.final ObjectPool pool = new GenericObjectPool(

4.new PoolableHttpClientFactory(2000),

5.10,

6. GenericObjectPool.WHEN_EXHAUSTED_FAIL,

7.3000, 2, 1, false, false, 60000, 10, 60000, false

);

8.

9.for(int i = 0; i < 2; ++i)

10.s.execute(new Runnable() {

11.public void run() {

12.while(true) {

13.try {

14. Thread.sleep(new Random().nextInt(50

0));

15.

16. PostMethod method = new PostMethod("

http://127.0.0.1:8080/index");

17. HttpClient hc = (HttpClient) pool.bo

rrowObject();

18. hc.executeMethod(method);

19. String resp = method.getResponseBody

AsString();

20.if(resp.indexOf("jack") == -

1) System.out.println(resp);

21.

22. method.releaseConnection();

23. pool.returnObject(hc);

24. } catch(Exception e) {

25. e.printStackTrace();

26. }

27. }

28. }

29.});

TIP ===================

HttpMethod.setParams(HttpMethodParams)指的是“超时时间”这样的连接属性

对于请求参数,PostMethod.addParameter(k,v) 而GetMethod则需要自行组装url了,记得作 URLEncoder.encode()

HttpURLConnection

1、new URL("http://xx.xx").openConnection(); 会打

开 https://www.sodocs.net/doc/ad3003401.html,.www.protocol.http.HttpURLConnection, 其conn.connect()函数会从

https://www.sodocs.net/doc/ad3003401.html,.www.http.HttpClient内部的静态连接缓冲池中获取HttpClient连接,对应到一个Socket连接。静态连接池是一个HashTable, key = URL, value = HttpClient

2、HttpURLConnection.getInputStream()会返回

https://www.sodocs.net/doc/ad3003401.html,.www.protocol.http.HttpURLConnection$HttpInputStream,其

connection.getInputStream.close()函数并不关闭Socket,而是将连接还给连接池。HttpClient

httpClient.execute(Method) 直接发送请求并读取响应,而 method.getResponseBody 其实只是从response缓存中进行读取

HttpClient委托HttpConnectionManager管理连接,委托HttpMethodDirector执行方法,其本身是无状态线程安全的。

connectManager分为:

SimpleHttpConnectorManager为默认选项。会复用连接,但是如果host改变了,则会打开新的链接。

MultiThreadedHttpConnectionManager 为每个host作了一个连接池,放在map中,key =hostConfig value = connectPool,每次根据host从池子中获取连接,并复用之

DummyConnectionManager 则不管host,一律重新建立连接

每次new HttpClient()会新建socket,可以通过 commons-pool,自行实现连接池:[java]view plaincopy

1.public class PoolableHttpClientFactory implements Poolabl

eObjectFactory {

2.

3.private int timeout;

4.public PoolableHttpClientFactory(int timeout) {

5.this.timeout = timeout;

6. }

7.

8.public Object makeObject() throws Exception {

9. HttpClient httpClient = new HttpClient();

10. HttpConnectionManagerParams configParams = h

ttpClient.getHttpConnectionManager().getParams();

11. configParams.setConnectionTimeout(timeout);

12. configParams.setSoTimeout(timeout);

13. httpClient.getParams().setConnectionManagerT

imeout(timeout);

14.return httpClient;

15. }

16.

17.public void destroyObject(Object obj) throws Exc

eption {

18. }

19.

20.public boolean validateObject(Object obj) {

21.return true;

22. }

23.

24.public void activateObject(Object obj) throws Ex

ception {

25. }

26.

27.public void passivateObject(Object obj) throws E

xception {

28. }

29.

30.}

[java]view plaincopy

1.ExecutorService s = Executors.newFixedThreadPool(2);

2.

3.final ObjectPool pool = new GenericObjectPool(

4.new PoolableHttpClientFactory(2000),

5.10,

6. GenericObjectPool.WHEN_EXHAUSTED_FAIL,

7.3000, 2, 1, false, false, 60000, 10, 60000, false

);

8.

9.for(int i = 0; i < 2; ++i)

10.s.execute(new Runnable() {

11.public void run() {

12.while(true) {

13.try {

14. Thread.sleep(new Random().nextInt(50

0));

15.

16. PostMethod method = new PostMethod("

http://127.0.0.1:8080/index");

17. HttpClient hc = (HttpClient) pool.bo

rrowObject();

18. hc.executeMethod(method);

19. String resp = method.getResponseBody

AsString();

20.if(resp.indexOf("jack") == -

1) System.out.println(resp);

21.

22. method.releaseConnection();

23. pool.returnObject(hc);

24. } catch(Exception e) {

25. e.printStackTrace();

26. }

27. }

28. }

29.});

TIP ===================

HttpMethod.setParams(HttpMethodParams)指的是“超时时间”这样的连接属性

对于请求参数,PostMethod.addParameter(k,v) 而GetMethod则需要自行组装url了,记得作 URLEncoder.encode()

HttpURLConnection

1、new URL("http://xx.xx").openConnection(); 会打

开 https://www.sodocs.net/doc/ad3003401.html,.www.protocol.http.HttpURLConnection, 其conn.connect()函数会从

https://www.sodocs.net/doc/ad3003401.html,.www.http.HttpClient内部的静态连接缓冲池中获取HttpClient连接,对应到一个Socket连接。静态连接池是一个HashTable, key = URL, value = HttpClient

2、HttpURLConnection.getInputStream()会返回

https://www.sodocs.net/doc/ad3003401.html,.www.protocol.http.HttpURLConnection$HttpInputStream,其

connection.getInputStream.close()函数并不关闭Socket,而是将连接还给连接池。HttpClient

httpClient.execute(Method) 直接发送请求并读取响应,而 method.getResponseBody 其实只是从response缓存中进行读取

HttpClient委托HttpConnectionManager管理连接,委托HttpMethodDirector执行方法,其本身是无状态线程安全的。

connectManager分为:

SimpleHttpConnectorManager为默认选项。会复用连接,但是如果host改变了,则会打开新的链接。

MultiThreadedHttpConnectionManager 为每个host作了一个连接池,放在map中,key =hostConfig value = connectPool,每次根据host从池子中获取连接,并复用之

DummyConnectionManager 则不管host,一律重新建立连接

每次new HttpClient()会新建socket,可以通过 commons-pool,自行实现连接池:[java]view plaincopy

1.public class PoolableHttpClientFactory implements Poolabl

eObjectFactory {

2.

3.private int timeout;

4.public PoolableHttpClientFactory(int timeout) {

5.this.timeout = timeout;

6. }

7.

8.public Object makeObject() throws Exception {

9. HttpClient httpClient = new HttpClient();

10. HttpConnectionManagerParams configParams = h

ttpClient.getHttpConnectionManager().getParams();

11. configParams.setConnectionTimeout(timeout);

12. configParams.setSoTimeout(timeout);

13. httpClient.getParams().setConnectionManagerT

imeout(timeout);

14.return httpClient;

15. }

16.

17.public void destroyObject(Object obj) throws Exc

eption {

18. }

19.

20.public boolean validateObject(Object obj) {

21.return true;

22. }

23.

24.public void activateObject(Object obj) throws Ex

ception {

25. }

26.

27.public void passivateObject(Object obj) throws E

xception {

28. }

29.

30.}

[java]view plaincopy

1.ExecutorService s = Executors.newFixedThreadPool(2);

2.

3.final ObjectPool pool = new GenericObjectPool(

4.new PoolableHttpClientFactory(2000),

5.10,

6. GenericObjectPool.WHEN_EXHAUSTED_FAIL,

7.3000, 2, 1, false, false, 60000, 10, 60000, false

);

8.

9.for(int i = 0; i < 2; ++i)

10.s.execute(new Runnable() {

11.public void run() {

12.while(true) {

13.try {

14. Thread.sleep(new Random().nextInt(50

0));

15.

16. PostMethod method = new PostMethod("

http://127.0.0.1:8080/index");

17. HttpClient hc = (HttpClient) pool.bo

rrowObject();

18. hc.executeMethod(method);

19. String resp = method.getResponseBody

AsString();

20.if(resp.indexOf("jack") == -

1) System.out.println(resp);

21.

22. method.releaseConnection();

23. pool.returnObject(hc);

24. } catch(Exception e) {

25. e.printStackTrace();

26. }

27. }

28. }

29.});

TIP ===================

HttpMethod.setParams(HttpMethodParams)指的是“超时时间”这样的连接属性

对于请求参数,PostMethod.addParameter(k,v) 而GetMethod则需要自行组装url了,记得作 URLEncoder.encode()

HttpURLConnection

1、new URL("http://xx.xx").openConnection(); 会打

开 https://www.sodocs.net/doc/ad3003401.html,.www.protocol.http.HttpURLConnection, 其conn.connect()函数会从

https://www.sodocs.net/doc/ad3003401.html,.www.http.HttpClient内部的静态连接缓冲池中获取HttpClient连接,对应到一个Socket连接。静态连接池是一个HashTable, key = URL, value = HttpClient

2、HttpURLConnection.getInputStream()会返回

https://www.sodocs.net/doc/ad3003401.html,.www.protocol.http.HttpURLConnection$HttpInputStream,其

connection.getInputStream.close()函数并不关闭Socket,而是将连接还给连接池。HttpClient

httpClient.execute(Method) 直接发送请求并读取响应,而 method.getResponseBody 其实只是从response缓存中进行读取

HttpClient委托HttpConnectionManager管理连接,委托HttpMethodDirector执行方法,其本身是无状态线程安全的。

connectManager分为:

SimpleHttpConnectorManager为默认选项。会复用连接,但是如果host改变了,则会打开新的链接。

MultiThreadedHttpConnectionManager 为每个host作了一个连接池,放在map中,key =hostConfig value = connectPool,每次根据host从池子中获取连接,并复用之

DummyConnectionManager 则不管host,一律重新建立连接

每次new HttpClient()会新建socket,可以通过 commons-pool,自行实现连接池:[java]view plaincopy

1.public class PoolableHttpClientFactory implements Poolabl

eObjectFactory {

2.

3.private int timeout;

4.public PoolableHttpClientFactory(int timeout) {

5.this.timeout = timeout;

6. }

7.

8.public Object makeObject() throws Exception {

9. HttpClient httpClient = new HttpClient();

10. HttpConnectionManagerParams configParams = h

ttpClient.getHttpConnectionManager().getParams();

11. configParams.setConnectionTimeout(timeout);

12. configParams.setSoTimeout(timeout);

13. httpClient.getParams().setConnectionManagerT

imeout(timeout);

14.return httpClient;

15. }

16.

17.public void destroyObject(Object obj) throws Exc

eption {

18. }

19.

20.public boolean validateObject(Object obj) {

21.return true;

22. }

23.

24.public void activateObject(Object obj) throws Ex

ception {

25. }

26.

27.public void passivateObject(Object obj) throws E

xception {

28. }

29.

30.}

[java]view plaincopy

1.ExecutorService s = Executors.newFixedThreadPool(2);

2.

3.final ObjectPool pool = new GenericObjectPool(

4.new PoolableHttpClientFactory(2000),

5.10,

6. GenericObjectPool.WHEN_EXHAUSTED_FAIL,

7.3000, 2, 1, false, false, 60000, 10, 60000, false

);

8.

9.for(int i = 0; i < 2; ++i)

10.s.execute(new Runnable() {

11.public void run() {

12.while(true) {

13.try {

14. Thread.sleep(new Random().nextInt(50

0));

15.

16. PostMethod method = new PostMethod("

http://127.0.0.1:8080/index");

17. HttpClient hc = (HttpClient) pool.bo

rrowObject();

18. hc.executeMethod(method);

19. String resp = method.getResponseBody

AsString();

20.if(resp.indexOf("jack") == -

1) System.out.println(resp);

21.

22. method.releaseConnection();

23. pool.returnObject(hc);

24. } catch(Exception e) {

25. e.printStackTrace();

26. }

27. }

28. }

29.});

TIP ===================

HttpMethod.setParams(HttpMethodParams)指的是“超时时间”这样的连接属性

对于请求参数,PostMethod.addParameter(k,v) 而GetMethod则需要自行组装url了,记得作 URLEncoder.encode()

HttpURLConnection

WebApi系列~通过HttpClient来调用WebApi接口

回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api的方法,基于api项目的特殊性,它需要有一个完全安全的环境,所以,你的api控制器看起来有点特别,只有5个方法,而且都是标准的http方法,我觉得这种设计很不错,很清晰,而且为了实现安全性,它不支持使用传统的表单数据,取而代之的是FromBody参数,它指拿HttpRequestMessage里参数,而不是所有的Request数据,这是基于安全方面的考虑。一Api接口参数的标准性 Get方式,可以有多个重载,有多个参数 POST方式,只能有一个参数,并且用[FromBody]约束,如果有多个参数,需要以对象的方式进行传递 Put方式,只能有两个参数,其中一个是通过Request.QueryString方式进行传递的,作为要更新对象的主键,别一个是[FromBody]字段,也是一个字段,如果多个字段需要把它封装成对象 标准接口如图 二调用方,参数的标准性 在客户端进行接口调用时,我们以网页端为例,看一下网页端进行ajax跨域请求的代码

Get方式 $.ajax({ url: "http://localhost:52824/api/register", type: "GET", success: function (data) { console.log("json:" + data); } }); Post方式 $.ajax({ url: "http://localhost:52824/api/register", type: "POST", data: { '': '1' },//这里键名称必须为空,多个参数请传对象,api端参数名必须为value success: function (data) { console.log("post:" + data); } }); 三在控制台中实现Get方式获取接口数据(只有异步实现) ///

/// HttpClient实现Get请求 /// static async void dooGet() { string url = "http://localhost:52824/api/register?id=1&leval=5"; //创建HttpClient(注意传入HttpClientHandler) var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }; using (var http = new HttpClient(handler)) { //await异步等待回应 var response = await http.GetAsync(url);

JAVA-用HttpClient来模拟浏览器GET,POST

一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等。所访问的这些页面有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS。目前我们使用的浏览器处理这些情况都不会构成问题。不过你可能在某些时候需要通过程序来访问这样的一些页面,比如从别人的网页中“偷”一些数据;利用某些站点提供的页面来完成某种功能,例如说我们想知道某个手机号码的归属地而我们自己又没有这样的数据,因此只好借助其他公司已有的网站来完成这个功能,这个时候我们需要向网页提交手机号码并从返回的页面中解析出我们想要的数据来。如果对方仅仅是一个很简单的页面,那我们的程序会很简单,本文也就没有必要大张旗鼓的在这里浪费口舌。但是考虑到一些服务授权的问题,很多公司提供的页面往往并不是可以通过一个简单的URL就可以访问的,而必须经过注册然后登录后方可使用提供服务的页面,这个时候就涉及到COOKIE问题的处理。我们知道目前流行的动态网页技术例如ASP、JSP无不是通过COOKIE来处理会话信息的。为了使我们的程序能使用别人所提供的服务页面,就要求程序首先登录后再访问服务页面,这过程就需要自行处理cookie,想想当你用https://www.sodocs.net/doc/ad3003401.html,.HttpURLConnection来完成这些功能时是多么恐怖的事情啊!况且这仅仅是我们所说的顽固的WEB服务器中的一个很常见的“顽固”!再有如通过HTTP来上传文件呢?不需要头疼,这些问题有了“它”就很容易解决了! 我们不可能列举所有可能的顽固,我们会针对几种最常见的问题进行处理。当然了,正如前面说到的,如果我们自己使用https://www.sodocs.net/doc/ad3003401.html,.HttpURLConnection来搞定这些问题是很恐怖的事情,因此在开始之前我们先要介绍一下一个开放源码的项目,这个项目就是Apache开源组织中的httpclient,它隶属于Jakarta的commons项目,目前的版本是2.0RC2。commons下本来已经有一个net的子项目,但是又把httpclient单独提出来,可见http 服务器的访问绝非易事。 Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。通过它可以让原来很头疼的事情现在轻松的解决,例如你不再管是HTTP或者HTTPS 的通讯方式,告诉它你想使用HTTPS方式,剩下的事情交给httpclient替你完成。本文会针对我们在编写HTTP客户端程序时经常碰到的几个问题进行分别介绍如何使用httpclient来解决它们,为了让读者更快的熟悉这个项目我们最开始先给出一个简单的例子来读取一个网页的内容,然后循序渐进解决掉前进中的所有问题。 1.读取网页(HTTP/HTTPS)内容 下面是我们给出的一个简单的例子用来访问某个页面 /* * Created on 2003-12-14 by Liudong */ package http.demo; import java.io.IOException; import https://www.sodocs.net/doc/ad3003401.html,mons.httpclient.*; import https://www.sodocs.net/doc/ad3003401.html,mons.httpclient.methods.*; /** * 最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面 * @author Liudong

经典教程httpClient4

目录 HttpClient简介 (4) 1)百科名片: (4) 2)HttpClient 的范围 (4) 3)httpClient 特性 (4) HttpClient基本功能的使用 (6) a)环境准备 (6) b)几个主要类解释 (6) c)第一个程序 (6) d)如何传递参数 (8) e)模拟表单登录 (10) f)HttpClient连接SSL (12) 1)生成KeyStore (12) 2)配置tomcat服务器支持SSL (13) 3)用浏览器访问你的应用 (15) 4)用httpClient访问https (15)

HttpClient简介 1)百科名片: HTTP 协议可能是现在Internet 上使用得最多、最重要的协议了,越来越多的Java 应用程序需要直接通过HTTP 协议来访问网络资源。虽然在JDK 的java net包中已经提供了访问HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如Apache Jakarta 上很著名的另外两个开源项目Cactus 和HTMLUnit 都使用了HttpClient。现在HttpClient最新版本为HttpClient 4.1. 2)HttpClient 的范围 ?基于HttpCore的客户端HTTP运输实现库 ?基于经典(阻塞)I/O ?内容无关 3)httpClient 特性 ?基于标准,纯净的java语言.实现了Http1.0和Http1.1 ?以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE). ?支持HTTPS协议. ?通过Http代理建立透明的连接. ?利用CONNECT 方法通过Http代理建立隧道的https连接. ?Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos 认证方案. ?插件式的自定义认证方案. ?便携可靠的套接字工厂使它更容易的使用第三方解决方案. ?连接管理器支持多线程应用.支持设置最大连接数,同时支持设置每个主机的最大连接数.发现并关闭过期的连接. ?Automatic Cookie handling for reading Set-Cookie: headers from the server and sending them back out in a Cookie: header when appropriate. ?插件式的自定义Cookie策略. ?Request output streams to avoid buffering any content body by streaming directly to the socket to the server.

HTTPClient用法

HttpClient的用法 HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过HTTP 协议来访问网络资源。 Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。通过它可以让原来很头疼的事情现在轻松的解决,例如你不再管是HTTP或者HTTPS的通讯方式,告诉它你想使用HTTPS方式,剩下的事情交给 httpclient替你完成。 首先,我们必须安装好 HttpClient。 HttpClient 可以在https://www.sodocs.net/doc/ad3003401.html,/commons/httpclient/downloads.html下载. HttpClient 用到了 Apache Jakarta common 下的子项目 logging,你可以从这个地址 https://www.sodocs.net/doc/ad3003401.html,/site/downloads /downloads_commons-logging.cgi下载到 common logging,从下载后的压缩包中取出 commons-logging.jar 加到 CLASSPATH 中. HttpClient 用到了 Apache Jakarta common 下的子项目 codec,你可以从这个地址 https://www.sodocs.net/doc/ad3003401.html,/site/downloads /downloads_commons-codec.cgi 下载到最新的 common codec,从下载后的压缩包中取出 commons-codec-1.x.jar 加到 CLASSPATH 中 1.读取网页(HTTP/HTTPS)内容 下面是我们给出的一个简单的例子用来访问某个页面 package http.demo; import java.io.IOException; import https://www.sodocs.net/doc/ad3003401.html,mons.httpclient.*; import https://www.sodocs.net/doc/ad3003401.html,mons.httpclient.methods.*; /** * 最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面

HttpClient学习

HttpClient 学习笔记 笔记一: 1、HttpClient的功能 1.基于标准,纯正java,实现了http1.0和1.1。 2.在一个可扩展的OO框架内,实现了HTTP的全部方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE) 3.支持HTTPS(ssl上的HTTP)的加密操作 4.透明地穿过HTTP代理建立连接 5.通过CONNECT方法,利用通过建立穿过HTTP代理的HTTPS连接 6.利用本地Java socket,透明地穿过SOCKS(版本5和4)代理建立连接 7.支持利用Basic、Digest和NTLM加密的认证 8.支持用于上传大文件的Multi-Part表单POST方法 9.插件式安全socket实现,易于使用第三方的解决方案 10.连接管理,支持多线程应用,支持设定单个主机总连接和最高连接数量,自动检测和 关闭失效连接 11.直接将请求信息流送到服务器的端口 12.直接读取从服务器的端口送出的应答信息 13.支持HTTP/1.0中用KeepAlive和HTTP/1.1中用persistance设置的持久连接 14.直接访问由服务器送出的应答代码和头部信息 15.可设置连接超时时间 16. 17.HttpMethods 实现Command Pattern,以允许并行请求或高效连接复用 18.遵循the Apache Software License协议,源码免费可得

2、预备工作 对jre1.3.*,如果要HttpClient支持https,则需要下载并安装jsse和jce.安装的步骤如下: 1)下载jsse和jce. 2)检查CLASSPA TH中没有与jsse和jce相关的jar包 3)将US_export_policy.jar、local_policy.jar、jsse.jar、jnet.jar、jce1_2_x.jar、sunjce_provider.jar、jcert.jar复制到目录: UNIX:$JDK_HOME/jre/lib/ext Windows:%JDK_HOME%\jre\lib\ext 4)修改下述目录下的java.security文件。 UNIX:$JDK_HOME/jre/lib/security/ Windows:%JDK_HOME%\jre\lib\security\ 5) 将 # # List of providers and their preference orders: # security.provider.1=sun.security.provider.Sun security.provider.2=com.sun.rsajca.Provider 改为: # # List of providers and their preference orders: # security.provider.1=com.sun.crypto.provider.SunJCE security.provider.2=sun.security.provider.Sun security.provider.3=com.sun.rsajca.Provider security.provider.4=https://www.sodocs.net/doc/ad3003401.html,.ssl.internal.ssl.Provider HttpClient还要求安装commons-logging,下面跟httpclient一块安装。 3、取得源码 cvs -d :pserver:anoncvs@https://www.sodocs.net/doc/ad3003401.html,:/home/cvspublic login password: anoncvs cvs -d :pserver:anoncvs@https://www.sodocs.net/doc/ad3003401.html,:/home/cvspublic checkout jakarta-commons/logging cvs -d :pserver:anoncvs@https://www.sodocs.net/doc/ad3003401.html,:/home/cvspublic checkout jakarta-commons/httpclient 编译: cd jakarta-commons/logging ant dist cp dis/*.jar ../httpclient/lib/ cd ../httpclient

Java网络编程(三)HttpUrlConnection与HttpClient详解(雷惊风)

HttpUrlConnection与HttpClient详解 一.概念。 在Android开发中,AndroidSDK中对HTTP提供了很好的支持,主要包括两种接口。 1.一个是Sun公司提供的库,基于标准Java接口的 HttpURLConnection,这个类封装的很少,如果使用高级功 能,如重访问/Cookie/Session等就相当不方便。它可以实现 简单的基于URL的请求与相应功能。Google在Android Api23及以后的版本中推荐使用HttpURLConnention,在后 续版本中逐渐对其进行优化完善。在2.2版本以前,一直存 在着一些bug。比如对一个可读的InputStream调用close 方法时,可能会导致连接池失效。通常我们会禁用连接池功 能。 2.另一个是Apache公司提供的的HttpClient,它提供了高效的, 最新的功能丰富的api,支持Http协议工具包,支持HTTP 最新版本和建议,是个很好的开源框架,封装了http的请求, 参数,内容体,响应等,拥有众多API,但同时HttpClient 的API数量太多,如果不破坏兼容性的情况下想对他进行扩 展很麻烦。在API 23 SDK将其去掉了。建议使用 HttpURLConnection。 以上两种联网方式都支持HTTPS协议、以流的形式进行传输、 IPv6、配置超时时间、以及连接池等功能。

二.区别。 1.功能上,HttpClient库要丰富很多,提供了很多工具,封装了http 的请求头,参数,内容体,响应,还有一些高级功能,代理、COOKIE、鉴权、压缩、连接池的处理。 2.H ttpClient高级功能代码写起来比较复杂,对开发人员的要求会高 一些,而HttpURLConnection对大部分工作进行了包装,屏蔽了不需要的细节,适合开发人员直接调用。 3.HttpURLConnection在2.3版本增加了一些HTTPS方面的改进, 4.0版本增加一些响应的缓存。 4.HttpUrlConnection直接支持GZIP压缩;HttpClient也支持,但 要自己写代码处理。 5.HttpUrlConnection直接支持系统级连接池,即打开的连接不会直 接关闭,在一段时间内所有程序可共用;HttpClient当然也能做到,但毕竟不如官方直接系统底层支持好。 6.HttpUrlConnection直接在系统层面做了缓存策略处理(4.0版本 以上),加快了重复请求的速度。 7.HttpClient 适用于web browsers, 他们是可扩展的,并且拥有大 量的稳定APIs。但是,在不破坏其兼容性的前提下很难对如此多的APIs做修改。因此,Android 团队对修改优化Apache HTTP Client表现的并不积极。

HttpClient 简介

HttpClient简介 HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP 协议最新的版本和建议。本文首先介绍HTTPClient,然后根据作者实际工作经验给出了一些常见问题的解决方法。HTTP 协议可能是现在Internet 上使用得最多、最重要的协议了,越来越多的Java 应用程序需要直接通过HTTP 协议来访问网络资源。虽然在JDK 的https://www.sodocs.net/doc/ad3003401.html, 包中已经提供了访问HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如Apache Jakarta 上很著名的另外两个开源项目Cactus 和HTMLUnit 都使用了HttpClient。现在HttpClient最新版本为HttpClient 4.0-beta2 2.HttpClient 功能介绍 以下列出的是HttpClient 提供的主要的功能,要知道更多详细的功能可以参见HttpClient 的主页。 (1)实现了所有HTTP 的方法(GET,POST,PUT,HEAD 等) (2)支持自动转向 (3)支持HTTPS 协议 (4)支持代理服务器等 3.HttpClient 基本功能的使用 (1) GET方法 使用HttpClient 需要以下6 个步骤:

httpClient远程调用webService

我们将Web Service发布在Tomcat或者其他应用服务器上后,有很多方法可以调用该Web Service,常用的有两种: 1、通过浏览器HTTP调用,返回规范的XML文件内容 2、通过客户端程序调用,返回结果可自定义格式 接下来,我利用Eclipse作为开发工具,演示一个Httpclient调用WebService的简单示例 步骤如下: 准备工作:用到的jar包有:下载链接 (https://www.sodocs.net/doc/ad3003401.html,/detail/lanxuezaipiao/5354480) 第一步:新建Java Project,项目名称为HttpCallWebService 第二步:将所需jar包导入到库中 第三步:编写调用class,这里有两种方式调用,即GET方式和POST方式,由于POST 方式较安全,故这里采用POST方式调用;请求数据的构造也有两种方式:静态和动态构造,下面分别介绍这两种方式: 注:这里以E邮宝开放的webservice接口为例调用其中一个API函数,而E邮宝的webservice基于SOAP,故请求数据为SOAP格式,大家可根据自己情况进行修改。静态构造请求数据: package com.http; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import https://www.sodocs.net/doc/ad3003401.html,mons.httpclient.HttpClient; import https://www.sodocs.net/doc/ad3003401.html,mons.httpclient.HttpException; import https://www.sodocs.net/doc/ad3003401.html,mons.httpclient.methods.InputStreamRequestEntity; import https://www.sodocs.net/doc/ad3003401.html,mons.httpclient.methods.PostMethod; import https://www.sodocs.net/doc/ad3003401.html,mons.httpclient.methods.RequestEntity; public class StaticHttpclientCall { /** * @param args * @throws IOException * @throws HttpException */ public static void main(String[] args) throws HttpException, IOException { // TODO Auto-generated method stub

httpclientorg.apache.http.nohttpresponseexceptionhost端口failedtorespond错误原因和解决方法

httpclient org.apache.http.NoHttpResponseException host 端口failed to respond 错误原因和解决方法 import com.google.api.client.http.ByteArrayContent; import com.google.api.client.http.GenericUrl; import com.google.api.client.http.HttpBackOffUnsuccessfulRespo nseHandler; import com.google.api.client.http.HttpContent; import com.google.api.client.http.HttpHeaders; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpRequestFactory; import com.google.api.client.http.HttpResponse; import com.google.api.client.http.HttpStatusCodes; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.apache.ApacheHttpTransport; import com.google.api.client.util.BackOff; import java.io.IOException; import java.io.InputStream; import https://www.sodocs.net/doc/ad3003401.html,.ProxySelector; import java.util.Map;

comons_httpClient教程

comons_httpClient教程 Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。 1.读取网页(HTTP/HTTPS)内容 最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面 Java代码 1.package http.demo; 2. 3.import java.io.IOException; 4.import https://www.sodocs.net/doc/ad3003401.html,mons.httpclient.*; 5.import https://www.sodocs.net/doc/ad3003401.html,mons.httpclient.methods.*; 6. 7.public class SimpleClient { 8. 9. public static void main(String[] args) throws IOException 10. { 11. HttpClient client = new HttpClient(); 12. 13. //设置代理服务器地址和端口 14. 15. //client.getHostConfiguration().setProxy("proxy_host_ad dr",proxy_port); 16. 17. //使用GET方法,如果服务器需要通过HTTPS连接,那只需要将 下面URL中的http换成https 18. 19. HttpMethod method = new GetMethod("https://www.sodocs.net/doc/ad3003401.html," ); 20. 21. //使用POST方法 22. 23. //HttpMethod method = new PostMethod("http://java.sun.c om"); 24. 25. client.executeMethod(method); 26. 27. //打印服务器返回的状态

HttpClient 4 实现文件下载

有时需要通过httpclient进行文件下载,下面是文件下载的实现过程 Java代码 1.import java.io.File; 2.import java.io.FileOutputStream; 3.import java.io.IOException; 4.import java.io.InputStream; 5. 6.import org.apache.http.HttpEntity; 7.import org.apache.http.HttpHost; 8.import org.apache.http.HttpResponse; 9.import org.apache.http.HttpStatus; 10.import org.apache.http.client.ClientProtocolException; 11.import org.apache.http.client.HttpClient; 12.import org.apache.http.client.methods.HttpGet; 13.import org.apache.http.impl.client.DefaultHttpClient; 14. 15.public class SearchDomain { 16. 17.public static void main(String[] args) throws ClientProtocolException, IOException { 18.//实例化一个HttpClient 19.HttpClient httpClient = new DefaultHttpClient(); 20.//设定目标站点web的默认端口80可以不写的当然如果是其它端口就要标明 21.HttpHost httpHost = new HttpHost("https://www.sodocs.net/doc/ad3003401.html,",80); 22.//设置需要下载的文件 23.HttpGet httpGet = new HttpGet("/test.zip"); 24.//这里也可以直接使用httpGet的绝对地址,当然如果不是具体地址不要忘记/结尾 25.//HttpGet httpGet = new HttpGet("https://www.sodocs.net/doc/ad3003401.html,/"); 26.//HttpResponse response = httpClient.execute(httpGet); 27. 28.HttpResponse response = httpClient.execute(httpHost, httpGet); 29.if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){ 30.//请求成功 31.//取得请求内容 32.HttpEntity entity = response.getEntity(); 33. 34.//显示内容 35.if (entity != null) { 36.//这里可以得到文件的类型如image/jpg /zip /tiff 等等但是发现并不是十分有效, 有时明明后缀是.rar但是取到的是null,这点特别说明 37.System.out.println(entity.getContentType()); 38.//可以判断是否是文件数据流

Java httpclient解决方案中的中文传递

Java httpclient解决方案中的中文传递(2009-03-05 17:21:33) 标签:杂谈 1 Commons HttpClient 开源项目简介 Http 协议是一种应用十分广泛的网络应用层协议。在Java 网络编程中我们会经常碰到Http 协议编程, 虽然JDK 提供了 HttpURLConnection 编程接口对Http 协议进行支持, 但是由于协议应用本身 的复杂性, 使得在大量实际项目单纯使用JDK 进行Http编程仍然相对比较困难。针对这种情况, 开源软件组织Apach 推出了HttpClient 开源组件, 并且提供稳定持续的升级版本, 因此在实际项目中采用HttpClient 组件进行Http 协议编程是一种高效经济的解决方案。 2 Commons HttpClient 中文环境下编程常见问题 由于HttpClient 组件设计的高度灵活性及易用性, 应用HttpClient 组件进行编程本身并不复杂。但是由于Java 编程环境自身容易出现字符编码问题, 衍生于Java 语言并主要由英语语系国家技术人员推出的HttpClient 组件自然在中文环境中会存在一定的编码问题, 同时由于部分Web 浏览器及Web 服务器并未严格实现标准Http 协议规范, 使得比较严格遵循标准Http 协议规范的 Http-Client 组件在与部分浏览器及服务器进行交互时会出现少量兼容性问题。笔者在中文环境下用HttpClinet 开发校外资源访问系统的过程中碰到系列HttpClient 技术问题, 经过测试查证找到相应的解决办法, 这对解决HttpClient 编程问题, 特别是中文环境下Http-Client 编程具有较大的借鉴 作用。( 注: 本文编程的HttpClient 组件版本为: Release 3.1 Beta 1) 3 Commons HttpClient 编程的典型问题及解决办法 3.1 URL 中文参数无法识别的问题 通常情况在Commons HttpClient 编程中我们用下列语句就可以向一个目标服务器提交一个Web 请求: HttpClient client=new HttpClient(); GetMethod method = new GetMethod (url);//本示例使用Get 方法, 当然也可使用Post 方法PostMethod method//=new PostMethod(url); client.executeMethod(method); InputStream receiver=method.getResponseBodyAsStream(); 如果URL 没有中文参数,以上语句执行起来没有任何问题,但是如果URL 中含有中文字符,中文参数将无法被Web 服务器识别, 程序虽然可以正常运行, 但却 无法得到正确结果。同时返回的Http 响应头, 如果含有中文字符也将出现乱码。分析源码发现, 这是HttpClient 中的HttpElementCharset 参数( 创建HTTP headers 的字符集) 的默认值为US- ASCII, ContentCharset 参数( 创建contentbody 的字符集) 的默认值为ISO- 8859- 1 的原故, 因此需要使用下列语句改变这些参数的默认值: client = new HttpClient(); params=client.getParams(); params.setHttpElementCharset("GBK"); params.setContentCharset("GBK"); 或者使用:

HttpClient基础入门

HttpClient基础入门 一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB 服务器,用来浏览页面查看信息或者提交一些数据等等。所访问的这些页面有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS。目前我们使用的浏览器处理这些情况都不会构成问题。不过你可能在某些时候需要通过程序来访问这样的一些页面,比如从别人的网页中“偷”一些数据;利用某些站点提供的页面来完成某种功能,例如说我们想知道某个手机号码的归属地而我们自己又没有这样的数据,因此只好借助其他公司已有的网站来完成这个功能,这个时候我们需要向网页提交手机号码并从返回的页面中解析出我们想要的数据来。如果对方仅仅是一个很简单的页面,那我们的程序会很简单,本文也就没有必要大张旗鼓的在这里浪费口舌。但是考虑到一些服务授权的问题,很多公司提供的页面往往并不是可以通过一个简单的URL就可以访问的,而必须经过注册然后登录后方可使用提供服务的页面,这个时候就涉及到COOKIE问题的处理。我们知道目前流行的动态网页技术例如ASP、JSP无不是通过COOKIE来处理会话信息的。为了使我们的程序能使用别人所提供的服务页面,就要求程序首先登录后再访问服务页面,这过程就需要自行处理cookie,想想当你用 https://www.sodocs.net/doc/ad3003401.html,.HttpURLConnection来完成这些功能时是多么恐怖

的事情啊!况且这仅仅是我们所说的顽固的WEB服务器中的一个很常见的“顽固”!再有如通过HTTP来上传文件呢?不需要头疼,这些问题有了“它”就很容易解决了! 我们不可能列举所有可能的顽固,我们会针对几种最常见的问题进行处理。当然了,正如前面说到的,如果我们自己使用https://www.sodocs.net/doc/ad3003401.html,.HttpURLConnection来搞定这些问题是很恐怖的事情,因此在开始之前我们先要介绍一下一个开放源码的项目,这个项目就是Apache开源组织中的httpclient,它隶属于Jakarta的commons项目,目前的版本是2.0RC2。commons下本来已经有一个net的子项目,但是又把httpclient单独提出来,可见http服务器的访问绝非易事。Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。通过它可以让原来很头疼的事情现在轻松的解决,例如你不再管是HTTP或者HTTPS的通讯方式,告诉它你想使用HTTPS方式,剩下的事情交给 httpclient替你完成。本文会针对我们在编写HTTP 客户端程序时经常碰到的几个问题进行分别介绍如何使用httpclient 来解决它们,为了让读者更快的熟悉这个项目我们最开始先给出一个简单的例子来读取一个网页的内容,然后循序渐进解决掉前进中的所形侍狻?/font> 1.读取网页(HTTP/HTTPS)内容 下面是我们给出的一个简单的例子用来访问某个页面

C 使用libcurl做HttpClient

C++使用libcurl做HttpClient 当使用C++做HTTP客户端时,目前通用的做法就是使用libcurl。其官方网站的地址是http://curl.haxx.se/,该网站主要提供了Curl和libcurl。Curl是命令行工具,用于完成FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及LDAP的命令的请求及接收回馈。libcurl提供给开发者,用于使用C++跨平台的开发各种网络协议的请求及响应。里面的文档非常齐全,不过都是英文的。 本文提供最简单的demo使用libcurl开发HttpClient。主要包括同步的HTTP GET、HTTP POST、HTTPS GET、HTTPS POST。 下载libcurl包,如果使用Linux平台,建议下载源文件编译;如果使用Windows平台,建议下载Win32 - MSVC,下载地址是:http://curl.haxx.se/download.html #ifndef __HTTP_CURL_H__ #define __HTTP_CURL_H__ #include class CHttpClient { public: CHttpClient(void); ~CHttpClient(void); public: /** * @brief HTTP POST请求* @param strUrl 输入参数,请求的Url地址,如:https://www.sodocs.net/doc/ad3003401.html, *

@param strPost 输入参数,使用如下格式 para1=val1?2=val2&… * @param strResponse 输出参数,返回的内容* @return 返回是否Post成功 */ int Post(const std::string & strUrl, const std::string & strPost, std::string & strResponse); /** * @brief HTTP GET请求* @param strUrl 输入参数,请求的Url地址,如:https://www.sodocs.net/doc/ad3003401.html, * @param strResponse 输出参数,返回的内容* @return 返回是否Post成功*/ int Get(const std::string & strUrl, std::string & strResponse); /** * @brief HTTPS POST请求,无证书版本* @param strUrl 输入参数,请求的Url地址,如:https://https://www.sodocs.net/doc/ad3003401.html, * @param strPost 输入参数,使用如下格式para1=val1?2=val2&… * @param strResponse 输出参数,返回的内容* @param pCaPath 输入参数,为CA证书的路径.如果输入为NULL,则不验证服务器端证书的有效性. * @return 返回是否Post成功*/ int Posts(const std::string & strUrl, const std::string & strPost, std::string & strResponse, const char * pCaPath = NULL); /** * @brief HTTPS GET请求,无证书版本* @param strUrl 输入参数,请求的Url地址,如:https://https://www.sodocs.net/doc/ad3003401.html, * @param strResponse 输出参数,返回的内容*

HttpClient教程

HttpClient 教程 前言 超文本传输协议(HTTP)也许是当今互联网上使用的最重要的协议了。Web服务,有网络功能的设备和网络计算的发展,都持续扩展了HTTP协议的角色,超越了用户使用的Web浏览器范畴,同时,也增加了需要HTTP协议支持的应用程序的数量。尽管https://www.sodocs.net/doc/ad3003401.html,包提供了基本通过HTTP访问资源的功能,但它没有提供全面的灵活性和其它很多应用程序需要的功能。HttpClient就是寻求弥补这项空白的组件,通过提供一个有效的,保持更新的,功能丰富的软件包来实现客户端最新的HTTP标准和建议。 为扩展而设计,同时为基本的HTTP协议提供强大的支持,HttpClient组件也许就是构建HTTP客户端应用程序,比如web浏览器,web服务端,利用或扩展HTTP协议进行分布式通信的系统的开发人员的关注点。 1. HttpClient的范围 ?基于HttpCore[https://www.sodocs.net/doc/ad3003401.html,/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) {

相关主题