HTTP 中 POST 提交数据的四种方式详解

这篇具有很好参考价值的文章主要介绍了HTTP 中 POST 提交数据的四种方式详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

HTTP 中 POST 提交数据的四种方式详解

首先说一下为什么写这篇文章,以前写客户端的时候,要经常调用后端的接口,一般很多公司的接口,都是统一 POST 提交方式

服务端响应的是 JSON 格式字符串,方便统一管理,当时对 POST 不太清楚,开始的时候,不觉得有啥

但是真正等到自己写一个独立的技术社区的时候,也就是 www.helloworld.net ,需要上传,需要表单提交等

才发现,不懂这些,用到了的时候,很是费劲,很耽误时间。

下面就当是复习了,学习一下 GET , POST 这两种最常用的提交方式

HTTP 提交方式有哪些?

HTTP 请求方法有 9 种,分别是

序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和 / 或已有资源的修改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS 允许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。
9 PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新 。

最常用的还是 GET , POST

HTTP 的组成部分

我们知道,http 是一个通信协议,啥叫通信协议,通信嘛,就是两个人要沟通,协议嘛,就是怎么沟通

比如我说 A,你知道我饿了想吃东西了,我再说 A 米饭, 你就知道我饿了,并且想吃米饭了。

对的,协议就是双方提前商量好的沟通的内容的格式

HTTP 通信协议就是 HTTP客户端和 HTTP服务端 双方规定好的格式

那么这个 HTTP 消息,有哪几部分组成呢

很简单,HTTP 消息包含两部分

  • 请求头
  • 请求体

比如我们在浏览器中发一个请求 www.helloworld.net 回车,此时我们发的是 GET 请求

那么请求头是:

GET / HTTP/2
Host: www.helloworld.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: Hm_lvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406379; Hm_lpvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406379
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
If-None-Match: "d696-1nnZwKI6/LZalqvEzQx9IFil/tw"
TE: trailers

注意: HTTP 的 GET 请求,是没有请求体的,这也就是为什么有些公司统一封装请求为 POST, 而不是 GET 的原因了

因为 POST 是有请求体的,可以带大量的数据,GET 因为没有请求体,携带参数只能放在 URL 中,能带的数据量是比较少的。

GET 请求方法

GET 访求方法最常用,也是最简单的一种,像其语义一样,GET 就是获取文件的意思

所以 GET 请求就是获取服务器上的某个资源 ,使用也很简单,我们记住下面两点就行了

  • GET 传参数只能在 url 后面带上参数,比如 http://www.helloworld.net?name=tom&age=23

​ 服务器收到请求就可以解析出来 url 后面带的参数了,name = tom , age = 23

  • 还有一点,很少有人说,就是上面我们说的,GET 请求是没有请求体的

下面我们重点看一下 POST 请求

POST 请求方法

POST 是提交的意思,如果我们需要向服务器提交一些数据,就可以使用 POST 方法

虽然 POST 是提交的意思,协议规定的也是用 POST 提交数据,但是现在很多公司并没有这样搞

查询也会用 POST,其实它只是个单词,服务端收到 请求后,是查询资源,还是删除资源,还是提交

都可以的,只是看你们公司前后端怎么规定即可。

下面我们看看 POST 有哪几种提交数据的方式

第一种 application/x-www-form-urlencoded

这也是 POST 默认的一种方式 ,对应的请求头中的 Content-Type 为 application/x-www-form-urlencoded

我们从浏览器中抓取 www.helloworld.net 上的几个请求方式,为例,如下

## 请求头
POST /v1/special/getSpecialCateList HTTP/2
Host: tiger-api.helloworld.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Authorization: 
token: 
ts: 1668407094
sign: d41d8cd98f00b204e9800998ecf8427e
deviceType: pc
Origin: https://www.helloworld.net
Connection: keep-alive
Referer: https://www.helloworld.net/
Cookie: Hm_lvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406379; Hm_lpvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406398
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
Content-Length: 0

## 请求体
action=10&pageNum=1&pageSize=10&uuid=15139897

此种方式,一般是提交 key, value 的值。

第二种:multipart/form-data

我之前把这种当作了上面的那种,后来写文件上传的时候,查了一下,原来 不是

这种提交方法一般是上传文件用的多。通常是用在客户端向服务端传送大文件数据,如:图片或者文件。

首先来解释下什么它的编码方式,首先会生成一个很长的 boundary 字符串分界线,表明下面的都是表单内容,然后紧接着跟的是表单中的第一个键值对中的名称,而后一个换行,跟着值。然后再生成一个 boundary 字符串分界线,用于分割不同的键值。之后就重复以上操作,详细的流程请看下方的例子。

