zoukankan      html  css  js  c++  java
  • HttpClient发送get/post请求

    参考博客:https://www.cnblogs.com/LuckyBao/p/6096145.html

    1.需要的maven依赖:

    <!--httpClient需要的依赖-->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.2</version>
            </dependency>
            <!--//httpclient缓存-->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient-cache</artifactId>
                <version>4.5</version>
            </dependency>
            <!--//http的mime类型都在这里面-->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpmime</artifactId>
                <version>4.3.2</version>
            </dependency>

    2.发送get请求

    //使用httpClient发送get请求
        public void sentGetMethod(){
            //1.先创建httpClient对象,使用默认的方式即可
            CloseableHttpClient httpClient= HttpClients.createDefault();
    
            //2.设置url并且创建某种请求方式实例
            //比如:(在百度上搜索helloworld出现的路径)url:https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0
            // &rsv_idx=1&tn=baidu&wd=helloworld&rsv_pq=c6735cf70000fe15
            // &rsv_t=7e25dm7uzHpmOwrFNF33FXbom45Px0Bs0F8PP3Bcm8RMOysmKlfA%2FuqKoU4&rqlang=cn
            // &rsv_enter=1&rsv_sug3=9&rsv_sug1=5&rsv_sug7=101
            //url的构建也可以使用字符串拼接的方式
            try {
                URI url=new URIBuilder()
                        .setScheme("https")//设置协议
                        .setHost("www.baidu.com")
                        .setPath("/s")
                        .setParameter("ie","utf-8")
                        .setParameter("rsv_idx","1")
                        .setParameter("tn","baidu")
                        .setParameter("wd","helloworld")
                        .setParameter("rsv_pq","c6735cf70000fe15")
                        .setParameter("rsv_t","7e25dm7uzHpmOwrFNF33FXbom45Px0Bs0F8PP3Bcm8RMOysmKlfA%2FuqKoU4")
                        .setParameter("rqlang","cn")
                        .setParameter("rsv_enter","1")
                        .setParameter("rsv_sug3","9")
                        .setParameter("rsv_sug1","5")
                        .setParameter("rsv_sug7","101")
                        .build();
                System.out.println(url);
                HttpGet httpGet=new HttpGet(url);
                InputStream inputStream=null;
                CloseableHttpResponse httpResponse=null;
                try {
                    //3.执行httpClient
                    httpResponse=httpClient.execute(httpGet);
                    //可以输出请求的结果
                    System.out.println(httpResponse.getStatusLine().getStatusCode());
                    //4.获取相应的结果
                    //4.1使用EntityUtils.toString()方式  --不推荐
                    //2种方式只能2选一存在,会互相冲突
                    HttpEntity entity=httpResponse.getEntity();  //获取响应的实体
    //                if (entity!=null){
    //                    System.out.println(EntityUtils.toString(entity,"utf-8"));
    //                }else {
    //                    //如果entity为空,那么直接消化掉即可
    //                    EntityUtils.consume(entity);
    //                }
                    System.out.println("------------------------我是美丽的分割线--------------------");
                    //4.2使用InputStream方式   --推建
                    inputStream=entity.getContent();
                    //转换成字符流
                    BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
                    String line="";
                    while ((line=bufferedReader.readLine())!=null){
                        System.out.println(line);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    //关闭InputStream和response
                    if (inputStream!=null){
                        try {
                            inputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (httpResponse!=null){
                        try {
                            httpResponse.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        ;
                    }
                }
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
    
        }

     3.httpClient发送post请求(携带json数据)

    //发送post请求 携带json数据的
        public void sendPostMethod(String url){
            //1.创建httpClient
            CloseableHttpClient httpClient=HttpClients.createDefault();
            //2.创建post请求方式实例
            HttpPost httpPost=new HttpPost(url);
    
            //2.1设置请求头 发送的是json数据格式
            httpPost.setHeader("Content-type", "application/json;charset=utf-8");
            httpPost.setHeader("Connection", "Close");
    
            //3.设置参数---设置消息实体 也就是携带的数据
            /*
            * 比如传递:
            * {
                    "username": "aries",
                    "password": "666666"
                }
             */
            String jsonStr=" {"username":"aries","password":"666666"}";
            StringEntity entity = new StringEntity(jsonStr.toString(), Charset.forName("UTF-8"));
            entity.setContentEncoding("UTF-8");  //设置编码格式
            // 发送Json格式的数据请求
            entity.setContentType("application/json");
            //把请求消息实体塞进去
            httpPost.setEntity(entity);
    
            //4.执行http的post请求
            CloseableHttpResponse httpResponse=null;
            InputStream inputStream=null;
            try {
                 httpResponse=httpClient.execute(httpPost);
                 //5.对返回的数据进行处理
                //5.1判断是否成功
                System.out.println(httpResponse.getStatusLine().getStatusCode());
    
                //5.2对数据进行处理
                HttpEntity httpEntity=httpResponse.getEntity();
                inputStream=httpEntity.getContent(); //获取content实体内容
                //封装成字符流来输出
                BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
                String line="";
                while ((line=bufferedReader.readLine())!=null){
                    System.out.println(line);
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                //6.关闭inputStream和httpResponse
                if (inputStream!=null){
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (httpResponse!=null){
                    try {
                        httpResponse.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

     4.httpClient发送post请求/携带x-www-form-urlencoded数据格式

    //发送post请求 携带非json数据
        public  void sendPostMethod1(String url) throws Exception {
            // 1、创建一个httpClient客户端对象
            CloseableHttpClient httpClient=HttpClients.createDefault();
            // 2、创建一个HttpPost请求
            HttpPost httpPost = new HttpPost(url);
            //设置请求头
            httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); //设置传输的数据格式
    
            //携带普通的参数params的方式
            List<NameValuePair> params=new ArrayList<>();
            params.add(new BasicNameValuePair("username", "kylin"));
            params.add(new BasicNameValuePair("password", "123456"));
    
            String str=EntityUtils.toString(new UrlEncodedFormEntity(params,Consts.UTF_8));
            //这里就是:username=kylin&password=123456
            System.out.println(str);
    
            //放参数进post请求里面  从名字可以知道 这个类是专门处理x-www-form-urlencoded 添加参数的
            httpPost.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));
    
            // 7、执行post请求操作,并拿到结果
            CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
    
            // 获取结果实体
            HttpEntity entity = httpResponse.getEntity();
            if (entity != null) {
                //进行输出操作 这里就简单的使用EntityUtils工具类的toString()方法
                System.out.println(EntityUtils.toString(entity,"UTF-8"));
            }
            else EntityUtils.consume(entity);
            //最后释放资源之类的
        }

    总结:

      1.创建httpClient对象创建默认的对象就够使用了

      2.创建某种请求方法的实例

        例如有:get方式---- HttpGet
            post方式-----HttpPost
            put方式------HttpPut
            delete方式 ------HttpDelete
      3.如果有参数的话就设置参数  

        get请求:
          方式1:使用URI类的方法来创建
          方式2:直接使用字符串拼接那种

        post请求:

          使用setEntity()方式来携带不同的数据类型(需要设置)
      4.发送请求
        执行httpClient.execute() --返回CloseableHttpResponse对象
      5.获取请求的结果
        获取HttpEntity的实体之后,对http文档的查看
          方式一:EntityUtils.toString(entity,"utf-8") 不推荐
          方式二:使用InputStream类
      6.关闭连接释放资源
        先关闭inputStream
        再关闭response

  • 相关阅读:
    HSF的原理分析
    python--cryptography加密
    PyQt5--QTDesigner--UI资源
    PyQt5--QTDesigner--UI样式表
    python--struct
    python--ffmpy3与ffmpeg
    python--you-get:视频下载
    python--base64--简单的加密和解密
    python--StringIO-在内存中读写str
    电脑技巧
  • 原文地址:https://www.cnblogs.com/shan-kylin/p/9453514.html
Copyright © 2011-2022 走看看