zoukankan      html  css  js  c++  java
  • HttpClient介绍和简单使用流程

    HttpClient

    SpringCloud中服务和服务之间的调用全部是使用HttpClient,还有前面使用SolrJ中就封装了HttpClient,在调用SolrTemplate的saveBean方法时就调用HttpClient技术。

    当前大部分项目暴漏出来的接口是Http请求,数据格式是JSON格式,但在一些老项目使用的仍然是webService。

    HttpClient 提供的主要的功能

    (1)实现了所有 HTTP 的方法(GET,POST,PUT,DELETE 等)

    (2)支持自动转向

    (3)支持 HTTPS 协议

    (4)支持代理服务器等

    1、关于Http的请求类型(常见)

    get、put、post、delete含义与区别

    1、GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作,结果都是一样的。

    2、与GET不同的是,PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。

    3、POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。

    4、DELETE请求顾名思义,就是用来删除某一个资源的,该请求就像数据库的delete操作。

    就像前面所讲的一样,既然PUT和POST操作都是向服务器端发送数据的,那么两者有什么区别呢。。。POST主要作用在一个集合资源之上的(url),而PUT主要作用在一个具体资源之上的(url/xxx),通俗一下讲就是,如URL可以在客户端确定,那么可使用PUT,否则用POST。

    数据请求格式

    综上所述,我们可理解为以下:

    1、POST    /url      创建  
    2、DELETE /url/xxx 删除  
    3、PUT     /url/xxx 更新
    4、GET     /url/xxx 查看

    2、HttpClient的请求类型

    实现了所有的Http请求类型,相应的类为

    HttpGet、HttpPost、HttpDelete、HttpPut

    3、Http的使用流程

    3.1 创建sms的war子模块

    3.2 导入坐标

    <dependencies>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.3</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.28</version>
            </dependency>
        </dependencies>

    3.3 测试demo,原生HttpClient使用

    3.3.1 新建HttpClientGetTest.java测试类,测试get请求

    public static void main(String[] args) throws IOException {
            //1.打开浏览器
            CloseableHttpClient httpClient = HttpClients.createDefault();
            //2.声明get请求
            HttpGet httpGet = new HttpGet("http://www.baidu.com/s?wd=java");
            //3.发送请求
            CloseableHttpResponse response = httpClient.execute(httpGet);
            //4.判断状态码
            if(response.getStatusLine().getStatusCode()==200){
                HttpEntity entity = response.getEntity();
               //使用工具类EntityUtils,从响应中取出实体表示的内容并转换成字符串
                String string = EntityUtils.toString(entity, "utf-8");
                System.out.println(string);
            }
            //5.关闭资源
            response.close();
            httpClient.close();
        }

    3.3.2 新建HttpClientPostTest.java测试类,测试post请求

    public static void main(String[] args) throws IOException {
            //1.打开浏览器
            CloseableHttpClient httpClient = HttpClients.createDefault();
            //2.声明get请求
            HttpPost httpPost = new HttpPost("https://www.oschina.net/");
            //3.开源中国为了安全,防止恶意攻击,在post请求中都限制了浏览器才能访问
            httpPost.addHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36");
            //4.判断状态码
            List<NameValuePair> parameters = new ArrayList<NameValuePair>(0);
            parameters.add(new BasicNameValuePair("scope", "project"));
            parameters.add(new BasicNameValuePair("q", "java"));
    
            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters,"UTF-8");
    
            httpPost.setEntity(formEntity);
    
            //5.发送请求
            CloseableHttpResponse response = httpClient.execute(httpPost);
    
            if(response.getStatusLine().getStatusCode()==200){
                HttpEntity entity = response.getEntity();
                String string = EntityUtils.toString(entity, "utf-8");
                System.out.println(string);
            }
            //6.关闭资源
            response.close();
            httpClient.close();
        }

    3.3.3 测试获取运营商品牌数据代码实现

    自定义工具类HttpClientUtil如果能直接访问,简单的访问实现。

    //设置请求地址
    HttpClientUtil util=new HttpClientUtil("http://localhost:9101/brand/findAll.do");
    //设置请求方式
    util.get();
    //获取返回内容
    String content=util.getContent();
    //打印结果
    System.out.println("content");

    使用HttpClientUtil实现先登录在访问页面

    要点:务必保证登录和查询请求是连续的请求。借助的自定义工具类HttpClientUtil

    public class HttpClientTest {
        public static void main(String[] args) {
            //设置用户名和密码
            Map<String, String> map = new HashMap<String,String>();
            map.put("username", "admin");
            map.put("password", "123456");
    
            //需要先通过springSecurity认证
            String s1 = HttpClientUtil.doPost("http://localhost:9101/login", map);
    
            Map<String, String> brand = new HashMap<String,String>();
            brand.put("name", "123456");
            brand.put("firstChar", "T");
    
            String jsonMap = JSON.toJSONString(brand);
            System.out.println(jsonMap);
            String s2 = HttpClientUtil.doPostJson("http://localhost:9101/brand/add.do", jsonMap);
    
            //String s2 = HttpClientUtil.doGet("http://localhost:9101/brand/findAll.do");
            System.out.println(s2);
        }
    }

    自定义工具类源码HttpClientUtil。注意导入的依赖

    import java.io.IOException;
    import java.security.GeneralSecurityException;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import java.text.ParseException;
    import java.util.HashMap;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Map;
    
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLException;
    import javax.net.ssl.SSLSession;
    import javax.net.ssl.SSLSocket;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
    
    import org.apache.http.Consts;
    import org.apache.http.HttpEntity;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.methods.HttpPut;
    import org.apache.http.client.methods.HttpUriRequest;
    import org.apache.http.client.protocol.HttpClientContext;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    import org.apache.http.conn.ssl.SSLContextBuilder;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.conn.ssl.TrustStrategy;
    import org.apache.http.conn.ssl.X509HostnameVerifier;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    
    /**
     * http请求客户端
     * 
     * @author Administrator
     * 
     */
    public class HttpClientUtil {
    
        public  static HttpClientContext context = null;
    
        static {
            System.out.println("====================begin");
            context = HttpClientContext.create();
        }
    
        private String url;
        private Map<String, String> param;
        private int statusCode;
        private String content;
        private String xmlParam;
        private boolean isHttps;
    
        public boolean isHttps() {
            return isHttps;
        }
    
        public void setHttps(boolean isHttps) {
            this.isHttps = isHttps;
        }
    
        public String getXmlParam() {
            return xmlParam;
        }
    
        public void setXmlParam(String xmlParam) {
            this.xmlParam = xmlParam;
        }
    
        public HttpClientUtil(String url, Map<String, String> param) {
            this.url = url;
            this.param = param;
        }
    
        public HttpClientUtil(String url) {
            this.url = url;
        }
    
        public void setParameter(Map<String, String> map) {
            param = map;
        }
    
        public void addParameter(String key, String value) {
            if (param == null)
                param = new HashMap<String, String>();
            param.put(key, value);
        }
    
        public void post() throws ClientProtocolException, IOException {
            HttpPost http = new HttpPost(url);
            setEntity(http);
            execute(http);
        }
    
        public void put() throws ClientProtocolException, IOException {
            HttpPut http = new HttpPut(url);
            setEntity(http);
            execute(http);
        }
    
        public void get() throws ClientProtocolException, IOException {
            if (param != null) {
                StringBuilder url = new StringBuilder(this.url);
                boolean isFirst = true;
                for (String key : param.keySet()) {
                    if (isFirst)
                        url.append("?");
                    else
                        url.append("&");
                    url.append(key).append("=").append(param.get(key));
                }
                this.url = url.toString();
            }
            HttpGet http = new HttpGet(url);
            execute(http);
        }
    
        /**
         * set http post,put param
         */
        private void setEntity(HttpEntityEnclosingRequestBase http) {
            if (param != null) {
                List<NameValuePair> nvps = new LinkedList<NameValuePair>();
                for (String key : param.keySet())
                    nvps.add(new BasicNameValuePair(key, param.get(key))); // 参数
                http.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); // 设置参数
            }
            if (xmlParam != null) {
                http.setEntity(new StringEntity(xmlParam, Consts.UTF_8));
            }
        }
    
        private void execute(HttpUriRequest http) throws ClientProtocolException,
                IOException {
            CloseableHttpClient httpClient = null;
            try {
                if (isHttps) {
                    SSLContext sslContext = new SSLContextBuilder()
                            .loadTrustMaterial(null, new TrustStrategy() {
                                // 信任所有
                                public boolean isTrusted(X509Certificate[] chain,
                                        String authType)
                                        throws CertificateException {
                                    return true;
                                }
                            }).build();
                    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                            sslContext);
                    httpClient = HttpClients.custom().setSSLSocketFactory(sslsf)
                            .build();
                } else {
                    httpClient = HttpClients.createDefault();
                }
                CloseableHttpResponse response = httpClient.execute(http,context);
                try {
                    if (response != null) {
                        if (response.getStatusLine() != null)
                            statusCode = response.getStatusLine().getStatusCode();
                        HttpEntity entity = response.getEntity();
                        // 响应内容
                        content = EntityUtils.toString(entity, Consts.UTF_8);
                    }
                } finally {
                    response.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                httpClient.close();
            }
        }
    
        public int getStatusCode() {
            return statusCode;
        }
    
        public String getContent() throws ParseException, IOException {
            return content;
        }
    }
  • 相关阅读:
    VirtualXposed查看手机端网页及调试
    vue小toast插件报错runtine-only
    vuex的一个坑
    安卓4.4.4以下手机的兼容性问题
    WebForm(一)——IIS服务器、开发方式和简单基础
    winform窗体(六)——DataGridView控件及通过此控件中实现增删改查
    winform窗体(五)——布局方式
    winform(四)——简单计算器制作
    winform(三)——更换主窗体例子
    winform窗体(二)——控件
  • 原文地址:https://www.cnblogs.com/kitor/p/11235762.html
Copyright © 2011-2022 走看看