同样我们以 www.helloworld.net 举例,我们从里面找个接口,抓取一下,看看

# 请求头
POST http://www.helloworld.net/xyz HTTP/1.1
Host: www.helloworld.net
User-Agent: python-requests/2.24.0
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: multipart/form-data; boundary=e42346452as650adf2345fadade
Content-Length: 222
Connection: keep-alive

# 请求体
--e42346452as650adf2345fadade
Content-Disposition: form-data; name="field0"

value1
--e42346452as650adf2345fadade
Content-Disposition: form-data; name="field1"

value2
--e42346452as650adf2345fadade--
Content-Disposition: form-data; name="field2"; filename="filename"
Content-Type: text/plain

--e42346452as650adf2345fadade--

从上面我们可以知道,在请求头中的 Content-Type 中,有一个 boundary=e42346452as650adf2345fadade

这个 boundary 后面的字符串都是随机生成的。用于请求体中数据的分段的。

其实就是个分隔符的作用。

第三种:application/json

这种就是我们现在用的最多的了,而且也非常方便

在请求头中设置 content-type=application/json, 就表明请求体中的内容格式为 json 格式

同样的,服务端在响应的时候,顺应头中也会添加一个 content-type=application/json

同样的也是告诉客户端,我响应给你的响应体中的内容,格式同样为 json 格式

同的样我们也参照 www.helloworld.net 中的一个请求,如下

## 请求头
POST /v1/special/getSpecialList HTTP/2
Host: tiger-api.helloworld.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/json
Authorization: 
token: 
ts: 1668408188
sign: 08fab32346193fa92037b5ca5f9ed592
deviceType: pc
Content-Length: 30
Origin: https://www.helloworld.net
Connection: keep-alive
Referer: https://www.helloworld.net/
Cookie: Hm_lvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406379,1668408042,1668408051; Hm_lpvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668408051
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
TE: trailers

## 请求体
action=10&pageNum=1&sortType=0

我们看一下响应体:

{
  "code": 1,
  "data": {
    "hasMore": false,
    "list": [
      {
        "uuid": "5441523000",
        "title": "区块链原理和应用",
        "totalCount": 0,
        "chapterCount": 1,
        "readCount": 0,
        "subscribeCount": 1,
        "createTime": "0001-01-01T00:00:00Z",
        "status": 0,
        "profile": "1037883613",
        "nicker": "小天",
        "avatar": "https://img-hello-world.oss-cn-beijing.aliyuncs.com/imgs/d04d513fbea19f6cb7c3b4beee3c7f5e.jfif",
        "subscribed": false
      },
      {
        "uuid": "bbatgp",
        "title": "C语言编程(初级)",
        "totalCount": 0,
        "chapterCount": 19,
        "readCount": 2938,
        "subscribeCount": 1,
        "createTime": "0001-01-01T00:00:00Z",
        "status": 0,
        "profile": "80662724",
        "nicker": "Suzhou",
        "avatar": "https://img-hello-world.oss-cn-beijing.aliyuncs.com/imgs/d04d513fbea19f6cb7c3b4beee3c7f5e.jfif",
        "subscribed": false
      }
    ]
  },
  "message": "获取数据成功",
  "errMessage": ""
}

第四种:text/xml

这个一直没有遇到过,很少用

其实就是请求消息中,请求体中的内容格式是纯文本 xml 格式

此种我们就不作介绍

有兴趣的可以下面自己查资料

综上所述,HTTP 的 POST 四种方法以及 GET 的简单介绍,我们总结如下:

  • GET 请求只能在 URL 中携带参数,别说请求头中也能带参数,请求头中带参数,是所有的方法都可以的,不算是 GET 方法的

  • GET 请求是没有请求体的

  • POST 提交数据有四种方式,分别如下:

      1. `application/x-www-form-urlencoded` , 也是默认的方式,主要提交的数据是key, value 形式的
      2. `multipart/form-data` ,此种方式 是客户端向服务端提交大数据用的,一般上传文件等用到。
    

​ 注意这种方式,会在请求头中生成一个 boundary 字段,其对应的值是一个随机生成的字符串,用于分隔请求体中的数据用的

  1. application/json 此种方式,用的最多,也是最常用的方式,不过我在写 www.helloworld.net 的过程中,很少用这种方式

    因为这种方式有一个缺点,就是服务端在解析的时候,需要创建大量的结构体或者类。所以最后选择了第一种的提交方式

  2. text/xml 这种就不怎么用了,请求体中是 xml 格式

