HttpClient初步使用方法

来源:互联网 发布:卖海关数据公司怎么样 编辑:程序博客网 时间:2024/06/10 21:54

             HttpClient简单使用

准备

         Apache官网下载 HttpClient , 下不了的点击这里,下载完后解压取lib文件夹中jar包导入到项目中, 还需要导入commons-logging-1.2.jar包

在进行本例之前需要了解三个类

         HttpClient  代表Http客户端 里面定义了很多http 请求执行行为

         HttpEntity  消息载体,发送或者接收消息的载体,可以通过客户端请求或者服务器响应获取实例

         HttpConnection  代表http连接

本次实例代码

[java] view plaincopyprint?
  1. public class HttpCLientDemo  
  2. {  
  3.   
  4.     // HttpClient 代表Http客户端   
  5.     // HttpEntity 消息载体,发送或者接收消息的载体,可以通过客户端请求或者服务器响应获取实例  
  6.     // HttpConnection 代表http连接  
  7.     /** 
  8.      * @param args 
  9.      */  
  10.     public static void main(String[] args)  
  11.     {  
  12.         // 创建默认的客户端实例  
  13.         HttpClient httpCLient = new DefaultHttpClient();  
  14.           
  15.         // 创建get请求实例  
  16.         HttpGet httpget = new HttpGet("http://www.baidu.com");  
  17.           
  18.         System.out.println("executing request "+httpget.getURI());  
  19.           
  20.         try  
  21.         {  
  22.               
  23.             // 客户端执行get请求 返回响应实体  
  24.             HttpResponse response = httpCLient.execute(httpget);  
  25.               
  26.             // 服务器响应状态行  
  27.             System.out.println(response.getStatusLine());  
  28.               
  29.             Header[] heads = response.getAllHeaders();  
  30.             // 打印所有响应头  
  31.             for(Header h:heads){  
  32.                 System.out.println(h.getName()+":"+h.getValue());  
  33.             }  
  34.               
  35.             // 获取响应消息实体  
  36.             HttpEntity entity = response.getEntity();  
  37.               
  38.             System.out.println("------------------------------------");  
  39.               
  40.               
  41.               
  42.             if(entity != null){  
  43.                                   
  44.                 //响应内容  
  45.                 System.out.println(EntityUtils.toString(entity));  
  46.                   
  47.                 System.out.println("----------------------------------------");  
  48.                 // 响应内容长度  
  49.                 System.out.println("响应内容长度:"+entity.getContentLength());  
  50.             }  
  51.               
  52.         } catch (ClientProtocolException e){  
  53.             e.printStackTrace();  
  54.         } catch (IOException e){  
  55.             e.printStackTrace();  
  56.         }finally{  
  57.             httpCLient.getConnectionManager().shutdown();  
  58.         }  
  59.     }  
  60.   
  61. }  

本次运行结果


总结一下

      使用之前导入相应的jar包,然后开始编码,先创建一个客户端,根据需求可以配置,接着实例一个请求(get post put。。。),

      然后用客户端对某一个服务器执行请求操作,可以得到一个http响应,

      这里响应 结构如下 消息状态行,消息头,消息实体

       Response  =   Status-Line                     *(( general-header                      | response-header                      | entity-header ) CRLF)                     CRLF                     [ message-body ]


结构中的数据我已在本例运行结果中显示出来,请见上图,可以看出本例:

对应结构

消息状态行:

               HTTP/1.1 200 OK

消息响应头:

Date:Tue, 08 Jan 2013 07:18:42 GMT
Server:BWS/1.0
Content-Length:9785
Content-Type:text/html;charset=gbk
Cache-Control:private
Expires:Tue, 08 Jan 2013 07:18:42 GMT
Set-Cookie:H_PS_PSSID=1757; path=/; domain=.baidu.com
Set-Cookie:BAIDUID=22B4BB1F8F8E808DB50B6513DBBCF6DF:FG=1; expires=Tue, 08-Jan-43 07:18:42 GMT; path=/; domain=.baidu.com
P3P:CP=" OTI DSP COR IVA OUR IND COM "
Connection:Keep-Alive

  消息实体:百度网页源码我就不写了


本次对HttpClient的简单使用到此为止

-----------------------------------------------------------

简介

     最近在做一些开放接口应用的时候发现原有的一些应用大量使用了HttpComponent里面的功能。从HttpComponent本身的介绍来说,它是一个实现Http协议很多操作功能的组件,在一些爬虫和网络应用开发中都得到大量的应用。因为牵涉到的开放服务接口使用的是http rest服务,感觉httpcomponent很适合其中的场景。这里结合项目中使用的一些场景来对其中的功能做一个简单的总结。

HttpClient基本操作

     在使用httpclient之前我们需要首先下载httpclient的jar包,里面就包含了httpclient.jar, httpcore.jar等几个文件。我们先看一个简单的示例:

Java代码  收藏代码
  1. import java.io.BufferedReader;  
  2. import java.io.IOException;  
  3. import java.io.InputStreamReader;  
  4.   
  5. import org.apache.http.HttpResponse;  
  6. import org.apache.http.client.ClientProtocolException;  
  7. import org.apache.http.client.HttpClient;  
  8. import org.apache.http.client.methods.HttpGet;  
  9. import org.apache.http.impl.client.DefaultHttpClient;  
  10.   
  11.   
  12. public class HTTPGetSample {  
  13.     public static void main(String[] args) throws ClientProtocolException, IOException {  
  14.         String url = "http://www.google.com.hk/search?q=httpClient";  
  15.           
  16.         HttpClient client = new DefaultHttpClient();  
  17.         HttpGet request = new HttpGet(url);  
  18.           
  19.         HttpResponse response = client.execute(request);  
  20.         System.out.println("Response Code: " +  
  21.         response.getStatusLine().getStatusCode());  
  22.           
  23.         BufferedReader rd = new BufferedReader(  
  24.             new InputStreamReader(response.getEntity().getContent()));  
  25.         String line = "";  
  26.         while((line = rd.readLine()) != null) {  
  27.         System.out.println(line);  
  28.         }  
  29.     }  
  30. }  

     在这个示例里我们尝试用httpclient发送一个http get请求。请求的地址是对应到一个google search的url.仔细看上面的代码,其实还是很简单,首先创建一个HttpClient的对象,然后针对我们的http get操作创建一个HttpGet对象,并将请求url作为参数传给该对象。具体执行get操作的步骤是通过httpclient.execute()方法。这个方法里将HttpGet对象作为参数传入。返回一个HttpResponse的结果。

    我们通过读取HttpResponse的结果就可以得到请求返回的详细信息。这个过程和我们通过浏览器浏览某个网页的效果相同。程序执行的部分结果如下:

Java代码  收藏代码
  1. Response Code: 200  
  2. <!doctype html><html itemscope="itemscope" itemtype="http://schema.org/WebPage"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">...  

    由于篇幅限制,省略了部分结果。

    从前面示例里我们可以看到通过HttpClient发送Http请求的基本套路:

1. 创建HttpClient对象。

2. 构造Http 请求对象。

3. 执行HttpClient对象的execute方法,将Http请求对象作为该方法的参数。

4. 读取execute方法返回的HttpResponse结果并解析。

    ok,既然整体过程是这样的话,我们后续使用post, put, delete等操作的过程也就大同小异了。在详细讨论这些方法使用之前我们先简单的讨论一下http协议里的这几种方法。

Http协议常用方法

     关于http协议的介绍网上材料很多。总的来说,http协议规范了通信双方交互的方式,基本上它是采用一种请求-应答的方式。客户端发送请求给服务器端,然后服务器端发送响应回来。我们常用的几种http操作的方法可以分为可修改的和不可修改的。怎么理解这个可修改和不可修改的意思呢?

    在http协议里,我们有的请求方法只是获取服务器端资源的信息,默认的假定是不修改服务器端的状态,这种方法称为不可修改的方法。比如说HttpGet, HttpHead, HttpOptions,HttpTrace。所以说这种请求方法是可以重复执行并返回相同结果的。我们对同一个资源执行若干次get操作,每次得到的结果都相同。而对于可修改的请求来说,主要有HttpPut, HttpPost, HttpDelete等。他们在规范里分别对应着对资源的update, create和delete等操作。所以在一些web应用里,我们提交表单的时候选择的是http post操作。

     除了http协议里规定的这么几种方法,它本身还支持交互的内容,比如通过请求头中间设定"accept", "Content-Type"等信息,指定我们交互的内容格式。他们可以是静态文件类型的,比如说txt, .gif,.jpg等,也可以是一些其他文本如json, xml。在一些rest web服务里面,我们指定的支持json或者xml格式的数据交换就可以通过这里来定义。

     我们刚看到了通过设定请求头来指定通信的交互内容格式,那么是否也可以指定请求体呢?在这里是有可能的,只是针对不同的请求方法。比如说对HttpGet之类的方法,他们本身只是获取服务器的内容不需要向服务器提交额外的信息,所以对于这一类的请求方法来说带个请求体意义并不大。而对于那些要提交大量内容给服务器的请求如上传文件或者提交表单信息的httpput, httppost请求,他们就有必要设置一个请求体。

    有了前面的这些铺垫,我们后面可以更加深入的分析一下httpclient中间几种方法的结构和用法。

 Http操作方法结构

    HttpClient相关的uml结构图如下:

 

    我们关注的各种http方法都被定义成一个个独立的类,他们都继承自HttpRequestBase。其中比较特殊一点的是HttpPut, HttpPost,他们继承自HttpEntityEnclosingRequestBase。为什么这两个类要稍微特殊一点呢?这就是我们前面提到的他们要设置请求体,在HttpEntityEnclosingRequestBase里有HttpEntity的成员变量,他们作为这两个方法特定的特性定义在这里:

Java代码  收藏代码
  1. private HttpEntity entity;  
  2.   
  3. public HttpEntity getEntity() {  
  4.     return this.entity;  
  5. }  
  6.   
  7. public void setEntity(final HttpEntity entity) {  
  8.     this.entity = entity;  
  9. }  

     HttpEntity是一个接口,根据具体传入的参数类型我们可以选择StringEntity, InputStreamEntity等。由此,对于这两种有差别的请求方法来说,他们只是需要多增加一个setEntity的方法。

    另外对于通用的设置请求头部分,前面的示例代码里我们是使用了一种硬编码的方式。我们也可以采用request.addHeader(Header)的方法。在HttpClient里,Header是一个接口,我们可以创建两种实现该接口的对象来作为参数传给addHeader方法。分别是BasicHeader, BufferedHeader。

 

总结

     HttpClient通常用来作为一个模拟http请求的工具。我们最常见的get, put, post, delete等方法在其中都通过具体定义的类来实现。当我们要发送某个具体的请求是,只需要创建对应请求的对象并设定请求头或者请求体,执行HttpClient的execute方法就可以得到执行结果了。返回的HttpResponse消息体结果具体内容是一个InputStream,我们可以根据需要来读取内容。返回的消息头则是显示http操作方法的执行结果,我们可以根据消息头来判断请求执行是否正确,结果是否执行完毕以及如果出错了错误的缘由可能是什么等信息。关于HttpClient的更多实现和应用后面会进一步学习研究。

参考材料

HttpComponent website




在我们对http的资源进行请求的时候,我们可以通过get和post 这个2种方式

      用get获取信息,所需要提交的内容是体现在url中的,通常的形式是以:http://www.xxxxx.com?id=xxxxx&pass=xxxxxx  “?”前面是的网址,”?”后面的是提交的内容

 例如:我们在百度中 打入nba,则请求的url 就为:http://www.baidu.com/s?wd=nba&rsv_bp=0&rsv_spt=3&rsv_sug3=3&rsv_sug=0&rsv_sug4=157&rsv_sug1=1&inputT=940 ,它所提交的内容在url中时可见的。而用post方式提交呢,它提交的内容我们是不可见的。如果我们要写一个自动post 表单数据的程序,那我们就得先知道发送这个post请求需要那些数据选项。

例如 :http://www.sxgjj.gov.cn/querygjj.aspx 是一个查询的页面,我们通过浏览器的开发者工具(按F12)来查看该页面html


可以看到这里提交表单的方式是用post

现在我们通过浏览器输入查询的身份证号码和姓名,提交之后,我们就可以在开发者工具里查看psot 表单的数据内容了!



从上图可以得出我们需要提交的post 内容有 _viewstate,_eventvalidation,tbx_pername,tbx_pidcard,tbx_bankAccout,btn_Querry这几项内容

   知道了这些,我们就可以通过程序来自动完成post请求了

   我是通过httpclient这个组件来完成的,HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,网上有很多关于它的介绍,有兴趣的可以自己去了解。以下就是实现的代码(记得把httpclient的lib文件里的jar文件导入到你的工程项目中区)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
importjava.io.*;
importjava.sql.*;
importjava.io.PrintStream;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.List;
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.entity.InputStreamEntity;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.message.BasicNameValuePair;
importorg.apache.http.util.EntityUtils;
importorg.apache.http.*;
 
publicclasshttpclient {
 
publicstaticvoidpost_comment(String pdcode,String psname,String id,HttpClient httpclient)throwsException{
 
                try{
                    //构造一个post对象
                 HttpPost httpPost =newHttpPost("http://www.sxgjj.gov.cn/querygjj.aspx");
                 //添加所需要的post内容
                 List<NameValuePair> nvps =newArrayList<NameValuePair>();
                 nvps.add(newBasicNameValuePair("__VIEWSTATE","/wEPDwUKMTI3ODgyMTE1M2RkYvz2pJOChArFWd3j+6npOZr96OI="));
                 nvps.add(newBasicNameValuePair("__EVENTVALIDATION","/wEWBQLzxcLpBgL3n9/ACwLuubGjBgKs9/TJDwLvjry/BYt++cnimkGWb2qATgw5QzGksEj8"));
                 nvps.add(newBasicNameValuePair("tbx_pername", psname));
                 nvps.add(newBasicNameValuePair("tbx_PidCard", pdcode));
                 nvps.add(newBasicNameValuePair("tbx_bankAccount",""));
                 nvps.add(newBasicNameValuePair("btnQuery","查询"));
                  
 
                 httpPost.setEntity(newUrlEncodedFormEntity(nvps, Consts.UTF_8));
 
                 HttpResponse response = httpclient.execute(httpPost);
 
                 HttpEntity entity = response.getEntity();
                // EntityUtils.consume(entity);
                String Filename ="e:\\gjj\\"+ id+".txt";
                 
                createNewFile(Filename,EntityUtils.toString(entity))
 
                }       
                finally{
                    System.out.println("ok!");
                }    
         
         }
    
  publicstaticvoidmain(String[] args) throwsException {
 
HttpClient httpclient =newDefaultHttpClient();
post_comment(“330621xxxxxxxxxxxx”,"张三","test",httpclient);
httpclient.getConnectionManager().shutdown();
 
}
}


0 0
原创粉丝点击