一个android访问http资源的便捷工具类——HttpHelper

HttpHelper.java

package com.newcj.net;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.*;
import org.apache.http.util.ByteArrayBuffer;
 
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.util.Log;
 
/**
 * 帮助你访问 http 资源的工具类
 * 
 * @author <a href="mailto:newcj@qq.com">newcj</a>
 * @version 1.0 2010/5/9
 */
public final class HttpHelper {
    public final static String TAG = "HttpHelper";
 
    private final static String CONTENT_TYPE = "application/x-www-form-urlencoded";
    private final static String ACCEPT = "*/*";
    private final static String USER_AGENT = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5";
 
    /**
     * 1024 byte
     */
    private final static int BUFFER_LENGTH = 1024;
 
    private String referer;
    private Cookies cookies;
    private int timeout = 300000;
 
    public HttpHelper() {
        cookies = new Cookies();
    }
 
    /**
     * 获取超时时间,毫秒单位,默认为300000毫秒即5分钟
     * 
     * @return
     */
    public int getTimeout() {
        return timeout;
    }
 
    /**
     * 设置超时时间 ReadTimeOut 与 ConnectTimeout 均设置为该超时时间,毫秒单位
     * 
     * @param timeout
     */
    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }
 
    /**
     * 获取 Referer
     * 
     * @return
     */
    public String getReferer() {
        return referer;
    }
 
    /**
     * 设置 Referer
     * 
     * @return
     */
    public void setReferer(String referer) {
        this.referer = referer;
    }
 
    /**
     * 以GET方法新建一个线程获取网页,编码方式为 gb2312,超时或编码错误返回null
     * 
     * @param strUrl
     *            网页URL地址
     * @param handler
     *            用于向发起本次调用的线程发送结果信息
     * @param what
     *            handler中的what标记
     */
    public void getHtmlByThread(String strUrl, Handler handler, int what) {
        getHtmlByThread(strUrl, null, false, "gb2312", handler, what);
    }
 
    /**
     * 以GET方法新建一个线程获取网页,超时或编码错误返回null
     * 
     * @param strUrl
     *            网页URL地址
     * @param encoding
     *            编码方式
     * @param handler
     *            用于向发起本次调用的线程发送结果信息
     * @param what
     *            handler中的what标记
     */
    public void getHtmlByThread(String strUrl, String encoding,
            Handler handler, int what) {
        getHtmlByThread(strUrl, null, false, encoding, handler, what);
    }
 
    /**
     * 根据GET或POST方法新建一个线程获取网页,超时返回null
     * 
     * @param strUrl
     *            网页URL地址
     * @param strPost
     *            POST 的数据
     * @param isPost
     *            是否 POST,true 则为POST ,false 则为 GET
     * @param encoding
     *            编码方式
     * @param handler
     *            用于向发起本次调用的线程发送结果信息
     * @param what
     *            handler中的what标记
     */
    public void getHtmlByThread(String strUrl, String strPost, boolean isPost,
            String encoding, Handler handler, int what) {
        if (handler == null)
            throw new NullPointerException("handler is null.");
 
        Thread t = new Thread(new Runner(strUrl, strPost, isPost, encoding,
                handler, what, Runner.TYPE_HTML));
        t.setDaemon(true);
        t.start();
    }
 
    /**
     * 以GET方法获取网页,编码方式为 gb2312,超时或编码错误返回null
     * 
     * @param strUrl
     *            网页URL地址
     * @return 返回网页的字符串
     */
    public String getHtml(String strUrl) {
        return getHtml(strUrl, null, false, "gb2312");
    }
 
    /**
     * 以GET方法获取网页,超时或编码错误返回null
     * 
     * @param strUrl
     *            网页URL地址
     * @param encoding
     *            编码方式
     * @return 返回网页的字符串
     */
    public String getHtml(String strUrl, String encoding) {
        return getHtml(strUrl, null, false, encoding);
    }
 
    /**
     * 根据GET或POST方法获取网页,超时返回null
     * 
     * @param strUrl
     *            网页URL地址
     * @param strPost
     *            POST 的数据
     * @param isPost
     *            是否 POST,true 则为POST ,false 则为 GET
     * @param encoding
     *            编码方式
     * @return 返回网页的字符串
     */
    public String getHtml(String strUrl, String strPost, boolean isPost,
            String encoding) {
        String ret = null;
        try {
            byte[] data = getHtmlBytes(strUrl, strPost, isPost, encoding);
            if (data != null)
                ret = new String(data, encoding);
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
        }
        return ret;
    }
 
    /**
     * 根据GET或POST方法获取网络数据,超时返回null
     * 
     * @param strUrl
     *            网页URL地址
     * @param strPost
     *            POST 的数据
     * @param isPost
     *            是否POST,true则为POST,false则为 GET
     * @param encoding
     *            编码方式
     * @return 返回bytes
     */
    public byte[] getHtmlBytes(String strUrl, String strPost, boolean isPost,
            String encoding) {
        byte[] ret = null;
        HttpURLConnection httpCon = null;
        InputStream is = null;
        try {
            URL url = new URL(strUrl);
            httpCon = (HttpURLConnection) url.openConnection();
            httpCon.setReadTimeout(timeout);
            httpCon.setConnectTimeout(timeout);
            httpCon.setUseCaches(false);
            httpCon.setInstanceFollowRedirects(true);
            httpCon.setRequestProperty("Referer", referer);
            httpCon.setRequestProperty("Content-Type", CONTENT_TYPE);
            httpCon.setRequestProperty("Accept", ACCEPT);
            httpCon.setRequestProperty("User-Agent", USER_AGENT);
            httpCon.setRequestProperty("Cookie", cookies.toString());
 
            if (isPost) {
                httpCon.setDoOutput(true);
                httpCon.setRequestMethod("POST");
                httpCon.connect();
 
                OutputStream os = null;
                try {
                    os = httpCon.getOutputStream();
                    os.write(URLEncoder.encode(strPost, encoding).getBytes());
                    os.flush();
                } finally {
                    if (os != null)
                        os.close();
                }
            }
 
            // 获取数据
            is = httpCon.getInputStream();
            ByteArrayBuffer baBuffer = null;
            byte[] buffer = new byte[BUFFER_LENGTH];
            int rNum = 0;
            // 若读取的数据长度小于 BUFFER_LENGTH,说明读取的
            // 内容小于 BUFFER_LENGTH 已经一次性读取完毕
            // 这个时候并不用创建 ByteArrayBuffer
            //
            // 以上并不适用
            // if ((rNum = is.read(buffer)) < BUFFER_LENGTH) {
            // ret = buffer;
            // } else {
            baBuffer = new ByteArrayBuffer(BUFFER_LENGTH << 1);
            // baBuffer.append(buffer, 0, BUFFER_LENGTH);
            while ((rNum = is.read(buffer)) != -1) {
                baBuffer.append(buffer, 0, rNum);
            }
            ret = baBuffer.toByteArray();
            // }
 
        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.e(TAG, e.getMessage() + ":" + e.getCause());
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
 
                }
            }
            // 更新 Cookie
            if (httpCon != null) {
                cookies.putCookies(httpCon.getHeaderField("Set-Cookie"));
                // 更新 referer
                referer = strUrl;
                httpCon.disconnect();
            }
        }
        return ret;
    }
 
    /**
     * 新建一个线程获取一张网页图片
     * 
     * @param strUrl
     * @param handler
     *            用于向发起本次调用的线程发送结果信息
     * @param what
     *            handler中的what标记
     */
    public void getBitmapByThread(String strUrl, Handler handler, int what) {
        if (handler == null)
            throw new NullPointerException("handler is null.");
 
        Thread t = new Thread(new Runner(strUrl, null, false, null, handler,
                what, Runner.TYPE_IMG));
        t.setDaemon(true);
        t.start();
    }
 
    /**
     * 获取一张网页图片
     * 
     * @param strUrl
     *            网页图片的URL地址
     * @return
     */
    public Bitmap getBitmap(String strUrl) {
        byte[] data = getHtmlBytes(strUrl, null, false, null);
        return BitmapFactory.decodeByteArray(data, 0, data.length);
    }
 
    private class Runner implements Runnable {
        public final static int TYPE_HTML = 1;
        public final static int TYPE_IMG = 2;
 
        private String strUrl;
        private String strPost;
        private boolean isPost;
        private String encoding;
        private Handler handler;
        private int what;
        private int type;
 
        public Runner(String strUrl, String strPost, boolean isPost,
                String encoding, Handler handler, int what, int type) {
            this.strUrl = strUrl;
            this.strPost = strPost;
            this.isPost = isPost;
            this.encoding = encoding;
            this.handler = handler;
            this.what = what;
            this.type = type;
        }
 
        @Override
        public void run() {
            // TODO Auto-generated method stub
            Object obj = null;
            switch (type) {
            case TYPE_HTML:
                obj = getHtml(strUrl, strPost, isPost, encoding);
                break;
            case TYPE_IMG:
                obj = getBitmap(strUrl);
                break;
            }
            synchronized (handler) {
                handler.sendMessage(handler.obtainMessage(what, obj));
            }
        }
 
    }
}

