HttpClient4.3 使用经验(一) 简单使用

package com.wp.nevel.base.utils;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;
import org.junit.Test;

import com.wp.nevel.base.exception.ParserException;
import com.wp.nevel.base.service.impl.LogServiceHelp;

public class HttpClientUtils  {

    public static  Logger logger = Logger.getLogger( LogServiceHelp.class);
    
    private static HttpClient httpclient;

    static {
        httpclient = HttpClients.createDefault();
    }
    
    @Test
    public void test(){
        String url="http://www.shuchongw.com/files/article/html/23/23114/index.html";
        doGetHtmlContent2byte(url);
    }    
    
    
    /**
     * 根据简单url获取网页数据,转换成byte [] 存储
     * */
    public static byte[] doGetHtmlContent2byte(String url) {
        CloseableHttpResponse response = null;
        byte[] resultByte = {};
        try {
            HttpGet get = new HttpGet(url);
            System.out.println(url);
            RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000).setConnectTimeout(30000).build();
            get.setConfig(requestConfig);
            try {
                response = (CloseableHttpResponse) HttpClientUtils.httpclient.execute(get);
            } catch (UnknownHostException e) {
                e.printStackTrace();    
                logger.info("链接主网失败");
            }
            int statusCode = response.getStatusLine().getStatusCode();
            System.out.println(statusCode);
            if (statusCode == 200) {
                HttpEntity entity = response.getEntity();
                resultByte = EntityUtils.toByteArray(entity);
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (SocketException e) {
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        } finally {
            try {
                if(response!=null){
                    response.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultByte;
    }
    
    /**
     * 根据复杂url获取网页数据,转换成byte [] 存储
     * @throws ParserException 
     * @throws IOException 
     * @throws UnknownHostException 
     * @throws ClientProtocolException 
     * @throws SocketException 
     * */
    public static byte [] doGetHtmlByParams2Byte(Map<String, String> params, String paramsEncoding, String url)  {
        if (params != null) {
            List<NameValuePair> formparams = new ArrayList<NameValuePair>();
            for (Entry<String, String> entry : params.entrySet()) {
                formparams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
            }
            if (!formparams.isEmpty()) {
                String paramsStr = URLEncodedUtils.format(formparams, paramsEncoding!=null?paramsEncoding:"utf-8");
                url = url + "?" + paramsStr;
            }
        }
        return doGetHtmlContent2byte(url);
    }
    
    /**
     * 根据复杂url获取网页数据,转换成String 存储
     * @throws ParserException 
     * @throws IOException 
     * @throws UnknownHostException 
     * @throws ClientProtocolException 
     * @throws SocketException 
     * */
    public static String doGetHtmlByParams2Text(Map<String, String> params, String paramsEncoding, String url,String htmlEncoding) throws  ClientProtocolException, UnknownHostException, SocketException{
        try {
            return getHtmlContentByText(doGetHtmlByParams2Byte(params,paramsEncoding,url),htmlEncoding!=null?htmlEncoding:"utf-8");
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }
    
    /**
     * 根据简单url获取网页数据,转换成String 存储
     * @throws ParserException 
     * @throws IOException 
     * @throws UnknownHostException 
     * @throws ClientProtocolException 
     * @throws SocketException 
     * */
    public static String doGetHtmlContentToString(String url, String encoding){
        try {
            return getHtmlContentByText(doGetHtmlContent2byte(url),encoding);
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }
    /**
     * 根据简单url获取网页图片数据, 保存路径[saveImagePath]
     * @throws ParserException 
     * @throws IOException 
     * @throws UnknownHostException 
     * @throws ClientProtocolException 
     * @throws SocketException 
     * */
    public static  void getHtml2Image(String url,String saveImagPath){
        try {
            downloadData(doGetHtmlContent2byte(url),saveImagPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static  String getHtmlContentByText(byte [] htmlBytes, String encoding){
        try {
            return new String (htmlBytes,encoding!=null?encoding:"utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return  "";
        }
    }
    
    
    /**
     * 执行下载io
     * 
     * @param byte [] data 网页字节流,filename 存储地址和文件名 return
     * */
    public static void downloadData(byte[] data, String filename) {
        try {
            DataOutputStream writer = new DataOutputStream(
                    new FileOutputStream(new File(filename)));
            BufferedOutputStream out = new BufferedOutputStream(writer);
            out.write(data);
            out.flush();
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static String readFile(String filename) throws IOException{
        String xmlContent =null;
        File file = new File(filename);
        BufferedReader reader =null;
        try {
            if(!file.exists()){
                 new RuntimeException("文件不存在");
                 return xmlContent;
            }
            StringBuilder buider = new StringBuilder();
            String readata ="";
            reader = new BufferedReader(new FileReader(file));
            while(true){
                readata = reader.readLine();
                if(readata==null){
                    break;
                }
                buider.append(readata).append("\n");
            }
            xmlContent=buider.toString();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally{
            if(reader!=null)
                reader.close();
        }
        return xmlContent;
    }
    
    public static byte []  doGetByteByHttpclient2Url(HttpContext httpContext,CloseableHttpClient client,String url){
        byte [] resultBytes = null;
        try {
            HttpGet get = new HttpGet(url);
            CloseableHttpResponse response =client.execute(get, httpContext);
            int status = response.getStatusLine().getStatusCode();
            System.out.println("链接状态="+status);
            if(status!=200)
                return resultBytes;
            HttpEntity entity = response.getEntity();
            resultBytes = EntityUtils.toByteArray(entity);
        } catch (ClientProtocolException e) {
            throw new RuntimeException("失败连接地址"+url, e);
        } catch (IOException e) {
            throw new RuntimeException("失败连接地址"+url, e);
        }
        if(resultBytes==null){
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return resultBytes;
    }
    
}

 

posted @ 2015-11-20 13:53  匹夫鹏  阅读(423)  评论(0编辑  收藏  举报