无线&移动互联网技术研发

换位思考·····
posts - 19, comments - 53, trackbacks - 0, articles - 283
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Apache Common HttpClient的使用

Posted on 2009-12-14 22:38 Gavin.lee 阅读(5742) 评论(0)  编辑  收藏 所属分类: java SE & EE

HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient,更多使用 HttpClient 的应用可以参见http://wiki.apache.org/jakarta-httpclient/HttpClientPowered。HttpClient 项目非常活跃,使用的人还是非常多的。

使用HttpClient用到的jar包:commons-codec.jar,commons-httpclient-3.0.jar

package com.yixun.wap;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.URI;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
import org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory;

/**
 * HttpClient 使用
 * 1.GET/POST(HEAD,PUT)
 * 2.Proxy
 * 3.Https
 * 4.Cookie
 * 5.字符编码
 * 6.支持自动转向
 * 
@author Administrator
 *
 
*/

public class HttpClientCenter {

    
static HttpClient httpClient = null;
    
//构造HttpClient的实例
    private static HttpClientCenter instance;
    
private HttpClientCenter() {
        httpClient 
= new HttpClient();
    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
    
public static HttpClientCenter getInstance() {
        
if(instance == null{
            
return new HttpClientCenter();
        }

        
return instance;
    }

    
    
//Https
    
    
/**
     * 设置代理
     * 代理服务器是位于客户端和Web服务器之间一个中间服务器。我们通过使用浏览器中配置的相应代理,
     * 将请求发送到代理服务器,代理服务器代理我们客户端去请求Web服务器,将请求到的响应资源再次
     * 响应我们客户端,同时缓存到代理服务器上,以备下次客户端请求代理服务器的时候,直接从代理服
     * 务器上取得要请求的资源,而无需再次请求网站的Web服务器,提高了响应速度。
     
*/

    
    
/**
     * GET请求
     * 使用 HttpClient 需要以下 6 个步骤:
     *    1. 创建 HttpClient 的实例
     *    2. 创建某种连接方法的实例,在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址
     *    3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例
     *    4. 读 response
     *    5. 释放连接。无论执行方法是否成功,都必须释放连接
     *    6. 对得到后的内容进行处理
     * 
@param url
     
*/

    
public void getMethod(String url) {
        GetMethod getMethod 
= null;
        
try {
            URI uri 
= new URI(url, true);
            getMethod 
= new GetMethod(url);// 创建GET方法的实例,可同时对请求的头,等等,做相应的设置
            /** 设置代理*/
            HostConfiguration hostConfiguration 
= new HostConfiguration();
            hostConfiguration.setHost(uri);
            hostConfiguration.setProxy(
"127.0.0.1"8080);// 配置代理IP和端口
            httpClient.setHostConfiguration(hostConfiguration);
            
            
// 使用系统提供的默认的恢复策略
            getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,    new DefaultHttpMethodRetryHandler());
            
            HttpConnectionManagerParams managerParams 
= httpClient.getHttpConnectionManager().getParams();
            managerParams.setConnectionTimeout(
30000);     // 设置连接超时时间(单位毫秒) 
            managerParams.setSoTimeout(120000);        //设置读数据超时时间(单位毫秒) 
            int statusCode = httpClient.executeMethod(getMethod);// 执行getMethod,返回响应码
            if (statusCode != HttpStatus.SC_OK) {
                System.err.println(
"Method failed: " + getMethod.getStatusLine());    //Method failed: HTTP/1.1 200 OK
            }

            String charSet 
= getMethod.getResponseCharSet();    //响应的字符编码
            byte[] responseBody = getMethod.getResponseBody();    // 读取内容
            
            System.out.println(
"responseCode:\r\n" + statusCode);
            System.out.println(
"charSet:\r\n" + charSet);
            System.out.println(
"response:\r\n" + new String(responseBody, charSet));
            
            Header headers[] 
= getMethod.getResponseHeaders();
            
for(int i = 0; i < headers.length; i ++{
                System.out.println(headers[i]);
            }

            
/*Date: Mon, 21 Dec 2009 16:34:06 GMT
            Content-Type: text/vnd.wap.wml; charset=utf-8
            Transfer-Encoding: chunked
            Connection: keep-alive
            Server: Resin/3.1.0
            Cache-Control: no-cache
            Expires: Thu, 01 Dec 1994 16:00:00 GMT
            Set-Cookie: JSESSIONID=abc8cwOo6fWhcf2uQfYws; path=/
            P3P: policyref="
http://www.500wan.com/w3c/P3P.xml" CP="NOI ADM DEV PSAi COM NAV OUR OTR STP IND DEM"
             
*/

            
        }
 catch (HttpException e) {
            e.printStackTrace();
// 发生致命的异常,可能是协议不对或者返回的内容有问题
        }
 catch (IOException e) {
            e.printStackTrace();
// 发生网络异常
        }
 finally {
            getMethod.releaseConnection();
// 释放连接
        }

    }


    
public void postMethod(String url, Map<Object, Object> datas) {
        PostMethod postMethod 
= new PostMethod(url);
        
/** 设置代理---同上GET方法*/
        
int params = datas.size();
        NameValuePair[] data 
= new NameValuePair[params];
        
int i = 0;
        
for (Object obj : datas.keySet()) {
            data[i
++= new NameValuePair((String)obj, (String)datas.get(obj));
        }

//        NameValuePair[] data = {new NameValuePair("id", "youUserName"), new NameValuePair("passwd", "yourPwd") };//填入各个表单域的值
//        postMethod.setRequestEntity(new StringRequestEntity("createRequestXML()", "text/xml", "GBK"));  可使用XML格式传输post参数
        postMethod.setRequestBody(data);//将表单的值放入postMethod中
        try {
            HttpConnectionManagerParams managerParams 
= httpClient.getHttpConnectionManager().getParams();
            managerParams.setConnectionTimeout(
30000);     // 设置连接超时时间(单位毫秒)
            managerParams.setSoTimeout(120000);    // 设置读数据超时时间(单位毫秒)
            int statusCode = httpClient.executeMethod(postMethod);// 执行postMethod
            
//HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发
            if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {//301或者302
                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 (IOException e) {
            e.printStackTrace();
        }

    }

    
    
public void cookieSet() {
        httpClient.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
// RFC_2109是支持较普遍的一个,还有其他cookie协议
        HttpState initialState = new HttpState();
        Cookie cookie 
= new Cookie();
        cookie.setDomain(
"www.balblabla.com");
        cookie.setPath(
"/");
        cookie.setName(
"多情环");
        cookie.setValue(
"多情即无情");
        initialState.addCookie(cookie);
        httpClient.setState(initialState);
    }

    
    
public void cookieGet() {
        Cookie[] cookies 
= httpClient.getState().getCookies();   
        System.out.println(
"Present cookies: ");   
        
for (int i = 0; i < cookies.length; i++{
            System.out.println(
" - " + cookies[i].toExternalForm());   
            System.out.println(
" - domain=" + cookies[i].getDomain());   
            System.out.println(
" - path=" + cookies[i].getPath());   
        }
 
    }

    
    
public static void main(String args[]) {
        HttpClientCenter hcc 
= HttpClientCenter.getInstance();
        String url 
= "http://www.500wan.com/";
        url 
= "http://wap.500wan.com";
//        hcc.getMethod(url);
        Map<Object, Object> datas = new HashMap<Object, Object>();
        datas.put(
"id""1001");
        datas.put(
"pass""123456");
        hcc.postMethod(url, datas);
    }

}


只有注册用户登录后才能发表评论。


网站导航: