首页 > Web开发 > 详细

HttpClient

时间:2019-11-07 02:26:07      阅读:93      评论:0      收藏:0      [点我收藏+]

本文参考https://www.cnblogs.com/shirandedan/p/8423521.html  ,另外参考的其他的不记得了,如果冒犯请联系我删除。

HttpClient 是Apache 下的项目,可以用来提供高效的支持 HTTP 协议的客户端编程工具包。如果只是需要向Web站点的某个简单页面提交请求并获取服务器响应,HttpURLConnection完全可以胜任。但在绝大部分情况下,Web站点的网页可能没这么简单,这些页面并不是通过一个简单的URL就可访问的,可能需要用户登录而且具有相应的权限才可访问该页面。在这种情况下,就需要涉及Session、Cookie的处理了,如果打算使用HttpURLConnection来处理这些细节,当然也是可能实现的,只是处理起来难度就大了。

  为了更好地处理向Web站点请求,包括处理Session、Cookie等细节问题,Apache开源组织提供了一个HttpClient项目,看它的名称就知道,它是一个简单的HTTP客户端(并不是浏览器),可以用于发送HTTP请求,接收HTTP响应。但不会缓存服务器的响应,不能执行HTML页面中嵌入的Javascript代码;也不会对页面内容进行任何解析、处理。

  简单来说,HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP连接。

HttpClient的使用

使用HttpClient发送请求、接收响应,只要如下几步。

  1.创建HttpClient对象(HttpClients.createDefault())。

  2.如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

  3.如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HttpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

  4.调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。

  5.调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

HttpClient的get请求

/**
 * @(#)httpclientGet.java, 2019/11/6.
 * <p/>
 * Copyright 2019 Netease, Inc. All rights reserved.
 * NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.lhh.controller;

/**
 * @author 吕厚厚(wb.lvhouhou @ mesg.corp.netease.com)
 */



import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
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.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

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


/**
 * HttpClient 的Get请求   无参和有参两种
 */

/**
 * maven依赖:
 *      <dependency>
 *       <groupId>org.apache.httpcomponents</groupId>
 *       <artifactId>httpclient</artifactId>
 *       <version>4.5.2</version>
 *      </dependency>
 *
 *       <dependency>
 *       <groupId>com.alibaba</groupId>
 *       <artifactId>fastjson</artifactId>
 *       <version>1.2.58</version>
 *     </dependency>
 *
 *
 */
public class HttpclientGet1 {

    public static void main(String[] args) {

        /**
         * 1.无参的httpClient的Get请求
         */
        //①利用HttpClients创建HttpClient(CloseableHttpClient)对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        String url1 = "http://www.baidu.com";

        //②构建HttpGet
        HttpGet httpGet = new HttpGet(url1);

        //设置了请求header 的参数,如果不需要,可以省略
        HashMap<String, String> headers;
        headers = new HashMap<String, String>();
        headers.put("Accept", "*/*");
        headers.put("Accept-Encoding", "gzip, deflate, sdch");
        headers.put("Accept-Language", "zh-CN,zh;q=0.8");

        for (Map.Entry m : headers.entrySet()) {
            System.out.println(m.getKey() + "\t" + m.getValue());
            httpGet.setHeader(m.getKey().toString(), m.getValue().toString());
        }
        //配置请求超时设置
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(5000) //设置连接超时时间
                .setConnectionRequestTimeout(5000) //  设置连接请求超时时间
                .setSocketTimeout(5000)
                .setRedirectsEnabled(true) //设置自动允许重定向
                .build();
        httpGet.setConfig(requestConfig);

        //③httpClient.execute()执行并获取 response内容
        try {
            CloseableHttpResponse closeableHttpResponse = httpClient.execute(httpGet);
            //获取响应状态码——.getStatusLine().getStatusCode()
            int statusCode = closeableHttpResponse.getStatusLine().getStatusCode();
            System.out.println(statusCode);
            //HttpStatus.SC_OK是状态码200
            if (closeableHttpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                HttpEntity httpEntity = closeableHttpResponse.getEntity();
                //可以在转为字符串的时候指定编码集
                String strResult = EntityUtils.toString(httpEntity,"UTF-8");
                System.out.println("strResult:"+strResult);
                // 把字符串转换为json对象,JSONObject是一个Map的结构(或者称为对象),
                // 当返回的实体类不具有Map的结构时,解析成JSONObject就会出错,如百度首页的返回
                //JSONObject jsonObject = JSONObject.parseObject(strResult);

                //System.out.println(jsonObject);
            } else {
                String strResult = "Error Response: " + closeableHttpResponse.getStatusLine().toString();
                System.out.println(strResult);
            }

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //关闭连接
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

 

/**
 * @(#)HttpClientGet2.java, 2019/11/6.
 * <p/>
 * Copyright 2019 Netease, Inc. All rights reserved.
 * NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.lhh.controller;

/**
 * @author 吕厚厚(wb.lvhouhou @ mesg.corp.netease.com)
 */

import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 2.带参的httpClient的Get请求
 */
public class HttpClientGet2 {

    public static void main(String[] args) {

        //①利用HttpClients创建HttpClient(CloseableHttpClient)对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        String url2 = "http://www.sina.com";

        //②封装参数,get方法传递参数
        List<NameValuePair> param = new ArrayList<NameValuePair>();

        param.add(new BasicNameValuePair("username", "jiangcui"));
        param.add(new BasicNameValuePair("password", "pdmi1234"));
        CloseableHttpResponse response =null;
        try {
            //③设置编码方式
            UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(param, "utf-8");
            //String str = EntityUtils.toString(urlEncodedFormEntity);
            //System.out.println(str);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try{
            //④创建httpGet请求
            HttpGet httpGet2 = new HttpGet(url2);

            //⑤执行httpGet请求
             response = httpClient.execute(httpGet2);
            //获取响应状态码——HttpStatus.SC_OK是状态码200
            int statusCode = response.getStatusLine().getStatusCode();
            //System.out.println(statusCode);

            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                //获得响应的实体类(该对象包装了服务器的响应内容,可通过该对象获取服务器的响应内容。)
                HttpEntity httpEntity1 = response.getEntity();
                //可以在转为字符串的时候指定编码集
                String strResult = EntityUtils.toString(httpEntity1,"UTF-8");
                System.out.println("result:"+strResult);
                // 把字符串转换为json对象,JSONObject是一个Map的结构(或者称为对象),
                // 当返回的实体类不具有Map的结构时,解析成JSONObject就会出错,如百度首页的返回
                //JSONObject jsonObject = JSONObject.parseObject(strResult1);

                //获取json串中的数据
                //String str = jsonObject.get("name").toString;
                //将json对象转化为字符串
                //String jsonToString = jsonObject.toString();
            } else {
                String strResult = "Error Response: " + response.getStatusLine().toString();
                System.out.println(strResult);
            }
        }catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

HttpClient的POST请求

 

 

比较 GET 与 POST

下面的表格比较了两种 HTTP 方法:GET 和 POST。

 GETPOST
后退按钮/刷新 无害 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
书签 可收藏为书签 不可收藏为书签
缓存 能被缓存 不能缓存
编码类型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
历史 参数保留在浏览器历史中。 参数不会保存在浏览器历史中。
对数据长度的限制 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 无限制。
对数据类型的限制 只允许 ASCII 字符。 没有限制。也允许二进制数据。
安全性 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET ! POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
可见性 数据在 URL 中对所有人都是可见的。 数据不会显示在 URL 中。

HttpClient

原文:https://www.cnblogs.com/lvhouhou/p/11809528.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!