Cookies.java

package com.newcj.net;
 
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
 
/**
 * 非同步保存Cookie的键值
 * 
 * @author SomeWind
 * 
 */
public class Cookies {
 
    private HashMap<String, String> hashMap;
 
    public Cookies() {
        hashMap = new HashMap<String, String>();
    }
 
    /**
     * 清除 Cookies 里面的所有 Cookie 记录
     */
    public void clear() {
        hashMap.clear();
    }
 
    /**
     * 根据 key 获取对应的 Cookie 值
     * 
     * @param key
     *            要获取的 Cookie 值的 key
     * @return 如果不存在 key 则返回 null
     */
    public String getCookie(String key) {
        return hashMap.get(key);
    }
 
    /**
     * 在 Cookies 里设置一个 Cookie
     * 
     * @param key
     *            要设置的 Cookie 的 key
     * @param value
     *            要设置的 Cookie 的 value
     */
    public void putCookie(String key, String value) {
        hashMap.put(key, value);
    }
 
    /**
     * 在 Cookies 里面设置传入的 cookies
     * 
     * @param cookies
     */
    public void putCookies(String cookies) {
        if (cookies == null)
            return;
 
        String[] strCookies = cookies.split(";");
        for (int i = 0; i < strCookies.length; i++) {
            for (int j = 0; j < strCookies[i].length(); j++) {
                if (strCookies[i].charAt(j) == '=') {
                    this.putCookie(
                            strCookies[i].substring(0, j),
                            strCookies[i].substring(j + 1,
                                    strCookies[i].length()));
                }
            }
        }
    }
 
    /**
     * 获取 Cookies 的字符串
     */
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        if (hashMap.isEmpty())
            return "";
 
        Set<Entry<String, String>> set = hashMap.entrySet();
        StringBuilder sb = new StringBuilder(set.size() * 50);
        for (Entry<String, String> entry : set) {
            sb.append(String.format("%s=%s;", entry.getKey(), entry.getValue()));
        }
        sb.delete(sb.length() - 1, sb.length());
        return sb.toString();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值