简单的介绍了一下 HTTP 的 GET,POST 的一些知识,希望对你们有用。文章来源地址https://www.toymoban.com/news/detail-477131.html

到了这里,关于HTTP 中 POST 提交数据的四种方式详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL入门必备:Linux中部署MySQL环境的四种方式详解

    目录 一、仓库安装 二、本地安装 三、Docker中安装 四、源码安装 首先需要下载mysql软件包: 1、进入MySQL官网 2、进入MySQL社区版下载 3、使用yum方式下载MySQL 4、下载对应版本的软件包 5、这里可以不登录直接下载软件包 6、复制下载链接 7、然后进入到linux命令行中使用命令下

    2024年02月07日
    浏览(23)
  • Flutter 中数据存储的四种方式

    在 Flutter 中,存储是指用于本地和远程存储和管理数据的机制。以下是 Flutter 中不同存储选项的概述和示例。 Shared Preferences(本地键值存储) Shared Preferences 是一种在本地存储少量数据(例如用户首选项或设置)的简单方法。 它适合以持久的方式存储键值对。 shared_preferenc

    2024年02月03日
    浏览(22)
  • python接口自动化(十)--post请求四种传送正文方式(详解)

    post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等。我们要知道post请求四种传送正文方式首先需要先了解一下常见的四种编码方式: HTTP 协议规定 POST 提交的数据必须放在消息主体(e

    2024年02月04日
    浏览(40)
  • application/json-常见的post提交数据的方式

    在http协议中规定了GET、HEAD、POST、PUT、DELETE、CONNECT 等请求方式,其中比较常用的就是post和get,其中post用来向服务器提交数据,post只规定了提交的数据必须放在请求的主体中,但是并没有规定传输数据的编码方式。比较主流的有如下的几种编码方式。 1. application/x-www-form-url

    2024年02月13日
    浏览(28)
  • HTTP请求方法之POST请求的三种常见数据提交格式

    目录 🌐 application/x-www-form-urlencoded 🌐 multipart/form-data 🌐 application/json    本文所讲的 POST 请求是 HTTP/1.1 协议中规定的众多 HTTP 请求方法的其中最常用的一个。一般使用 POST 请求方法向服务器发送数据(主要是一些创建更新操作),本文讨论的是 POST 请求方法常用的三种数据

    2024年02月09日
    浏览(63)
  • View 的四种 OnClick 方式

    嗨喽,大家好!今天呢,我跟大家聊一聊Android 的View 的点击事件onClick 。额,有点拗口(^_^) 。 看过我的文章的人可能会好奇,你怎么写Android的文章了啊?说起这啊,就是我的血泪史了,此处省略一万字.................... 废话不多说,让我们代码走起,风里来,雨里去,唯有代

    2023年04月15日
    浏览(31)
  • STM32的四种开发方式

    首先看下ST官方给出的四种开发方式的比较 寄存器开发 寄存器编程对于从51等等芯片过渡过来的小伙伴并不陌生,不管你是什么库,最终操作的还是寄存器,所以对于标准库、HAL库、LL库都是在寄存器上的编程,所以可以直接在各种库中直接操作寄存器。 但寄存器开发方法到

    2024年02月11日
    浏览(26)
  • CSS中的四种定位方式

    在CSS中定位有以下4种: 静态定位 - static 相对定位 - relative 绝对定位 - absolute 固定定位 - fixed 静态定位是css中的默认定位方式,也就是没有定位。在此定位方式中设置:top,bottom,left,right,z-index 这些属性都是无效的。 相对位置前的位置: 相对位置后的位置: 可以看到该

    2024年02月08日
    浏览(78)
  • 创建多线程的四种方式

    ① 创建一个类继承 Thread 类,重写 run() 方法 ② 调用 start() 方法启动线程 例: ① 创建类实现 Runnable 接口,重写 run() 方法 ② 以实现类作为构造器参数,创建一个线程( Thread )对象 ③ 调用 start() 方法启动线程 例 注意:实现Runnable接口方式中,调用的不是Thread类的run()方法

    2024年02月10日
    浏览(36)
  • JavaScript中的四种枚举方式

    字符串和数字具有无数个值,而其他类型如布尔值则是有限的集合。 一周的日子(星期一,星期二,...,星期日),一年的季节(冬季,春季,夏季,秋季)和基本方向(北,东,南,西)都是具有有限值集合的例子。 当一个变量有一个来自有限的预定义常量的值时,使用

    2024年02月03日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包