在Node.js中,HTTP(Hypertext Transfer Protocol)协议被广泛应用来构建web服务器和实现客户端与服务器之间的通信。
请求报文
以下是一段请求www.baidu.com
的报文。
GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)Chrome/108.0.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
sec-ch-ua: "Not?A_Brand";v="8", "Chromium";v="1088", "Google Chrome";v="108"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,1a;q=0.77
Cookie: BIDUPSID=106A974BAB5BA0458E81F18CBEA96E52;_PSTM=1669267573;_BD_UPN=12314753
(空)
(请求体可能为空)
请求行
GET https://www.baidu.com/ HTTP/1.1
请求方法
GET
是请求方法
常用请求方法:
方法 | 作用 |
---|---|
GET | 主要用于获取数据 |
POST | 主要用于新增数据 |
PUT/PATCH | 主要用于更新数据 |
DELETE | 主要用于删除数据 |
URL
https://www.baidu.com/
是URL(Uniform Resource Locator,中文译名叫做统一资源定位符,其本身是一个字符串,用来定位服务器中的资源。)-
https
是协议名
-
//
是协议固定组成部分
-
www.baidu.com
是主机名(或称为网络名),可以是域名,也可以是ip地址。主要作用:
-
-
- 识别服务: 它帮助浏览器或其他客户端确定要连接到互联网上哪一台特定的服务器以获取所需资源。
-
-
-
- 便于记忆: 相比于难以记忆的IP地址(如 123.125.114.25),主机名更容易让人理解和记忆。
-
-
-
- 组织内容: 不同的主机名可以指向同一域名下的不同服务或子站点
-
-
-
- 负载均衡与分布式服务。
-
/
是路径,定位服务器中某一个资源,比如下图:
HTTP版本号
版本号 | 发布时间 |
---|---|
1.0 | 1996年 |
1.1 | 1999年 |
2 | 2015年 |
3 | 2018年 |
请求头
多个键值对组成了请求头。
Host: www.baidu.com // 指定请求所指向的服务器的域名
Connection: keep-alive // 告诉服务器希望保持这个TCP连接打开,以便后续请求复用,提高效率。
Upgrade-Insecure-Requests: 1 // 表示客户端愿意和服务端升级到一个更安全的连接,比如从HTTP升级到HTTPS,以保护数据传输安全。
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)Chrome/108.0.0.0.0 // 关于发起请求的客户端软件的信息,包括操作系统、浏览器类型及版本等。这例中是Mozilla/5.0兼容的浏览器,具体为Chrome 108版本,在Windows 10操作系统上运行。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9 // 指定了客户端能够处理的内容类型,按优先级排序。这里表示接受HTML、XHTML以及XML文档。
Sec-Fetch-Site: none // Sec-Fetch-Site, Sec-Fetch-Mode, Sec-Fetch-User, Sec-Fetch-Dest 这些是Fetch元数据头部,用于提供请求的上下文信息给服务器,以增强安全策略的决策。
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
sec-ch-ua: "Not?A_Brand";v="8", "Chromium";v="1088", "Google Chrome";v="108" // sec-ch-ua, sec-ch-ua-mobile, sec-ch-ua-platform 这些是客户端提示(Client Hints),提供了关于用户代理的更多信息,包括品牌、版本和平台,有助于服务器根据用户的设备能力优化响应内容。
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Accept-Encoding: gzip, deflate, br // 列出了客户端支持的内容编码方式,用于压缩传输内容,减少带宽消耗。这里支持gzip、deflate和brotli压缩。
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,1a;q=0.77 // 指示客户端优先接受的语言,按照优先级排序。这里是中文(简体)、英文和其他语言。
Cookie: BIDUPSID=106A974BAB5BA0458E81F18CBEA96E52;_PSTM=1669267573;_BD_UPN=12314753 // 这里包含了一些百度相关的用户会话信息,如用户唯一标识(BIDUPSID)、上次访问时间(_PSTM)等。
请求体
以下是掘金登录,带**请求体(最后一行)**的完整请求报文,请求体形式灵活,一般以JSON
格式居多。
POST https://juejin.cn/passport/web/user/login/?aid=2608&account_sdk_source=web&sdk_version=2.2.6&verifyFp=verify_lwzp7imk_0ZSnzPMI_hPzh_4oHy_BVct_O7PKYLoZWv9g&fp=verify_lwzp7imk_0ZSnzPMI_hPzh_4oHy_BVct_O7PKYLoZWv9g&sign=8c3eaed81fa892aa0097a46abb2118db0d8aeea5c2ac1db7ac50bf4e7817e07c&qs=6466666a706b715a76616e5a766a7077666029646c612963752976616e5a736077766c6a6b297360776c637c4375 HTTP/1.1
Host: juejin.cn
Connection: keep-alive
Content-Length: 86
sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"
Accept: application/json, text/javascript
Content-Type: application/x-www-form-urlencoded
x-tt-passport-csrf-token: 2c48679e2c34c64dc39d9ab2db115b0a
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
sec-ch-ua-platform: "Windows"
Origin: https://juejin.cn
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://juejin.cn/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9
Cookie: __tea_cookie_tokens_2608=%257B%2522web_id%2522%253A%25227052979086726432271%2522%252C%2522ssid%2522%253A%2522ad92a6d1-7e5a-4dd3-b815-4667862c2bc0%2522%252C%2522user_unique_id%2522%253A%25227052979086726432271%2522%252C%2522timestamp%2522%253A1642149670986%257D; store-region=cn-zj; store-region-src=uid; s_v_web_id=verify_lwzp7imk_0ZSnzPMI_hPzh_4oHy_BVct_O7PKYLoZWv9g; _tea_utm_cache_2018={%22utm_source%22:%22search%22}; _tea_utm_cache_2608={%22utm_source%22:%22search%22}; _tea_utm_cache_576092=undefined; passport_csrf_token=2c48679e2c34c64dc39d9ab2db115b0a; passport_csrf_token_default=2c48679e2c34c64dc39d9ab2db115b0a; sid_guard=fc13b99ccb50bf114ebcf67de5f4cf65%7C1719397959%7C21600%7CWed%2C+26-Jun-2024+16%3A32%3A39+GMT; uid_tt=e48cb9f43fc22eab0eb235e137dc3456; uid_tt_ss=e48cb9f43fc22eab0eb235e137dc3456; sid_tt=fc13b99ccb50bf114ebcf67de5f4cf65; sessionid=fc13b99ccb50bf114ebcf67de5f4cf65; sessionid_ss=fc13b99ccb50bf114ebcf67de5f4cf65; sid_ucp_v1=1.0.0-KGVlZjhmNjJiYj
(空格)
mix_mode=1&account=3430353d3d3c353236353c&password=74647f72767d343736&fixed_mix_mode=1
响应报文
以下是一段请求www.baidu.com
的响应报文。
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Content-Length: 255
Content-Type: application/xm
Date: Wed, 26 Jun 2024 07:23:49 GMT
Etag: "ff-51bee881817c0"
Expires: Wed, 26 Jun 2024 07:33:49 GMT
Last-Modified: Tue, 28 Jul 2015 12:23:03 GMT
Pragma: no-cache
Server: Apache
Vary: Accept-Encoding,User-Agent
(空格)
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>百度搜索</ShortName>
<Url type="text/html" template="https://www.baidu.com/s?wd={searchTerms}"/>
</OpenSearchDescription>
响应行
HTTP/1.1 200 OK
HTTP/1.1(版本号
) 200(响应状态码
) OK(响应状态的描述
)
状态码 | 含义 |
---|---|
200 | 请求成功 & ok |
403 | 禁止请求 & Forbidden |
404 | 找不到资源 & Not Found |
500 | 服务器内部错误 & Internal Server Error |
Cache-Control
:
- private: 响应可以被客户端缓存,但不能被代理服务器缓存并共享。
- no-cache: 强制每次请求都向服务器验证资源是否过期,即使有缓存也要检查。
- no-store: 禁止任何缓存,要求每次请求都从服务器获取完整响应。
- proxy-revalidate: 类似于 no-cache, 但专门针对代理服务器,要求其重新验证响应。
- no-transform: 禁止代理服务器或网关对响应进行转换或更改。
响应头
Accept-Ranges: bytes // 服务器支持范围请求
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform // 一系列指令告诉缓存系统如何处理响应内容
Content-Length: 255 // 指出响应主体(body)的字节数,帮助客户端准确接收完整内容
Content-Type: application/xml // 指示响应内容的数据类型和格式,在此例中是XML类型
Date: Wed, 26 Jun 2024 07:23:49 GMT // 响应生成的时间戳,按照GMT时间标准。
Etag: "ff-51bee881817c0" // 实体标签,用于标识资源的特定版本,帮助实现条件请求,判断资源是否有变化
Expires: Wed, 26 Jun 2024 07:33:49 GMT // 指定响应的过期时间,之后缓存应该认为该内容已过期并重新请求
Last-Modified: Tue, 28 Jul 2015 12:23:03 GMT // 表示资源最后修改的时间,用于缓存控制和条件请求
Pragma: no-cache // TTP/1.0时代的缓存控制指令,功能类似于Cache-Control中的no-cache,指示不应当被缓存
Server: Apache // 服务器使用的软件名称和版本,这里是Apache Web服务器
Vary: Accept-Encoding,User-Agent // 指出哪些请求头字段影响了响应的生成
(空格)
响应体
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>百度搜索</ShortName>
<Url type="text/html" template="https://www.baidu.com/s?wd={searchTerms}"/>
</OpenSearchDescription>
响应体的内容格式是非常灵活的,常见的响应体格式有:
- HTML
- CSS
- JavaScript
- 图片
- 视频
- JSON