HttpPost 携带参数的请求方式

2023-05-16

一、HTTP请求

Http的几种请求方式对应程序包中的HttpGet, HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, and HttpOptions,这些类均实现了HttpUriRequest接口,所以可以作为execute的执行参数使用。

根据HTTP的请格式,我们可以知道有两种方式可以为request提供参数。

第一种方式:request-line

第二种方式:request-body

因为工作中使用HttpPost请求用到了这两种请求方式,所以下面就只列出HttpPost的请求,其他请求方式的等下次用到在补上。

二、HttpPost

1、request-line方式

  URI uri = null;
        List<NameValuePair> qparams = new ArrayList<NameValuePair>();
        qparams.add(new BasicNameValuePair("region", String.valueOf(departmentId)));//需要对应传参的name和value
        qparams.add(new BasicNameValuePair("platNum", carNum));//需要对应传参的name和value
        try {
            uri = URIUtils.createURI("http", "192.168.1.xx:23002", -1, "/zyc/get/latestdd",
                    URLEncodedUtils.format(qparams, "UTF-8"), null);
            HttpPost httpPost = new HttpPost(uri);
            System.out.println(httpPost.getURI());
        } catch (URISyntaxException e) {
            e.printStackTrace();
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

打印结果如下:  http://192.168.1.75:23002/zyc/get/latest?region=320211&platNum

2、request-body

 PageHelper pageHelper =new PageHelper(pageIndex,pageSize,null);
 ObjectMapper MAPPER = new ObjectMapper();
 stringPage = MAPPER.writeValueAsString(pageHelper);//对象转String
 List<NameValuePair> list = new LinkedList<>();
        list.add( new BasicNameValuePair("pageHelper",stringPage ));//pageHelper放在body中传过去
  HttpPost httpPost = new HttpPost(uri);
  // 使用URL实体转换工具
 UrlEncodedFormEntity entityParam = new UrlEncodedFormEntity(list, "UTF-8");         //使用 UrlEncodedFormEntity 来设置 body,消息体内容
            httpPost.setEntity(entityParam);

3、HttpPost两种方式结合在一起请求

    /**
     * 发送 post请求
     */
    public String postParams(PageHelper pageHelper, Long region, String platNum) {
        // 获取连接客户端工具
        CloseableHttpClient httpClient = HttpClients.createDefault();
        String entityStr = null;
        CloseableHttpResponse response = null;
        ObjectMapper MAPPER = new ObjectMapper();
        try {
            String stringPage = MAPPER.writeValueAsString(pageHelper);
            List<NameValuePair> qparams = new ArrayList<NameValuePair>();
            qparams.add(new BasicNameValuePair("region", String.valueOf(region)));
            qparams.add(new BasicNameValuePair("platNum", platNum));
            URI uri = null;
            try {
                uri = URIUtils.createURI("http", "192.168.X.X:23002", -1, "/zyc/get/latestdd",
                        URLEncodedUtils.format(qparams, "UTF-8"), null);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
            HttpPost httpPost = new HttpPost(uri);
            System.out.println(httpPost.getURI());     
            // 创建请求参数HttpUriRequest
            List<NameValuePair> list = new LinkedList<>();
            list.add( new BasicNameValuePair("pageHelper",stringPage ));//放在body中
             /*JSONObject postData = new JSONObject();
            postData.put("pageHelper", stringPage);
            httpPost.setEntity(new StringEntity(postData.toString(), HTTP.UTF_8));*/
            // 使用URL实体转换工具
            UrlEncodedFormEntity entityParam = new UrlEncodedFormEntity(list, "UTF-8");// UrlEncodedFormEntity  request-body
            httpPost.setEntity(entityParam);
            System.out.println("executing request " + httpPost.getURI());
            // 浏览器表示
            httpPost.addHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)");
            // 传输的类型
            httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
            // 执行请求
            response = httpClient.execute(httpPost);
            // 获得响应的实体对象
            HttpEntity entity = response.getEntity();
            // 使用Apache提供的工具类进行转换成字符串
            entityStr = EntityUtils.toString(entity, "UTF-8");
        } catch (ClientProtocolException e) {
            System.err.println("Http协议出现问题");
            e.printStackTrace();
        } catch (ParseException e) {
            System.err.println("解析错误");
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("IO异常");
            e.printStackTrace();
        } finally {
            // 释放连接
            if (null != response) {
                try {
                    response.close();
                    httpClient.close();
                } catch (IOException e) {
                    System.err.println("释放连接出错");
                    e.printStackTrace();
                }
            }
        }
        // 打印响应内容
        System.out.println(entityStr);
        return  entityStr;
    }

注:说一下上面用到的BasicNameValuePair方法

三、BasicNameValuePair方法

new BasicNameValuePair(String1,String2)

BasicNameValuePair方法 进行参数传递时,只能使用String这种类型进行传递,事实上表单提交的get和post只能传递String类型,所以如何传递非String类型的参数,比如布尔类型、整型或者实体类。

其实第一个想到的就是将这些符合要求的类型转换成String类型就可以了,但是为什么可以直接转呢?

因为,httpPost.setEntity(new UrlEncodedFormEntity(params));这段神奇的代码

这里放到http entity里面的类型都是字节类型,HTTP协议与FTP,SMTP类似都是通过plain-text ASCII来进行CS数据通信的(不像TCP使用二进制,有历史原因,也更加节约带宽和方便调试),实际上并不存在什么String,Boolean,Integer数据类型,都是通过将byte进行ASCII编码来实现的,服务器端反序列化成String类型后,通过springMVC的框架进行解析,注意这里也需要区分提交方式,框架可能会选取适当的httpMessageConverter进行解析(这个是服务器关注的事情了)

                                            

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpPost 携带参数的请求方式 的相关文章

  • Android 通过 HTTP Post 请求发送 Base64 编码的图像

    我完全迷失了 我正在尝试通过 Android 应用程序将照片发送到 php 网页 理论上一切都应该是正确的 但目标数据已损坏或我不知道 我可以获取发布数据 我尝试使用一个简单的字符串 它工作正常 但对于一个大文件 数据似乎已损坏 publi
  • 使用 Python 请求传递登录名/密码

    我查看了相关答案 但没有找到非常有效的东西 我正在尝试从我的球队的 CBS Sportsline 页面上抓取一些梦幻棒球信息 我想发布登录名和密码 然后当我使用 get 命令时 查看特定于我的帐户的数据 这是我尝试过的 import req
  • 将 JsonRequestBehavior 设置为 AllowGet 时可能会泄露哪些“敏感信息”

    每次测试新的时我都会遇到同样的旧错误URL当我在浏览器的地址栏中returning Json 使用内置的MVC JsonResult helper 此请求已被阻止 因为当此请求用于某个目的时 敏感信息可能会泄露给第三方网站 GET requ
  • C# Web API POST 参数 FromBody 始终为 null

    我已经在网络上搜索了几个小时 并尝试了 StackOverflow 上描述的许多不同的解决方案 我知道以前曾有人问过类似的问题 但没有一个答案或评论对我有用 问题 我有一个 NET Web API 它有一个带有一些参数的 Post 方法 其
  • Rails Devise http 验证移动设备

    我正在尝试向我的服务器 ruby on Rails 应用程序验证 Android 客户端应用程序 该应用程序使用 Devise gem 但我尝试过 http 身份验证 并发布请求进行身份验证 并且服务器仅对任何给定的用户名 密码响应 200
  • RESTful WCF Web 服务 POST 问题

    我无法将参数传递给 wcf web 服务 我的网络方法 OperationContract WebInvoke Method POST ResponseFormat WebMessageFormat Json UriTemplate pla
  • android:等待连接时显示进度对话框

    我试图在启动新活动时添加一个进度对话框 该活动必须等待来自互联网的响应 目前 等待时屏幕会变黑 有谁知道它需要放置在哪里才能工作吗 这个进度对话框 ProgressDialog dialog ProgressDialog show Sear
  • 在 iOS 上发送 HTTP POST 请求

    我正在尝试使用我正在开发的 iOS 应用程序发送 HTTP Post 但推送从未到达服务器 尽管我确实收到了代码 200 作为响应 来自 urlconnection 我从未收到服务器的响应 服务器也没有检测到我的帖子 服务器确实检测到来自
  • PHP post方法无法从url获取数据

    我有一个 URL 用于在浏览器中粘贴并按 Enter 键后获取发布数据 我的链接是 http vtrails us mixtape builder song urls http vtrails us wp content uploads 2
  • 如何在Python中将字符串数据转换为JSON对象?

    这是我从其中一项网络服务收到的示例字符串 body 7B 22type 22 3A 22change 22 2C 22url 22 3A 22http 3A 2F 2Fapi pachube com 2Fv2 2Ftriggers 2F41
  • HttpPost 适用于 Java 项目,但不适用于 Android 项目

    我为我的 Android 设备编写了一些代码 用于通过 HTTPS 登录网站并从结果页面中解析一些数据 一个HttpGet首先获取登录所需的一些信息 然后HttpPost执行实际的登录过程 下面的代码在 Eclipse 中的 Java 项目
  • Node JS 如何将图像和请求数据一起 POST 到另一个服务器/api

    我正在尝试将图像从 Node JS 应用程序发布到另一个 REST API 我在 Mongo DB 中有图像 作为二进制数组数据 由 Node JS 读取 然后应该发布到另一个 API 我面临的问题是如何将请求数据与图像一起发送 我有这个原
  • 将文本数据作为表单中的文件发布

    是否可以从 html 表单中发布一些作为文件输入类型的字符串的 XML 数据 情况是我有一个像这样的表格 form action target php method post enctype multipart form data gt
  • 使用 Jquery 传递隐藏字段值

    我有一个正常的hidden Input field我在哪里生成random string 我需要将其附加到我尝试将数据发布到另一个页面的 URL 中 我已经做到了这一点并且效果很好 url Upload html field1 newval
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • Rails 4 带有 link_to 和带有强参数的方法 post

    我陷入了一个不可能那么复杂的问题 但我只是没有把事情做好 假设我有两个模型 class Notification lt ActiveRecord Base belongs to device validates number presenc
  • Asp.net core webapi获取从Angular4应用程序发布的空值

    我是新来的Angular4在快速交付内容的情况下 所以没有时间彻底学习它 所以如果我的问题看起来很幼稚 请原谅 From my Asp Net Web API I have Confirmemail API必须从 Angular4 应用程序
  • 如何使用 jQuery 设置计时器来发送 HTML 表单的 HTTP post 数据

    我有一个 HTML 表单 需要使用 HTTP POST 和输入数据将其发布到服务器 具体来说 我只需要发送表单中选中的所有复选框的参数值 如果用户10分钟内没有自己做 我就需要做 我不确定实现这一目标的最佳方法 但现在我正在尝试使用 jQu
  • Android Multipart HTTP Post 不发送文件的 MIME 类型

    试图找出我的编码有什么问题 我关注了一篇博客文章here http evgenyg wordpress com 2010 05 01 uploading files multipart post apache 我设法获得了将文件实际上传到
  • Android HTTP-post AsyncHttpClient

    public void postLoginData AsyncHttpClient myClient new AsyncHttpClient RequestParams params1 new RequestParams params1 p

随机推荐

  • gin判断点击submit提交按钮的值

    网页效果 处理效果 点击安装 点击检查 处理日志 源码 Gin 通过获取name的值 从而获取value span class token keyword func span span class token punctuation spa
  • go语言gin框架使用for渲染html表格数据

    效果 源码 go span class token keyword type span data span class token keyword struct span span class token punctuation span
  • Python3传参argparse传入布尔值类型

    效果 源码 span class token comment usr bin env python span span class token comment encoding utf 8 span span class token tri
  • Flask获取select的值

    效果 源码 Html span class token tag span class token tag span class token punctuation lt span div span span class token spec
  • VUE3入门第二篇:安装pnpm

    VUE介绍 VUE是一个使用JavaScript编写的框架 xff0c 所以在开发的时候 xff0c 我们可以使用Js的包管理工具进行安装 管理Js框架 pnpm介绍 一般情况下 xff0c 对于我们都会使用npm进行管理 xff0c 但是
  • VUE3入门第一篇:安装NodeJs

    进入官网NodeJs下载安装包安装 或者直接点击下面的链接 node v18 14 2 x64 msi 无脑Next即可 图形化安装后会 出现终端安装 耐心等待即可
  • Ubuntu22.04系统中关闭图形界面的方法

    实际上本方法不仅仅适用于Ubuntu22 04版本 xff0c 应该也适用于20 04等其他版本 关闭图形界面 xff0c 启用tty终端登录的方法如下 xff1a systemctl set default multi user targ
  • VUE3入门第三篇:创建应用

    安装框架 pn span class token function install span vue 64 latest 安装效果 PS D span class token punctuation span DATA span class
  • VUE3入门基础:input元素的type属性值说明

    说明 在Vue 3中 xff0c lt input gt 元素的type属性可以设置不同的类型 xff0c 以适应不同的输入需求 常见的type属性取值如下 xff1a text xff1a 默认值 xff0c 用于输入文本 passwor
  • Docker WIndows最新版(4.17.x)修改镜像存储路径

    一般情况 在 Docker Desktop 4 17 0 版本中 xff0c 可以按照以下步骤来修改 Docker 镜像存储路径 打开 Docker Desktop 应用程序 xff0c 单击顶部菜单栏中的 Docker Desktop 菜
  • Nginx限制请求方式

    在nginx的配置文件中 xff0c 将location 下的IF条件中的 request method参数设置允许的请求类型 仅允许Get server span class token punctuation span span cla
  • Nginx实现一个IP访问总流量限制

    在 Nginx 中 xff0c 可以使用 ngx http limit req module 模块配合 ngx http limit conn module 模块实现基于 IP 的流量和连接数控制 具体来说 xff0c 可以按照如下步骤实现
  • CentOS - node命令not found解决

    背景 xff1a 前几天在阿里云部署了一个node项目 xff0c node版本 v12 10 0 每次重新远程连接 xff0c 输入node v pm2 v 显示 command not found xff1b 每次必须先输入 nvm u
  • 用Java实现天天酷跑(附源码),这个真的有点强了!

    点击上方 阿拉奇学Java xff0c 选择 置顶或者星标 每天早晨00点00分 与你相约 xff01 首先 xff0c 写一个需求文档 xff1a 一 项目名称 xff1a 天天酷跑 xff08 RunDay xff09 二 功能介绍 x
  • SpringBoot开源在线考试系统

    推荐一款在线考试系统 xff1b 基于 SpringBoot 43 Mybatis 43 Shiro 43 mysql 43 redis构建的智慧云智能教育平台 架构上使用完全前后端分离 支持多种题型 xff1a 选择题 多选题 判断题 填
  • 微信闪退Bug罪魁祸首竟是二维码引擎,附源代码分析

    建议别尝试 xff1a 转发这个二维码到群里 xff0c 3秒后你会回来骂我 xff08 抖m求骂 xff09 近日 xff0c 网传微信识别上方二维码就会出现闪退BUG xff0c 小编也忍不住尝试了一下 xff0c 果然 xff0c 一
  • java多线程之线程安全(重点,难点)

    由于操作系统中 线程的调度是抢占式执行的 或者说是随机的 这就造成线程调度执行时 线程的执行顺序是不确定的 虽然有一些代码在这种执行顺序不同的情况下也不会运行出错 但是还有一部分代码会因为执行顺序发生改变而受到影响 这就会造成程序出现Bug
  • React-Native: DatePickerIOS设置选择24小时

    原帖 xff1a https github com mmazzarolo react native modal datetime picker DatePickerIOS选择24小时的方法 xff1a How to set 24 hours
  • 使用chatgpt实现微信聊天小程序(秒回复),github开源(附带链接)

    前言 我在前一段时间突发奇想 xff0c 就使用java来调用chatgpt的接口 xff0c 然后写了一个简单小程序 xff0c 也上了热榜第一 xff0c java调用chatgpt接口 xff0c 实现专属于自己的人工智能助手 xff
  • HttpPost 携带参数的请求方式

    一 HTTP请求 Http的几种请求方式对应程序包中的HttpGet HttpHead HttpPost HttpPut HttpDelete HttpTrace and HttpOptions xff0c 这些类均实现了HttpUriRe