zoukankan      html  css  js  c++  java
  • 7.17Java之HttpClient类发送application/xwwwformurlencoded类型的请求

    7.17Java之HttpClient类发送application/x-www-form-urlencoded类型的请求

    application/x-www-form-urlencoded

    首先了解这个类型的传参方式: 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。

    <from>标签中有一个属性为action,该属性定义了:当提交表单时向何处发送表单数据。

    这里一定要搞清楚x-www-form-urlencoded的传参方式和该方式下的POST请求和GET请求的区别:

    这种post格式跟get的区别在于,get把转换、拼接完的字符串用‘?’直接与表单的action连接作为URL使用,所以请求体里没有数据;而post把转换、拼接后的字符串放在了请求体里,不会在浏览器的地址栏显示

    测试接口

    首先拿到接口以后分析接口地址和请求方式:

    可以看到请求方式是POST请求方式:

    分析请求头类型:

    可以看到是以表单的默认形式进行的提交

    查看表单格式:

    这里可以看到该接口是将参数拼成了字符串然后append到url后面在请求引用然后通过该引用调用的第三方接口。

    具体的调用接口实现

    //分析接口需要用到的属性
    /*
    1、Url
    2、Cookie
    3、Params
    */
    //定义接口地址
       private static final String Url = "";
       //捕获到本次登录的Cookie值
       private static final String Cookie = "";
       //定义参数格式
       private static final String Params = "platform=shopee&platform_accountid=12034&startTime=2021-07-16&endTime=2021-07-17&orderid=";

    具体方法实现:

    //由上面分析了该接口的传参形式,所以我们需要构造好一个POST请求体里面传参数
    //构造Cookie存储
           //创建Cookie存储
           CookieStore cookieStore = new BasicCookieStore();
           //设置Cookie值
           BasicClientCookie cookie = new BasicClientCookie("Cookie", Cookie);
           //设置域
           cookie.setDomain("");
           //设置路径
           cookie.setPath("/");
           //将设置好的Cookie放入接口引用中
           cookieStore.addCookie(cookie);
           //使用HttpClient创建登录客户端
           CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
           //创建响应模型,通过请求对象获取响应对象--->发送登录请求
           CloseableHttpResponse response = null;

    创建请求体:(由于是直接把POST请求体的内容转换拼接,所以无需构造对象参数容器)--->上一篇内容是通过构造参数对象容器将容器内容放入Body中进行的传参

    /*创建请求实体*/
           try{
               //创建登录方式引用
               HttpPost httpPost = new HttpPost(url);
               //设置请求配置
               RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(3000).setConnectionRequestTimeout(3000).setSocketTimeout(3000).build();
               //设置POST请求配置
               httpPost.setConfig(requestConfig);
               //添加请求头
               httpPost.addHeader("Content-Type", "x-www-form-urlencoded; charset=utf-8");
               //设置接收形式
               httpPost.setHeader("Accept", "application/json");
               System.out.println(httpPost);
               //创建登录实体
               httpPost.setEntity(new StringEntity(params, Charset.forName("UTF-8")));

               System.out.println(httpPost);
               //判断请求实体情况
               if (httpPost == null){
                   System.out.println("请求实体为空!");
                   return;
              }else {
                   response = httpClient.execute(httpPost);
              }
          }catch (Exception e){
               System.out.println(e.getMessage());
               e.printStackTrace();
          }

    创建响应对象实体:

    /*创建响应实体*/
           try {
               //从响应模型中获得响应实体
               HttpEntity responseEntity = response.getEntity();
               //打印响应状态
               System.out.println("响应状态为:" + responseEntity.getContentType());
               if (responseEntity!=null){
                   System.out.println("响应内容长度为:" + responseEntity.getContentLength());
                   System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
              }
          }catch (Exception e){
               System.out.println(e.getMessage());
               e.printStackTrace();
          }finally {
               //关闭资源
               try {
                   //判断客户端实体
                   if (httpClient != null) {
                       httpClient.close();
                  }
                   //判断响应实体
                   if (response != null) {
                       response.close();
                  }
              }catch (Exception e){
                   System.out.println(e.getMessage());
                   e.printStackTrace();
              }
          }
      }

     

    It's a lonely road!!!
  • 相关阅读:
    linux如何查看端口或服务被占用情况
    linux网络查看及配置相关命令
    linux查看程序运行相关命令
    shell脚本编写一个用真实用户去访问的vsftpd服务器
    shell脚本监控CPU和内存利用率
    小白的个人技能树(基于自动化软件测试开发实习和软件开发实习)
    MySQL 8.0.12 基于Windows 安装教程(超级详细)
    C语言 0x7fffffff是多少(也就是INT_MAX,首位是 0,其余都是1,f代表1111)
    数通知识点
    数据结构之算法基础
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15042522.html
Copyright © 2011-2022 走看看