从开始接触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
| 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 = "" res.on("data", (chunk) => { data+=chunk }) res.on("end", () => { console.log(data) }) }) console.log("send data:",Data) request.write(Data);
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
| 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报文结构中,是不对长度进行限制的。