HttpClient简单使用1

使用HttpClient发送请求、接收响应

1.一般需要如下几步:
(1) 创建HttpClient对象。
(2)创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
(3) 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
(4) 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
(5) 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
(6) 释放连接。无论执行方法是否成功,都必须释放连接。

protected static Logger logger = Logger.getLogger(HttpTest.class);
    //请求超时时间,这个时间定义了socket读数据的超时时间,也就是连接到服务器之后到从服务器获取响应数据需要等待的时间,发生超时,会抛出SocketTimeoutException异常。
    private static final int SOCKET_TIME_OUT = 60000;
    //连接超时时间,这个时间定义了通过网络与服务器建立连接的超时时间,也就是取得了连接池中的某个连接之后到接通目标url的连接等待时间。发生超时,会抛出ConnectionTimeoutException异常
    private static final int CONNECT_TIME_OUT = 60000;

    private static List createParam(Map param) {
        //建立一个NameValuePair数组,用于存储欲传送的参数
        List nvps = new ArrayList ();
        if(param != null) {
            for(String k : param.keySet()) {
                nvps.add(new BasicNameValuePair(k, param.get(k).toString()));
            }
        }
        return nvps;
    }

    /**
     * 发送  post 请求
     * @param url 请求地址,如 http://www.baidu.com
     * @param param相关参数, 模拟form 提交
     * @return
     * @throws Exception 
     */
    public static String postForAPP(String url, String sMethod, Map param, Map headers) throws Exception {
        //目前HttpClient最新版的实现类为CloseableHttpClient
        CloseableHttpClient client = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        HttpEntity entity=null;
        try {
            if(param != null) {
                //建立Request的对象,一般用目标url来构造,Request一般配置addHeader、setEntity、setConfig
                HttpPost req = new HttpPost(url);
                entity=new UrlEncodedFormEntity(createParam(param), Consts.UTF_8);
                //setHeader,添加头文件
                Set keys = headers.keySet();
                for (String key : keys) {
                    req.setHeader(key, headers.get(key).toString());
                }
                //setConfig,添加配置,如设置请求超时时间,连接超时时间
                RequestConfig reqConfig = RequestConfig.custom().setSocketTimeout(SOCKET_TIME_OUT).setConnectTimeout(CONNECT_TIME_OUT).build();
                req.setConfig(reqConfig);
                //setEntity,添加内容
                req.setEntity(entity);
                //执行Request请求,CloseableHttpClient的execute方法返回的response都是CloseableHttpResponse类型
                //其常用方法有getFirstHeader(String)、getLastHeader(String)、headerIterator(String)取得某个Header name对应的迭代器、getAllHeaders()、getEntity、getStatus等
                response = client.execute(req);
                entity =  response.getEntity();
                //用EntityUtils.toString()这个静态方法将HttpEntity转换成字符串,防止服务器返回的数据带有中文,所以在转换的时候将字符集指定成utf-8就可以了
                String result= EntityUtils.toString(entity, "UTF-8");
                logger.error("-------------------------"+result+"-------------");
                if(response.getStatusLine().getStatusCode()==200){
                    logger.error(result+"-----------success------------------");
                    return result;
                }else{
                    logger.error(response.getStatusLine().getStatusCode()+"------------------fail-----------");
                    return null;
                }
            }
            return null;
        } catch(Exception e) {
            logger.error("--------------------------post error: ", e);
            throw new Exception();
        }finally{
            //一定要记得把entity fully consume掉,否则连接池中的connection就会一直处于占用状态
            EntityUtils.consume(entity);
            logger.error("---------------------------finally-------------");
            System.out.println("---------------------------------------------------");
        }
    }


    public static void main(String[] args) throws Exception {
        Map param=new HashMap();
        param.put("pdata", "mm");
        Map headers=new HashMap();
        headers.put("appid", "mm");
        postForAPP("http://localhost:8080/SpringMVC-httpclient/greeting", "aa", param, headers);
    }

httpClient通过代理(Http Proxy)进行请求 

在浏览一些网站的时候由于各种原因,无法进行访问, 这时我们需要通过IE,FireFox进行Http的代理设置。
当然httpClient也为我们提供这样的设置 ,使用匿名代理 。

HttpClient httpClient = new HttpClient();  
//设置代理服务器的ip地址和端口  
httpClient.getHostConfiguration().setProxy("192.168.101.1", 5608);  
//使用抢先认证  
httpClient.getParams().setAuthenticationPreemptive(true); 






HttpClient httpClient = new HttpClient();  
httpClient.getHostConfiguration().setProxy("192.168.101.1", 5608);  
httpClient.getParams().setAuthenticationPreemptive(true);  
//如果代理需要密码验证,这里设置用户名密码  
httpClient.getState().setProxyCredentials(AuthScope.ANY, new UsernamePasswordCredentials("llying.iteye.com","llying"));  

 

你可能感兴趣的:(微信后台)