当前位置: 首页 > Java > 正文

Java HttpClient实例

关键字:
1 星2 星3 星4 星5 星 (1 次投票, 评分: 5.00, 总分: 5)
Loading ... Loading ...
baidu_share
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
 
 
package com.dheaven.mip.item;  
 
import java.io.IOException;  
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;  
import org.apache.commons.httpclient.Header;  
import org.apache.commons.httpclient.HttpClient;  
import org.apache.commons.httpclient.HttpException;  
import org.apache.commons.httpclient.HttpMethod;  
import org.apache.commons.httpclient.HttpStatus;  
import org.apache.commons.httpclient.NameValuePair;  
import org.apache.commons.httpclient.methods.GetMethod;  
import org.apache.commons.httpclient.methods.PostMethod;  
import org.apache.commons.httpclient.params.HttpMethodParams;  
 
 
public class MyHttpClient {  
 
    /**  
     *  Description: HttpClient GET方法 
     *  1. 创建 HttpClient 的实例 
        2. 创建某种连接方法的实例,在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址 
        3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例 
        4. 读 response 
        5. 释放连接。无论执行方法是否成功,都必须释放连接 
        6. 对得到后的内容进行处理 
     *  
     */  
    public void getClientMethod(){  
        HttpClient client = new HttpClient();  
        // 设置代理服务器地址和端口(第一个参数是代理服务器地址,第二个参数是端口号。)        
        // client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);  
 
        //创建GET方法的实例,在GET方法的构造函数中传入待连接的地址即可。  
        //用GetMethod将会自动处理转发过程,如果想要把自动处理转发过程去掉的话,可以调用方法setFollowRedirects(false)。  
        // 使用 GET 方法 ,如果服务器需要通过 HTTPS 连接,那只需要将下面 URL 中的 http 换成 https   
        HttpMethod getMethod = new GetMethod("http://www.ibm.com/");  
 
        //调用实例httpClient的executeMethod方法来执行getMethod。  
        //设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略  
        getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());   
        //执行getMethod  
        int statusCode;  
        try {  
            statusCode = client.executeMethod(getMethod);  
            if (statusCode != HttpStatus.SC_OK) {  
                  System.err.println("Method failed: " + getMethod.getStatusLine());  
            }  
            /** 
             * 在返回的状态码正确后,即可取得内容。取得目标地址的内容有三种方法: 
             * 第一种,getResponseBody,该方法返回的是目标的二进制的byte流; 
             * 第二种,getResponseBodyAsString,这个方法返回的是String类型,值得注意的是该方法返回的String的编码是根据系统默认的编码方式,所以返回的String值可能编码类型有误,在本文的"字符编码"部分中将对此做详细介绍; 
             * 第三种,getResponseBodyAsStream,这个方法对于目标地址中有大量数据需要传输是最佳的。在这里我们使用了最简单的getResponseBody方法。 
             */  
            //读取内容   
            byte[] responseBody = getMethod.getResponseBody();  
            //处理内容  
            System.out.println(new String(responseBody));  
        } catch (HttpException e) {  
            System.out.println("Please check your provided http address!");  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
           //释放连接  
           getMethod.releaseConnection();  
        }  
 
    }  
 
    /** 
     * Description:  HttpClient POST方法 
     * HttpClient中的PostMethod与GetMethod类似,除了设置PostMethod的实例与GetMethod有些不同之外,剩下的步骤都差不多 
     *  
     */  
    public void postClientMethod(){  
        HttpClient client=new HttpClient();  
        /* 
         * 在创建了PostMethod的实例之后,需要给method实例填充表单的值 
         * 在BBS的登录表单中需要有两个域,第一个是用户名(域名叫id),第二个是密码(域名叫passwd)。 
         * 表单中的域用类NameValuePair来表示,该类的构造函数第一个参数是域名,第二参数是该域的值; 
         * 将表单所有的值设置到PostMethod中用方法setRequestBody。另外由于BBS登录成功后会转向另外一个页面,但是HttpClient对于要求接受后继服务的请求, 
         * 比如POST和PUT,不支持自动转发,因此需要自己对页面转向做处理。 
         */  
         String url = "http://www.ibm.com/";  
         PostMethod postMethod = new PostMethod(url);  
         // 填入各个表单域的值  
         NameValuePair[] data = { new NameValuePair("id", "youUserName"),  
         new NameValuePair("passwd", "yourPwd") };  
         // 将表单的值放入postMethod中  
         postMethod.setRequestBody(data);  
         // 执行postMethod  
         int statusCode;  
        try {  
            statusCode = client.executeMethod(postMethod);  
             // HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发  
             // 301或者302  
             if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {  
                 // 从头中取出转向的地址  
                 Header locationHeader = postMethod.getResponseHeader("location");  
                 String location = null;  
                 if (locationHeader != null) {  
                  location = locationHeader.getValue();  
                  System.out.println("The page was redirected to:" + location);  
                 } else {  
                  System.err.println("Location field value is null.");  
                 }  
                 return;  
             }  
        } catch (HttpException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }finally {  
               //释放连接  
            postMethod.releaseConnection();  
        }  
    }  
 
 
    /* 
     * 自动转向 
        根据RFC2616中对自动转向的定义, 
        主要有两种:301和302。301表示永久的移走(Moved Permanently),当返回的是301,则表示请求的资源已经被移到一个固定的新地方,任何向该地址发起请求都会被转到新的地址上。 
       302表示暂时的转向,比如在服务器端的servlet程序调用了sendRedirect方法,则在客户端就会得到一个302的代码,这时服务器返回的头信息中location的值就是sendRedirect转向的目标地址。 
       HttpClient支持自动转向处理,但是象POST和PUT方式这种要求接受后继服务的请求方式,暂时不支持自动转向,因此如果碰到POST方式提交后返回的是301或者302的话需要自己处理。 
        就像刚才在POSTMethod中举的例子:如果想进入登录BBS后的页面,必须重新发起登录的请求,请求的地址可以在头字段location中得到。 
        不过需要注意的是,有时候location返回的可能是相对路径,因此需要对location返回的值做一些处理才可以发起向新地址的请求。 
        另外除了在头中包含的信息可能使页面发生重定向外,在页面中也有可能会发生页面的重定向。引起页面自动转发的标签是:<meta http-equiv="refresh" content="5; url=http://www.ibm.com/us">。 
        如果你想在程序中也处理这种情况的话得自己分析页面来实现转向。需要注意的是,在上面那个标签中url的值也可以是一个相对地址,如果是这样的话,需要对它做一些处理后才可以转发。 
     */  
}

本文固定链接: http://www.chepoo.com/java-httpclient-demo.html | IT技术精华网

Java HttpClient实例:等您坐沙发呢!

发表评论