总结
提问
[x] 1. 什么是
\r\nLF、CRLF: 都是换行符,用于不同系统。LF: 即\n,0x0a用于Unix/Mac OS XCRLF:即\n\r,0x0d 0x0a用于Windows、http请求
[x] 2. 如何找到文件中的
\r\ncat -ebat -Avim:set invlist
[x] 3.
HTTP报文格式是什么样的请求行(方法 路径 协议版本)、请求头、请求体
响应行(协议版本 状态码 状态描述)、响应头、响应体[x] 4. 我们如何查看某次请求的
HTTP报文curl/http -vvv
1. 前提提要、场景
HTTP(Hyper Text Transfer Protocol),超文本传输协议。可用于浏览器(HTTP Client)与服务器(HTTP Server)之间的通信。HTTP 是前后端沟通的桥梁,了解 HTTP 协议及报文相当重要。
2. HTTP 报文
HTTP 是基于文本的协议,且由请求(Request)、响应(Response)两种 HTTP 报文构成。
HTTP 报文,也称为 HTTP Message,用于在客户端与服务器间传送数据。
报文每行都由 \r\n 换行(即 CRLF)。
LF、CRLF: 都是换行符,用于不同系统。
LF: 即\n,0x0a用于Unix/Mac OS XCRLF:即\n\r,0x0d 0x0a用于Windows、http请求
2.1 GET
sh
# -v: 更详细的输出 包含 request 和 response
# httpbin.org: 一个用来学习 http 的服务,各种例子
$ curl -v httpbin.org/get
# 以下为输出
# 每一行结尾是: \r\n
# 第一部分为 request
# 请求行:由 Method Path Version 构成
> GET /get HTTP/1.1
# 请求头:
> Host: httpbin.org
> User-Agent: curl/7.64.0
> Accept: */*
>
# 注意 ↑ 这个空行,实际是相隔两个 \r\n,将会收到响应报文
# 第二部分为 response
# 响应行:由 Version StatusCode StatusText 组成
# 在 HTTP/2 中,没有 StatusText,常用项已存储在静态索引表
< HTTP/1.1 200 OK
# 响应头:
< Date: Sun, 11 Dec 2022 04:14:10 GMT
< Content-Type: application/json
< Content-Length: 252
< Connection: keep-alive
< Server: gunicorn/19.9.0
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
<
# 注意 ↑ 这个空行,实际是相隔两个 \r\n,作为响应头和响应体的分隔
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.64.0",
"X-Amzn-Trace-Id": "Root=1-63955912-159cebb650fd9f3661ce40bc" },
"origin": "xx.xx.xx.xx",
"url": "http://httpbin.org/get"
}
2.2 POST
POST 与 GET 相比只是多了个请求体
sh
$ curl httpbin.org/post -X POST -H "content-type: application/json" -d '{"age": "18"}' -v
> POST /post HTTP/1.1
> Host: httpbin.org
> User-Agent: curl/7.64.0
> Accept: */*
> content-type: application/json
> Content-Length: 13
>
# 注意 ↑ 这个空行,实际是相隔两个 \r\n,作为请求头和请求体的分隔。请求体和响应报文之间就没有空行了
* upload completely sent off: 13 out of 13 bytes
< HTTP/1.1 200 OK
< Date: Sun, 11 Dec 2022 06:08:38 GMT
< Content-Type: application/json
< Content-Length: 420
< Connection: keep-alive
< Server: gunicorn/19.9.0
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
<
{
"args": {},
"data": "{\"age\": \"18\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "13",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.64.0",
"X-Amzn-Trace-Id": "Root=1-639573e6-0c1aa7244e5ae06a564743d2" },
"json": {
"age": "18"
},
"origin": "xxx.xx.xx.x",
"url": "http://httpbin.org/post"
}
3. HTTP Client/Server
HTTP Client: 即 HTTP 客户端,如:浏览器里的 fetch/XHR,命令行里的 curl。往大了想,也可以将浏览器当成客户端。 API 管理工具 Apifox 与 Postman 也是客户端
HTTP Server: 即 HTTP 服务端,如: nginx/django/express/koa。主要功能:接收 HTTP 客户端的请求,分析路由、请求方法请求体,并返回对应的响应报文