赞
踩
首先说一下为什么写这篇文章,以前写客户端的时候,要经常调用后端的接口,一般很多公司的接口,都是统一 POST 提交方式
服务端响应的是 JSON 格式字符串,方便统一管理,当时对 POST 不太清楚,开始的时候,不觉得有啥
但是真正等到自己写一个独立的技术社区的时候,也就是 www.helloworld.net
,需要上传,需要表单提交等
才发现,不懂这些,用到了的时候,很是费劲,很耽误时间。
下面就当是复习了,学习一下 GET
, POST
这两种最常用的提交方式
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 是一个通信协议,啥叫通信协议
,通信嘛,就是两个人要沟通,协议嘛,就是怎么沟通
比如我说 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 请求就是获取服务器上的某个资源 ,使用也很简单,我们记住下面两点就行了
http://www.helloworld.net?name=tom&age=23
服务器收到请求就可以解析出来 url 后面带的参数了,name = tom , age = 23
下面我们重点看一下 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 的一些知识,希望对你们有用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。