一直被误解的get请求

从开始接触web,就一直看到有人问:“http的get请求和post请求有什么区别”。我一直也说不清楚。毕竟有个地方,我百思不得其解。

不解的地方是,在http报文格式中,GET和POST请求,最大的差别只是在报文主体上。一个有Entity一个没有。甚至有些文章说GET请求的参数因为都是在url上,而url有长度限制。

但是GET请求真的没有吗?翻一翻rfc1945,也没说GET请求不给传Entity呀?只是说POST必须传content-length。甚至都没提到url长度的事。

那就试试在GET请求里放 Entity?

动手

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// client.js
const http = require("http");

const Data = JSON.stringify({
"key":""
})
const request = http.request({
hostname: "localhost",
port: "8000",
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(Data),
host: 'localhost:8000',
},
method:"GET"
}, (res) => {
let data = ""
// console.log(res)
res.on("data", (chunk) => {
data+=chunk
})
res.on("end", () => {
console.log(data)
})
})
console.log("send data:",Data)
request.write(Data);
// request.on("connect")
request.end();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// server.js
const http = require("http");

const request = http.createServer({ insecureHTTPParser: true }, (request, response) => {
let data = ''
request.on("data", (chunk) => {
data += chunk.toString()
})

request.on("end", () => {
response.end("{}", () => {})
})

});
request.on("connection", (req,) => {
let x = ""
req.on("data", (c) => {
x+=c.toString()
})
req.on("close", () => {
console.log(x)
})
})

request.listen(8000, () => {
console.log("localhost:8000")
})

测试

1
2
3
4
5
6
7
8
9
10
11
➜ node server.js
localhost:8000
GET / HTTP/1.1
Content-Type: application/json
Content-Length: 10
host: localhost:8000
user-agent: curl/7.64.1
accept: */*
Connection: close

{"key":""}
1
2
3
➜ node client.js
send data: {"key":""}
{}

server端能接收到client端的GET请求,并成功返回数据。

所以http的GET请求一样能传body,而且也没有他们说的url长度限制,这种长度限制其实只是在浏览器上才会出现,在http报文结构中,是不对长度进行限制的。


一直被误解的get请求
https://bubao.github.io/posts/430d91fe.html
作者
一念
发布于
2021年11月7日
许可协议