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字段,其对应的值是一个随机生成的字符串,用于分隔请求体中的数据用的
application/json
此种方式,用的最多,也是最常用的方式,不过我在写www.helloworld.net
的过程中,很少用这种方式因为这种方式有一个缺点,就是服务端在解析的时候,需要创建大量的结构体或者类。所以最后选择了第一种的提交方式
text/xml
这种就不怎么用了,请求体中是xml格式
简单的介绍了一下HTTP的GET,POST的一些知识,希望对你们有用。
也当作自己的笔记,怕记不住,方便查询 。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
源码级深度理解 Java SPI
作者:vivo 互联网服务器团队- Zhang Peng SPI 是一种用于动态加载服务的机制。它的核心思想就是解耦,属于典型的微内核架构模式。SPI 在 Java 世界应用非常广泛,如:Dubbo、Spring Boot 等框架。本文从源码入手分析,深入探讨 Java SPI 的特性、原理,以及在一些比较经典领域的应用。 一、SPI 简介 SPI 全称 Service Provider Interface,是 Java 提供的,旨在由第三方实现或扩展的 API,它是一种用于动态加载服务的机制。Java 中 SPI 机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦。 Java SPI 有四个要素: SPI 接口:为服务提供者实现类约定的的接口或抽象类。 SPI 实现类:实际提供服务的实现类。 SPI 配置:Java SPI 机制约定的配置文件,提供查找服务实现类的逻辑。配置文件必须置于 META-INF/services 目录中,并且,文件名应与服务提供者接口的完全限定名保持一致。文件中的每一行都有一个实现服务类的详细信息,同样是服务提供者类...
- 下一篇
EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT
作者:汝贤、秋兮、熊兮、临在 导读 预训练语言模型在NLP的各个应用中都有及其广泛的应用;然而,经典的预训练语言模型(例如BERT)缺乏对知识的理解,例如知识图谱中的关系三元组。知识增强预训练模型使用外部知识(知识图谱,字典和文本等)或者句子内部的语言学知识进行增强。我们发现,知识注入的过程都伴随着很大规模的知识参数,下游任务fine-tune的时候仍然需要外部数据的支撑才能达到比较好的效果,从而无法在云环境中很好的提供给用户进行使用。CKBERT(Chinese Knowledge-enhanced BERT)是EasyNLP团队自研的中文预训练模型,结合了两种知识类型(外部知识图谱,内部语言学知识)对模型进行知识注入,同时使得知识注入的方式方便模型可扩展。我们的实验验证也表明CKBERT的模型精度超越了多种经典中文模型。在本次的框架升级中,我们将多种规模的CKBERT模型贡献给开源社区,并且这些CKBERT模型与HuggingFace Models完全兼容。此外,用户也可以在阿里云机器学习平台PAI上方便地利用云资源使用CKBERT模型。 EasyNLP(https://githu...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题