【JavaEE】万字详解HTTP协议
HTTP是什么?-----互联网的“快递小哥”
想象我们正在网上购物:打开淘宝APP,搜索“蓝牙耳机”,点击商品图片,然后下单付款。这一系列操作背后,其实有一个看不见的“快递小哥”在帮我们传递信息,它就是HTTP协议
HTTP诞生于1991年(HTTP/1.0)。目前已经发展为最主流使用的一种应用层协议
HTTP的正式身份
全称:Hyper Text Transfer Protocol(超文本传输协议)
角色:互联网世界的“邮差”,专门负责在浏览器(客户端)和服务器之间传递数据
特点:
·📦只管送快递,不关心快递内容(可以是文字、图片、视频)
·🚗每次送货都要重新叫车(HTTP/1.0特性,后续会升级)--无状态性
·📃用“明信片”写地址(基于文本的协议,人类可读)
对于“每次送货都要重新叫车”----无状态性
原理
HTTP协议遵循“无状态”设计,即服务器不会保留客户端的历史请求信息。每次HTTP请求都是独立的,服务器处理完请求后会立即断开连接(HTTP/1.1 默认使用持久连接,但逻辑上仍是独立的请求-响应周期)
类比解释:
·就像每次送货都需要重新叫一辆车,司机(服务器)不会记住你上次送过什么、送到哪里
·即使你连续下单(发送多个请求),每辆车都是独立的,司机不会主动关联你的历史订单
实际影响:
·优点:简化服务器设计,提高并发处理能力(无需维护客户端状态)
·缺点:需要客户端主动维护状态(如通过Cookie、Session或Token),否则无法实现购物车、登录状态等需要记忆的功能
对 “用“明信片”写地址”----明文传输
原理:
HTTP协议默认以明文形式传输数据,包括请求头、URL、参数和响应内容。数据在传输过程中未加密,任何中间节点(如路由器、代理服务器)都可以直接读取内容
类比解释:
·就像在明信片上写地址和内容,邮递员(中间节点)可以随意阅读我们写的内容
·敏感信息(如密码、信用卡号)会直接暴露在传输路径中
实际影响:
·优点:实现简单,兼容性强,适合对安全性要求不高的场景
·缺点:存在数据泄露和篡改风险(如中间人攻击)
·解决方案:通过HTTPS(HTTP over TLS)加密传输,相当于给明信片加了一个“信封”
无状态性是HTTP轻量级、高并发的基石,但需要配合状态管理机制(如Cookie)使用
明文传输是HTTP早期设计的妥协,现代应用普遍通过HTTPS解决安全问题
HTTP/2和HTTP/3通过多路复用、头部压缩等技术优化了性能,但核心的无状态和明文特性仍需要通过协议层或应用层手段弥补
第一次通信----从输入网址开始
当我们输入 www.taobao.com(URL) 时,后端发生了什么?
1.域名找家
·电脑先问:“谁知道 www.taobao.com 的具体地址?” (DNS查询)
·得到回复:“它在 123.56.78.9 这个IP地址!”
2.建立连接
·浏览器拨打服务器的“电话”(TCP三次握手)
·电话接通后说:“我要HTTP服务”(建立端口连接,HTTP默认为80,HTTPS则是443)
3.发送请求
浏览器递出一张“明信片”:
GET /index.html HTTP/1.1
Host: www.taobao.com
User-Agent:Chrome/123
Cookie: session_id=abc123
4.服务器响应
服务器回寄一个“包裹”:
HTTP/1.1 200 OK
Content-Type: text/htmlContent-Length:12345
<html>...</html>
HTTP报文拆解----明信片与包裹的秘密
这里的明信片与包裹也就对应于 请求和响应
请求报文结构(浏览器-->服务器)
响应报文结构(服务器-->浏览器)
协议格式总结:
图中的请求报头即header。请求正文即body。
思考:为什么HTTP报文中要存在空行?
因为HTTP协议并没有规定报头部分的键值对有多少个。空行就相当于是“报头的结束标记”,或者是“报头和正文之间的分隔符”。
HTTP在传输层依赖TCP协议,TCP是面向字节流的。如果没有这个空行,就会出现“粘包问题”。
关键字段解析
·Host:指定要访问的域名(服务器可能托管多个网站)
·Cookie:携带登录凭证等身份信息
·Content-Type:告诉对方“包裹里是什么”(text/html、image/png等)
·200 OK:成功状态码(400=找不到页面,500=服务器崩溃)
HTTP请求(Request)
认识URL
URL基本格式
平时我们俗称的“网址”其实说的就是URL(Uniform Resource Locator统一资源定位符)
互联网上的每个文件都有一个唯一的URL,它包含指出文件的位置以及浏览器应该怎么处理它
URL的详细规则 由 因特网标准RFC1738约定(RFC 1738 - Uniform Resource Locators (URL))
一个具体的URL:
https://v.bitedu.vip/personInf/student?userId=10000&classId=100
https://sogou.com
可以看到,在这个URL有些信息被省略了
·https:协议方案名。常见的有http和https,也有其他的类型(例如访问mysql时,用的jdbc:mysql)
·user:pass:登录信息。现在的网站进行身份认证一般不再通过URL进行了。一般都会省略
·v.bitedu.vip:服务器地址。此处是一个“域名”,域名会通过DNS系统解析成一个具体的IP地址(通过ping命令可以看到它的真实IP地址,但现在这个域名已不存在了)
·端口号:上面的URL中端口号被省略了。当端口号被省略的时候,浏览器会根据协议类型自动决定使用哪个端口。例如http协议默认使用80端口,https协议默认使用443端口
·/personInf/student:带层次的文件路径
·userId=10000&classId=100:查询字符串(query string)。本质是一个键值对结构。键值对之间使用&分隔。键和值之间使用=分隔
·片段标识:此URL中省略了片段标识。片段标识主要用于页面内跳转(例如Vue官方文档:https://cn.vuejs.org/guide/introduction#%E8%B5%B7%E6%AD%A5, ,通过不同的片段标识跳转到文档的不同章节)
使用ping命令查看域名对应的IP地址
我们这里使用ping命令查看sogou.com的IP地址,因为上面的URL现在已经无法访问了
1.在开始菜单中输入cmd,打开命令提示符
2.在cmd中输入 ping sogou.com,即可看到域名解析的结果
注意:有的电脑上ping命令会报错 【ping不是内部或外部命令,也不是可运行的程序或批处理文件】。这种情况是因为有的Windows10默认没有启用ping命令。百度搜索Windows10启动ping即可
关于query string
query string中的内容是键值对结构。其中的key和value的取值和个数,完全都是程序员自己约定的。我们可以通过这样的方式来自定义传输我们需要的信息给服务器
URL中的可省略部分
·协议名:可以省略,省略后默认为 http://
·ip地址/域名:在HTML中可以省略(比如img、link、script、a标签的src或者href属性)。省略后表示服务器的ip/域名与当前HTML所属的ip/域名一致
·端口号:可以省略。省略后如果是http协议,端口号默认为80;如果是https协议,端口号默认为443
·带层次的文件路径:可以省略。省略后相当于/ 。有些服务器会在发现 / 路径的时候自动访问 /index.html
·查询字符串:可以省略
·片段标识:可以省略
关于URL encode
像 / ? :等这样的字符,已经被url当作特殊意义理解了。因此这些字符不能随意出现
比如,某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义
一个中文字符由UTF-8 或者GBK这样的编码方式构成,虽然在URL中没有特殊含义,但是仍然需要进行转义。否则浏览器可能把UTF-8/GBK编码中的某个字节当作URL中的特殊符号
以“中”为例,其UTF-8编码为E4 B8 AD(16进制表示)。假如有一个URL参数值为param=中,若直接传输,浏览器可能将E4(16进制,对应ASCII中的ä字符的扩展编码)误判为特殊符号
转义规则如下:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
这里仍以“中”为例,讲解具体转义过程:
1.字符编码:将“中”转换为UTF-8字节序列 E4 B8 AD
2.字节转义:对每个字节进行百分比编码:
·E4--->%E4
·B8--->%B8
·AD--->%AD
3.最终URL:https://example.com/api?param=%E4%B8%AD
例如:
"+" 被转义成了“%2B”
URL decode就是 URL encode的逆过程;
认识请求“报头”(header)
header的整体的格式也是“键值对”结构
每个键值对占一行。键和值之间使用分号分割
报头的种类有很多,此处仅介绍几个常用的
Host
表示服务器主机的地址和端口
Content-Length
表示body中的数据长度
Content-Type
表示请求的body中的数据格式
常见选项:
·application/x-www-form-urlencoded:form表单提交的数据格式。
此时body的格式形如:
title=test&content=hello
·multipart/form-data:form 表单提交的数据格式
(在form标签中加上enctyped=“multipart/form-data”。通常用于提交图片/文件)
body格式形如:
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3Trw------WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name="text"title------WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name="file"; filename="chrome.png"Content-Type: image/pngPNG ... content of chrome.png ...------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
·application/json:数据为json格式
body格式形如:
{"username":"123456789","password":"xxxx","code":"jw7l","uuid":"d110a05ccde64b16}
User-Agent(简称UA)
表示浏览器/操作系统的属性。形如:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
其中Windows NT 10.0;Windows;x64 表示操作系统信息
AppleWebKit/537.36(KHTML,like Gecko) Chrome/91.0.4472.77 Safari/537.36表示浏览器信息
User-Agent之所以是这个样子是因为历史遗留问题
Referer
表示这个页面是从哪个页面跳转过来的。形如:
https://v.bitedu.vip/login
如果直接在浏览器中输入URL,或者直接通过收藏夹访问页面时是没有Referer的
Cookie
Cookie中存储了一个字符串,这个数据可能是客户端(网页)自行通过JS写入的,也可能来自于服务器(服务器在HTTP响应的header中通过Set-Cookie字段给浏览器返回数据)
往往可以通过这个字段实现“身份标识”的功能
每个不同的域名下都可以有不同的Cookie,不同网站之间的Cookie并不冲突
可以通过抓包观察页面登录的过程(以码云为例):
(1)清除之前的cookie
为了方便观察,先清除掉之前登录的cookie
在码云页面上,点击url左侧的图标,选择Cookie
然后移除已经存在的Cookie
(2)登录操作
登录请求
POST https://gitee.com/login HTTP/1.1
Host: gitee.com
Connection: keep-alive
Content-Length: 443
Cache-Control: max-age=0
sec-ch-ua: "Chromium";v="136", "Microsoft Edge";v="136", "Not.A/Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Origin: https://gitee.com
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://gitee.com/login?redirect_to_url=%2F
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: oschina_new_user=false; sensorsdata2015jssdkchannel=%7B%22prop%22%3A%7B%22_sa_channel_landing_url%22%3A%22%22%7D%7D; remote_way=http; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221926eaf88bcce0-0c1b29a5f606e2-4c657b58-1638720-1926eaf88bd1632%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218e26ed2fb8532-0eecaf953edbd5-4c657b58-1638720-18e26ed2fb91a1c%22%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThlMjZlZDYzY2Q3YjctMGEzMGU2NWQ2OGZmYTYtNGM2NTdiNTgtMTYzODcyMC0xOGUyNmVkNjNjZTJkMDUiLCIkaWRlbnRpdHlfbG9naW5faWQiOiIxMzk0NTAyNiJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%2213945026%22%7D%7D; close_wechat_tour=true; Hm_lvt_a1170d3ff94c236dacd36a05af8385ea=1731416055; Serve_State=true; user_locale=zh-CN; feature_log_id=10; slide_id=10; BEC=1f1759df3ccd099821dcf0da6feb0357; tz=Etc%2FGMT-8; Hm_lvt_24f17767262929947cc3631f99bfd274=1747364032,1748143973,1748844866,1748911147; HMACCOUNT=B890C2A24C0F45B8; csrf_token=DraTvhupNguUwup0McvlZUaR6iX1zCLfbclKVJ0LKXF4gqxnemUGXU2AbWH5nqpRc1ftbbRCucnHCz7u8DHbbA%3D%3D; user_return_to_0=%2F; Hm_lpvt_24f17767262929947cc3631f99bfd274=1748912576; gitee-session-n=NW9tbFVOT3RtSTRPQndpSGRJWU5helN5czIxWFpsL0xZbFhYc1VrQ2N1UVVLZDZwbnUxR2pkalN3bFRPaTNNRVNyQlFUbzBHVkcrSEZib01QcUtaU3BPU2ZCeVR2ZFcyc2Y2RWltYTRsNE8zS242KzhNRjFKTDhWa0xSNHBzbjE2cFNISm5LdWxNNm9ibWd5a2NxcHczcHlwT2JZajJWdzlpQ1MzY1JyZ1FjY1lOMkR5b2R3UXkyLzJ6MU9sT0o1S3l2UkdVMkxyNmJ4azBHQkJ6bEl2bk1DQ0RsV0tyNVRmR2NRTThUYnA4TzE1c0dXVGRhQmFPNXE0bWYzZDd4eFpvbjF4Sk9scjdGRUFOZ1ZWUmx2YzFWM3IvL2lkcENMcm8zK0VaOGdDWUlWWWN4aHJzKzVXTm44VlFSMGw5NDhNN1ZzMCtBR2s3MTlGYUNvZEdyaFdtaFBRT1hGNlVHZG5TalRHcHVvdnF4MFJLSjJKSVZvYkJ2VnN1WUVmV3ZPendPeDhmMG9qSjhzMGFML1BxODg0OFdkSTVjbkx1ZWpRd2F5S3Q1ckZ1SEtZcStmR2JoZlRzQXcvWmpVdHdQRUZPdmJ0REV0ZzkyTGJCeHl4cjI4RUxOcDFBb0o1UlBha3RrL1p6dEFIYzA1S0xvNXdOVkJNajMrV2JKMlg2NHpvUEIyTzRsVC8yRS9TK1hlZFZmL09WTWp0VzRLSVBRRkNCaEJJSlN3OXZBPS0tblJLUytRajg4c0xYaE9lOE02Z0Zmdz09--eba98756d6f9218e5db63084d593ce442b2ec3c7encrypt_key=password&utf8=%E2%9C%93&authenticity_token=6V02ykhQwlsq9FEuJsGT7sw9wUtjOQmSw1kZt4tJOWifaQkTKZzyDfO21jvulNza%2BfvGAyK3koRpm20N5nPLdQ%3D%3D&redirect_to_url=%2F&user%5Blogin%5D=15190285629&encrypt_data%5Buser%5Bpassword%5D%5D=Txsk%2BWBEnSuprdjdn5UiRqjN0f%2BPR42q%2BFSwqSxxsIsG8urbz8UP1pPMgr59sPDHxVm7UmYWgG57a6rL9FyumM5%2FmEKpPSKxCXAJRr7tujIWQOLn6IssRpaLO7ejSymONJ9P9iE1wpOwwt2dMmXAWXv%2FwGywJF4DedX5knRwYIk%3D&user%5Bremember_me%5D=0
HTTP/1.1 302 Found
Server: ADAS/1.0.206
Date: Tue, 03 Jun 2025 01:03:02 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Expires: Sun, 1 Jan 2000 01:00:00 GMT
Pragma: must-revalidate, no-cache, private
Location: https://gitee.com/
Cache-Control: no-cache
Set-Cookie: oschina_new_user=false; path=/; expires=Sat, 03 Jun 2045 01:03:02 -0000
Set-Cookie: gitee_user=true; path=/
Set-Cookie: gitee-session-n=UmcxUXV6ODQrRk9CQ0VmcnlzZlhmaVYrOFZjWXIycS85SjZHdUIraS9uS1F3K2QwN0FJd1hNeHVEVzFHOWlleGJJQ25CRk9BVzF1MVVyNnpmWVJMb1FydUFCVk4rdlNSbkNzN0pJci9GZFZHVlIyMUFCd29NSDFhNW5NNU81SXpUa2xuMkFqeWt0QXJqdk91SG5IZUhEQXdRTHFWNE5wVm1uNFRvLzZhdEpYTTM0SjFScGpoa3F2R01NMGpITUNmeGJ4NUJaelJra0xtdkhXWDNKb2d3Z1VBWGxYTXUrMnRkRjJ5YU5YNnJBbnZOMGFpUEQxR1A3WVl5R1Vqd2NFUW1LSkV0N2xpNThmYzVkVVF3eHVIUmQvVHFjdHNJbG9waWpLTUFFWFJqTmhjdGJlMU83bVhaYmZJS3lHcGxxUXQySUdabUtESkVXTDVCaXB1ZGNGNTlRTnFnVWhUMUJHbkdjc0xpSmM3eDFNZW5uYmlxQXA3MCtleldrZkNlajJNblBZODVhVmlqNmltTC9PQ1k2TW02YnhwUXA4eG1YclVUa1Q2bnp3MW1wZXZMa3FZTkRENGpuN3c4ZWFxN3RhWnBwMS9ocVNVdUxORUVwdERiTzduR1dxVDJsT2p2Z053Nk42Q0tSUlBhSSsrcGMxLzJRWjBEUkIzeGRqWS96U3FkelFlSzcwMCtZYWhCdTJRZWU3bnNISzkyd0Z6dzAreW11bndFWFZNZnFPd0ZwNFdsYWI5Y3A5cnN2SjR2dWVDRm96ZU5Qc3FnM3c4VjYwaTZRNUoyWXh2U1VDeFpkZi9QOStrUXRuMWFva0dES3BMK1BML3pVK1BhTWFzUjVpSkt6WTdUYkpuK3p4S3pQK2RsenlXSUJMQWJzZUdMTTU2OVBkdldJc3FRQTA9LS1YQUw3ZGt3YmlKYXc5UFJWNVlud2x3PT0%3D--6ea207cccffaa889c6e93d9cec5bf61dbf722c34; domain=.gitee.com; path=/; HttpOnly
X-Request-Id: 8c28cad688796b8333bcb6fee89a3bcd
X-Runtime: 0.135393
Vary: Origin
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self' https://*.gitee.com<html><body>You are being <a href="https://gitee.com/li-fei-fei-ya">redirected</a>.</body></html>
可以看到,响应中包含了3个Set-Cookie属性
其中我们重点关注第四个。里面包含了一个【gitee-session-n】这样的属性,属性值是一串很长的加密之后的信息。这个信息就是用户当前登录的身份标识。也称为“令牌(token)”。
(3)访问其他页面
登录成功之后,此时我们可以看到后续访问码云的其他页面(比如个人主页),请求中就都会带着刚才获取到的Cookie信息
以访问个人主页为例
访问请求
GET https://gitee.com/li-fei-fei-ya HTTP/1.1
Host: gitee.com
Connection: keep-alive
sec-ch-ua: "Chromium";v="136", "Microsoft Edge";v="136", "Not.A/Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://gitee.com/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: oschina_new_user=false; sensorsdata2015jssdkchannel=%7B%22prop%22%3A%7B%22_sa_channel_landing_url%22%3A%22%22%7D%7D; remote_way=http; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221926eaf88bcce0-0c1b29a5f606e2-4c657b58-1638720-1926eaf88bd1632%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218e26ed2fb8532-0eecaf953edbd5-4c657b58-1638720-18e26ed2fb91a1c%22%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThlMjZlZDYzY2Q3YjctMGEzMGU2NWQ2OGZmYTYtNGM2NTdiNTgtMTYzODcyMC0xOGUyNmVkNjNjZTJkMDUiLCIkaWRlbnRpdHlfbG9naW5faWQiOiIxMzk0NTAyNiJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%2213945026%22%7D%7D; close_wechat_tour=true; Hm_lvt_a1170d3ff94c236dacd36a05af8385ea=1731416055; Serve_State=true; user_locale=zh-CN; feature_log_id=10; slide_id=10; BEC=1f1759df3ccd099821dcf0da6feb0357; tz=Etc%2FGMT-8; Hm_lvt_24f17767262929947cc3631f99bfd274=1747364032,1748143973,1748844866,1748911147; HMACCOUNT=B890C2A24C0F45B8; user_return_to_0=%2F; Hm_lpvt_24f17767262929947cc3631f99bfd274=1748912576; gitee_user=true; csrf_token=hPHSPJRm%2FJyv6%2BvNzg60PqaN0CjtV6TVc4%2Btey2b%2FY9tV%2F0%2F8VJ51vKaFojX3DUPqQIsUi4uBmp7MEsH2CMOng%3D%3D; gitee-session-n=UENkeTRqMmI5UHcxYmQ5SGNTQjJiUm84ZkJvTjZvQ1FpeGxyUWVGNmlTRGRhZ3Jvd0F3OUdtQWp0SVRId1pCa3U2b0ZRa3JqdlNuNHBxK2Mwc2JyTlJLVnA1elF4ZUpnNmJmbU9NTmtxdU5HeUlKejRWZ3VLZVJmNUdmTmJURk5Wb1BhZWJzU29ZK0QvV3d5VHBuNkJQVXJVYVdnZXdWTW8yL0pSeG9zUENhU3JaSFZjRTk0OFFTbTI5Y2ZYTlh2OFdyTHpWemx6dU42REsyTEVxSkFKMHAyWFNWZHFBakUwUTNjK3AvM3FOUUdLVDFjMWVpY0JCK09abEtHYlo1R1c0QWE0UUxpRkxLSWpwMnBLZ3FsRWNaL1pCY3JhK3A0QkloNlhLR3dzZDI1a1dZbURjTFVTNS9RdURXOUFwUnNGNFlhLzNRRUJmRENQVlRkM1BBZzA3aXQ2TnZHN1o0R01yd0d1U0pKNnkzaldlbXNYRi90VkRWSWZsVGcxZkhNcXUzQm91TEFSdjQ1VlhGWDdHVkVUUWF3L2EwSkpIMFRuVzJDZnhxUHorKzUxY1dINUxOQjd1dkRiOXBJeGMyd3p6RFRLbHl1eHZuNjNuYnhJVFdDbU44aVNucmhwSHZYSWgyVGw0ZTJQdGl3TXBGU3JZRCtWSHNzOWJMZ0Z0eWRUSDd2aWFLc0FHaHVWV1R4R2l1VGhsYzJzdDVERklVVWVGNUdSWHBYQmxtL3VlTXo4bUgraENPdlRMUjJTQ0V2Y3FtUE9iRkNVaDVFTmFhZU5KaFhQTXJaWmlhcXRjd3hkVDBLQzdsMmhNMGQ5cFcwMEFTMm1OZEtFdHJETnJxandIcFRLQmQ5T211K290NTYxekF6a0h3VHcwZGNhVDNvZ292eG5RTGRLYi9TTVJ6U2VNSjhqMkVuaFMvcUl5Y3hUb0dGQk9rQ2xxZnBCUnJ0QVFaOElNdHFrcUh4aXpSSmk2YnUxbnkxYlMxRFg4bnpJZnZLZmVRUmZNS0I1TVNoLS1SK3NLSVk0NElzTGlnTHcyaGgyZDdnPT0%3D--904249a6b31e332f76bb2da6cbcfedbf8c7c85c7
请求中的Cookie字段也包含了一个gitee-session-n属性,里面的值和刚才服务器返回的值相同。后续只要访问gitee这个网站,就会一直带着这个令牌,直到令牌过期/下次重新登录
理解登录过程
这个过程和去医院看病很相似
1.到了医院先挂号。挂号的时候需要提供身份证,同时得到了一张“就诊卡”。这个就诊卡就相当于患者的“令牌”
2.后续去各个科室进行检查,诊断,开药等操作,就不必再出示身份证了,只要凭就诊卡即可识别出当前患者的身份
3.看完病了之后,不想要就诊卡了,就可以注销这个卡。此时患者的身份和就诊卡的关联就销毁了。(类似于网站的注销操作)
4.如果你再来看病,可以办一张新的就诊卡,此时就得到了一个新的“令牌”
认识请求“正文”(body)
正文中的内容格式和header中的Content-Type密切相关。上面也罗列了三种常见的情况
下面我们仍然通过抓包来观察这几种情况
(1)application/x-www-form-urlencoded
抓取码云上传头像请求
POST https://gitee.com/profile/update_portrait HTTP/1.1
Host: gitee.com
Connection: keep-alive
Content-Length: 19
sec-ch-ua-platform: "Windows"
X-CSRF-Token: nIR+Rh/Za2uCOtjxiyVaexQT92YUUlquYso9STucigpc5igmzyH3L3IBrMctBe/LIaSdgu9hdGI3Ih1UkMDdWw==
sec-ch-ua: "Chromium";v="136", "Microsoft Edge";v="136", "Not.A/Brand";v="99"
sec-ch-ua-mobile: ?0
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: https://gitee.com
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://gitee.com/li-fei-fei-ya
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: oschina_new_user=false; sensorsdata2015jssdkchannel=%7B%22prop%22%3A%7B%22_sa_channel_landing_url%22%3A%22%22%7D%7D; remote_way=http; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221926eaf88bcce0-0c1b29a5f606e2-4c657b58-1638720-1926eaf88bd1632%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218e26ed2fb8532-0eecaf953edbd5-4c657b58-1638720-18e26ed2fb91a1c%22%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThlMjZlZDYzY2Q3YjctMGEzMGU2NWQ2OGZmYTYtNGM2NTdiNTgtMTYzODcyMC0xOGUyNmVkNjNjZTJkMDUiLCIkaWRlbnRpdHlfbG9naW5faWQiOiIxMzk0NTAyNiJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%2213945026%22%7D%7D; close_wechat_tour=true; Hm_lvt_a1170d3ff94c236dacd36a05af8385ea=1731416055; Serve_State=true; user_locale=zh-CN; feature_log_id=10; slide_id=10; BEC=1f1759df3ccd099821dcf0da6feb0357; tz=Etc%2FGMT-8; Hm_lvt_24f17767262929947cc3631f99bfd274=1748143973,1748844866,1748911147,1749101607; HMACCOUNT=B890C2A24C0F45B8; user_return_to_0=%2Fli-fei-fei-ya; gitee_user=true; Hm_lpvt_24f17767262929947cc3631f99bfd274=1749101612; gitee-session-n=SURGZExOUDZ4MUl0cDNBWnZMN09GbzJFL2lGdkJHeDh3Nk1FeVYxaC9SWkVVdmRVMFByUXlxRWhRbDE5NkFhQjJ5bDNocnpiOFVIZEVWT3IycXplYW5paHdPVFhCZy9tWDZyS281d21ib2l6SDY3SkMyUHhyeVBRODc3VVVpazFITVFiRmxLZE51U05JOGIxZHJaZ3hMOEZuS2dFZysvVlJySkN1M1hhNFZ2L0hsOHM0WXVEVnlHd1FNNWd5UkZ3Z2NzVFNrUUNUU21mTG1qdFdacE83UHFXV0d3MCtNYXYzSzgyN1lEVmQyalZDRXJ0OVI5MkUrWTFIK1hnSk9xQ0U2M2JwdlJpTlZ0MHVLMmZPQW1qUzUwdWpKMFZFV1JlYjZFQzI4djd4VjJDRDNjQW5qWG5LQVhHMzNiYTY3YmdLWXF4QVBJRXJXdWZneG5NNGNIRURqUjA1RFlZQi9Ycy9XbXVoQ2pjREpXdUphNTlyR3dkckJnOVNCL1RqZUxNditUYUpjWjBuenQ1bERsdnJQeGg4aCtHakFzZmc1aVI1UFRmUEVpMmVYdVFtU3VtSzlhRjZZVVVvdzBzRS9VZTYyNzh5T2wxei80N1h2ZCtZNjdRZnREQXg3N3ZubDhMM1VtKytucTJSL3AzZFY1c0Z6aFYwSSs3RHp1RW0yQ2trV3RuVGFOa3lsVC9jZkRudHl3MUNkS2F6V1VzSjRocXYzdHZqRWR0bXllVHNzczJjc01od05kS2x5MHk4THdoOXdxdGV6aThndjd6N2R2U3BsNGhKUXFZb01PV200UGMxU09lZEYrRGRJYlMyelVrU2pSUEx5T2dPVUdYNzdGcS0tU3lQbEZSMVhPRFNGbnB4cENBZ2l4dz09--7ef728b7af6ebeb5414a991fe23add5a8d1fc218avatar=&widget_id=0
在这里,我只是点击了更换头像以及确认键,并没有用新的图片,所以我们的body部分并没有太长的代码。
(2)multipart/form-data
我们这里直接使用Postman来发送POST请求,然后使用Fiddler抓包
POST http://httpbin.org/post HTTP/1.1
User-Agent: PostmanRuntime/7.29.0
Accept: */*
Postman-Token: 5ade8970-ca82-4de8-a218-2226818120b6
Host: httpbin.org
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: multipart/form-data; boundary=--------------------------826003336661820767705575
Content-Length: 271----------------------------826003336661820767705575
Content-Disposition: form-data; name="name"zhangsan
----------------------------826003336661820767705575
Content-Disposition: form-data; name="age"20
----------------------------826003336661820767705575--
(3)application/json
我们这里仍然使用Postman来发送Post请求,然后使用Fiddler抓包
POST http://httpbin.org/post HTTP/1.1
Content-Type: text/plain
User-Agent: PostmanRuntime/7.29.0
Accept: */*
Postman-Token: 0fe406c6-10e9-452b-a652-36c161f117a1
Host: httpbin.org
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 74{"name": "Alice","age": 30,"hobbies": ["reading", "coding"]
}
HTTP方法大全----指挥服务器的“动词”
想象我们正在操作一台自动售货机:
1.GET方法
GET是最常用的HTTP方法。常用于获取服务器上的某个资源
在浏览器中直接输入URL,此时浏览器就会发送出一个GET请求
另外,HTML中的link,img,script等标签,也会触发GET请求
使用Fiddler观察GET请求
打开Fiddler,访问搜狗主页,观察抓包结果
我们看到一条蓝色的请求:
是通过浏览器地址发送的GET请求
下面的和sogou域名相关的请求,有些是通过html中的link/script/img标签产生的,例如:
有些是通过ajax的方式产生的,例如:
我们先不看其他请求,这里只关注第一条请求
观察请求的详细结果:
-
GET https://www.sogou.com/ HTTP/1.1 Host: www.sogou.com Connection: keep-alive sec-ch-ua: "Chromium";v="136", "Microsoft Edge";v="136", "Not.A/Brand";v="99" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "Windows" Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Sec-Fetch-Site: none Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Accept-Encoding: gzip, deflate, br, zstd Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 Cookie: IPLOC=CN3200; SUID=116F41DFDBA6A20B0000000067FA4141; cuid=AAFq2SzgUgAAAAuipcBo/wEANgg=; SUV=1744453954186403; ssuid=5412877790
-
GET请求的特点
·首行的第一部分为GET
·URL的query string可以为空,也可以不为空
·header部分有若干个键值对结构
·body部分为空
关于GET请求的URL长度问题
网上有些资料上描述:GET请求长度最多为1024kb 这样的说法是错误的
HTTP协议由 RFC 2616标准定义,标准原文中明确说明:“Hypertext Transfer Protocol--HTTP/1.1” does not specify any requirement for URL length
没有对URL的长度有任何的限制
实际URL的长度取决于浏览器的实现和HTTP服务器端的实现。在浏览器端,不同的浏览器最大长度是不同的,但是现代浏览器支持的长度一般都很长;在服务器端,一般这个长度是可以配置的
2.POST方法
POST方法也是一种常见的方法。多用于提交用户输入的数据给服务器(例如登录页面)
通过HTML的form标签可以构造POST请求,或者使用JavaScript的ajax也可以构造POST请求
使用Fiddler观察POST方法
我们在Fiddler找一个POST请求即可。
POST https://eva2.csdn.net/v3/06981375190026432f77c01bfca33e32/lts/groups/dadde766-b087-42da-8e67-d2499a520ee7/streams/a0119567-bf91-4314-ab75-f683ba6c0c0a/logs HTTP/1.1
Host: eva2.csdn.net
Connection: keep-alive
Content-Length: 1646
sec-ch-ua-platform: "Windows"
sec-ch-ua: "Chromium";v="136", "Microsoft Edge";v="136", "Not.A/Brand";v="99"
sec-ch-ua-mobile: ?0
X-Sdk-date: 20250602T052611Z
Lts-Sdk-Request-Id: 86830fbdf0b94fb2ab9ce00a0e261e85
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0
Content-Type: application/json
Lts-Sdk-Version: 1.0.15
Accept: */*
Origin: https://mpbeta.csdn.net
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://mpbeta.csdn.net/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6{"labels":{},"logs":[{"contents":[{"pid":"mpbeta","ref":"https://blog.csdn.net/","curl":"https://mpbeta.csdn.net/mp_blog/creation/editor/146565053","spm":"1011.2124","disabled":"true","extra":"{\"version\":\"new\",\"x\":1217,\"y\":1068,\"ev\":\"click\"}","tos":4,"adb":0,"cCookie":"c_ins_fpage=/index.html;c_ins_um=-;c_ins_fref=https://mpbeta.csdn.net/;c_dl_fref=https://so.csdn.net/so/search;c_dl_prid=1743670559756_343208;c_dl_rid=1743670567725_971319;c_dl_fpage=/download/weixin_38529486/12723434;c_dl_um=distribute.pc_search_result.none-task-download-2%7Edownload%7Efirst_rank_ecpm_v1%7Erank_v31_ecpm-8-10244372-null-null.269%5Ev2%5Econtrol;c_ins_prid=1741171564477_126459;c_ins_rid=1745045678116_123518;c_ab_test=1;c_session_id=10_1748836953635.222201;c_first_ref=default;c_first_page=https%3A//blog.csdn.net/L2770789195%3Fspm%3D1011.2415.3001.5343;c_segment=3;c_sid=dad4a36dda05059a1c911baefe626a29;c_dsid=11_1748841773714.968759;c_pref=https%3A//blog.csdn.net/;c_ref=https%3A//mpbeta.csdn.net/;c_page_id=default;","t":1748841972,"screen":"1707*960","urn":"1748841957813-a5c052dd-d4cd-4a36-b6dc-e8302e6152c5","vType":"U010000","log_id":"28","sign":"a8d04da7d4e76569e758ca7876f5d4c4","hca":"B890C2A24C0F45B8","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0","cid":"10_37456074410-1748590554826-694355","uid":"L2770789195","sid":"10_1748836953635.222201","dc_sid":"dad4a36dda05059a1c911baefe626a29","did":"10_37456074410-1748590554826-694355","utm":"","un":"L2770789195","fid":"20_84873765569-1723344676253-805925","__client_time__":1748841971695}]}]}
POST请求的特点
·首行的第一部分为POST
·URL的query string一般为空(也可以不为空)
·header部分有若干个键值对结构
·body部分一般不为空。body内的数据格式通过header中的Content-Type指定。body的长度由header中的Content-Length指定
经典面试题:谈谈GET和POST的区别
·语义不同:GET一般用于获取数据,POST一般用于提交数据
·GET的body一般为空,需要传递的数据通过query string传递,POST的query string一般为空,需要传递的数据通过body传递
·GET请求一般是幂等的,POST请求一般是不幂等的。(如果多次请求得到的结果一样,就视为请求是幂等的)
·GET可以被缓存,POST不能被缓存(这一点也是承接幂等性)
补充说明:
·关于语义:GET完全可以用于提交数据,POST也完全可以用于获取数据·关于幂等性:标准建议GET实现为幂等的。实际开发中GET也不必完全遵守这个规则(主流网站都有“猜你喜欢”功能,会根据用户的历史行为实时更新现有的结果)
·关于安全性:有些资料上说“POST比GET更安全”。这样的说法是不科学的。是否安全取决于前端在传输密码等敏感信息时是否进行加密,和GET、POST无关
·关于传输数据量:有的资料上说“GET传输的数据量小,POST传输的数据量大”。这个也是不科学的,标准没有规定GET的URL长度,也没有规定POST的body长度。传输数据量多少,完全取决于不同浏览器和不同服务器之间的实现区别
·关于传输数据类型:有的资料上说“GET只能传输文本数据,POST可以传输二进制数据”。这个也是不科学的。GET的query string虽然无法直接传输二进制数据,但是可以针对二进制数据进行URL encode
3.其他方法
·PUT与POST相似,只是具有幂等特性,一般用于更新
·DELETE删除服务器指定资源
·OPTIONS返回服务器所支持的请求方法
·HEAD类似于GET,只不过响应体不返回,只返回响应头
·TRACE回显服务器端收到的请求,测试的时候会用到这个
·CONNECT预留,暂无使用
这些方法的HTTP请求可以使用ajax来构造。(也可以通过一些第三方工具)
任何一个能进行网络编程的语言都可以构造HTTP请求。本质上就是通过TCP socket写入一个符合HTTP协议规则的字符串
安全方法vs危险方法
·🔒 安全方法(GET/HEAD):只读操作,不会修稿服务器数据
· ⚠ 危险方法(POST/PUT/DELETE):会修改操作,需要权限验证
状态码解密----服务器的“表情包”
当服务器收到请求,会用三位数字状态码回应(响应):
·1xx信息类(很少见)
101 Switching Protocols:我要切换到WebSocket模式啦!
·2xx成功类
200 OK:正常响应(抓包抓到的大部分结果都是200)
例如:访问搜狗网页
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 05 Jun 2025 06:05:21 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: SNUID=F48AA43AE6E3D02903F38926E6500ACD; expires=Fri, 05-Jun-26 06:05:21 GMT; domain=.sogou.com; path=/
Pragma: No-cache
Cache-Control: max-age=0
Expires: Thu, 05 Jun 2025 06:05:21 GMT
UUID: 8908e247-c937-4fe4-81b0-bd45370d6ebb
Content-Length: 15859<!DOCTYPE html><html lang="cn"><head> <meta name="baidu_union_verify" content="efd6e8ce094119528f66c2d380f6ec94">
<meta name='360_ssp_verify' content='651669fb99b77a4e4efae7ec25d6796a' /> <meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=no"><script>window._speedMark = new Date();
window.lead_ip = '223.65.111.17';
我们可以看到上述的Content-Length的Value值是15859,可以知道在下面的body中的字符个数。所以,我们上述的body代码只截取了一小部分
注意:在抓包观察响应数据的时候,可能会看到压缩之后的数据,形如:
网络传输中”带宽“是一个稀缺资源,为了传输效率更高往往会对数据进行压缩
点击Fiddler中的
即可进行解压缩,看到原始的内容
201 Created:资源创建成功(比如注册新用户)
·3xx重定向类
302 Found:临时串门(比如登录后跳转)
临时重定向
理解”重定向“
就相当于手机号码中的“呼叫转移”功能
比如我本来的手机号是111-1111-1111,后来换了个新号码123-4567-8888,那么不需要让我的朋友知道新号码,只需要我去办理一个呼叫转移业务,其他人拨打111-1111-1111,就会自动转移到123-4567-8888上
在登录页面中经常会见到302.用于实现登录成功后自动跳转到页面
响应报文的header部分会包含一个Location字段,表示要跳转到哪个页面
例如:码云的登录页面 https://gitee.com/login
抓包看到的响应结果为:
HTTP/1.1 302 Found
Server: ADAS/1.0.210
Date: Thu, 05 Jun 2025 10:15:49 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Expires: Sun, 1 Jan 2000 01:00:00 GMT
Pragma: must-revalidate, no-cache, private
Location: https://gitee.com/
Cache-Control: no-cache
Set-Cookie: oschina_new_user=false; path=/; expires=Mon, 05 Jun 2045 10:15:49 -0000
Set-Cookie: gitee_user=true; path=/
Set-Cookie: gitee-session-n=OUUwUExEMVNXYlFFajdVekdseUVvUjZXcFRrd3gyQVRLbzl3Q2pXMFl5TE0yNERKMEFSSWIwN3lpZVkzN1ZDNmdEOGgwcGtKUjJJR3FFYjdMVEkvM3NOM2Z1L0JZSG9tN2tJTXlqc3RTYUNKQlMzSXRjYTFrUy93R0ZTbERGVmQzTzYvc2xIVnlLRUNrSUNOc3lBUXVGblp2MGNEVWx6QWh1aVdQV1p4dURXcHM0U2pyZjdsRVFYNjAxanA5MS9sbmhJbzV6OVlXTS9pNHd5d3RsN1FnbzQ2bW1Tb2c0UHJXWEszQklmYiswaUxMeDdzN1FrNnFkS2Y2ZGZoTGtlYjZCUk9uSVhPZWRMZVJDK203MWRhZ3oxdVZqTUdSOFh5T0RYek9xa0VxTThnTGdBbEtHYkF1Yi8yOGc0dVAxMkhmZ08walpLN0c1NUZCcjhhNVhtcUJoYVc3VGR3WXE4d2t6RkNTejBET09DUU5yQ1grMExHM2FBcHVxQXZPNUZSTFkwSCtocENrR2Q3USt2RUt6U2ltZEUrMmlac3BDSEJDbzhhVi9EU3UveDA2RkZRWTR0eXpHam5LaW9qZlNhdzJWUTd1RHRMZitOTGNqNGRNWVJ1ZVZoZHFTSU9kUDJIVkF5bGVQRnhBbnZiTm9PdE05U1VxZGJ2Qkk2amV4Wm9tUXFHdU0xNkdaM2JWREdLNEVvOTY2THpKTmFYdDZlTlpFMWdOSk1XYm04PS0tTzdyTDJvd2RTc3MzeHVkcGpBZTdqdz09--92d62f53b11a0e8e2c5c0d25476e68791f8162e3; domain=.gitee.com; path=/; HttpOnly
X-Request-Id: b118031386d3a17aa5d6c4f5d45d43ff
X-Runtime: 0.127780
Vary: Origin
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self' https://*.gitee.com
Content-Length: 84<html><body>You are being <a href="https://gitee.com/">redirected</a>.</body></html>
可以看到header中的Location:https://gitee.com/ ,接下来浏览器就会自动发送GET请求,获取
https://gitee.com/
301 Moved Permanently:永久搬家(旧网址已失效)
永久重定向。当浏览器收到这种响应时,后续的请求都会被自动改成新的地址
301也是通过Location字段来表示要重定向到的新地址
·4xx客户端错误类
404 Not Found:您要的东西不存在
浏览器输入一个URL,目的就是为了访问对方服务器上的一个资源。如果这个URL标识的资源不存在,那么就会出现404
例如,在浏览器中输入 www.sogou.com/index.html,此时就在尝试访问sogou上的/index.html这个资源
如果输入正确,则可以正确访问到。但是如果输入错误,比如输入为:www.sogou.com/index2.html,此时就会看到404这样的响应
HTTP/1.1 404 Not Found
Server: nginx
Date: Thu, 05 Jun 2025 06:13:11 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
Content-Length: 564<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
403 Forbidden:有权限才能看(比如后台管理页面)
表示访问被拒绝。有的页面通常需要用户具有一定的权限才能访问(比如登陆后才能访问)。如果用户没有登录便直接访问,就容易见到403
例如:查看码云的私有仓库,如果不登录,就会出现403.
参考链接:https://gitee.com/li-fei-fei-ya/backend
HTTP/1.1 403 Forbidden
Server: ADAS/1.0.210
Date: Thu, 05 Jun 2025 06:17:03 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Expires: Sun, 1 Jan 2000 01:00:00 GMT
Pragma: must-revalidate, no-cache, private
Cache-Control: no-cache
Set-Cookie: oschina_new_user=false; path=/; expires=Mon, 05 Jun 2045 06:17:03 -0000
Set-Cookie: gitee-session-n=U3J5c1ZycTdRZ3kyQ2UyU3c4a2JjTDlNSFh4S29zdEZMWVNTekdIZktBcENTd3gzTGNLYXNMWVd4THVFV0FWaHY1TDBOSnNjSmRCZEllSjkwaE9PSDEzTktUTGc1ZG1tNHZuNXlVK2NJSGFnajNHRVRjc3B3SzVkV1VmWFdjRzI4UkNPcmdIMkw4UE96Um9MVVk2K0E4NDZ0T0lGekVTcmVQbUx5azJ2TldVZ0JpQVJuZlFobmt4aVQyZHhvZDF2U2R1eGs0TTdVNUtVUDhpczA4eDZpZkl2STBHMTd3U2NhSy8xZXBPWDRhZ3FVMTBJdlpFdEhJei9TaVRkTEptYjV4RU53RmtKTEp5K0g5emFqcXpIb2pkRkRUcThIRUVybENVOHVRUGY4KzQ9LS1KK0NRRGtvaVZnbmNTWThiYnNjQi93PT0%3D--27223824158b20208707b34de5911c9c42894fec; domain=.gitee.com; path=/; HttpOnly
X-Request-Id: 8bc9d2267b75f6285c4d5bb8b801b484
X-Runtime: 0.130412
Vary: Origin
X-Frame-Options: SAMEORIGIN
Content-Length: 7327<!DOCTYPE html>
<html>
405 方法不被允许
前面我们已经学习了HTTP中所支持的方法,有GET,POST,PUT,DELETE等
但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法)
举个例子,我们发送请求使用的是POST方法,但是对方浏览器部署的接口仅支持GET方法,这时它便无法处理我们的POST请求,会返回405
·5xx服务器错误类
500 Internal Server Error:服务器抽风了
服务器出现内部错误。一般是服务器的代码在执行过程中遇到了一些特殊情况(服务器异常崩溃)。这时才会产生500这个状态码。一般来说,我们使用的网站很少会出现500
·504 服务器超时
当服务器负载比较大的时候,服务器处理单条请求的时候消耗的时间就会很长,就可能会导致出现超时的情况
这种情况在双十一等”秒杀“场景中容易出现,平时不太容易见到。
502 Bad Gateway:服务器之间通信故障
趣味记忆法
·404:像走错房间的尴尬
·502:像外卖超时还没送到
状态码小结
HTTP响应(Response)
认识响应“报头”(header)
响应报头的基本格式和请求报头的格式基本一致
类似于【Content-Type】,【Content-Type】等属性的含义也和请求中的含义一致
Content-Type
响应中的Content-Type常见取值有以下几种:
text/html:body数据格式是HTML
text/css:body数据格式是CSS
application/javascript:body数据格式是JavaScript
application/json:body数据格式是JSON
认识响应“正文”(body)
正文的具体格式取决于Content-Type。观察下面几个抓包结果中的响应部分
(1)text/html
HTTP/1.1 200 OK
Server: ADAS/1.0.210
Date: Thu, 05 Jun 2025 10:15:50 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self' https://*.gitee.com
Content-Length: 113893<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta name="baidu-site-verification" content="codeva-2B8VybDkea"/><title>工作台 - Gitee.com</title><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"/><meta name="keywords" content="Gitee,码云,代码托管,Git,DevOps,Git@OSC,Gitee.com,开源,内源,项目管理,版本控制,开源代码,代码分享,项目协作,开源项目托管,免费代码托管,Git代码托管,Git托管服务"/><meta name="description" content="Gitee.com(码云) 是 OSCHINA.NET 推出的代码托管平台,支持 Git 和 SVN,提供免费的私有仓库托管。目前已有超过 1350 万的开发者选择 Gitee。"/><meta name="applicable-device" content="pc,mobile"/><meta name="referrer" content="always"/><meta content="工作台 - Gitee.com" itemProp="name" property="og:title"/><meta content="Object" property="og:type"/><meta content="/" property="og:url"/><meta content="Gitee" property="og:site_name"/><meta content="Gitee.com(码云) 是 OSCHINA.NET 推出的代码托管平台,支持 Git 和 SVN,提供免费的私有仓库托管。目前已有超过 1350 万的开发者选择 Gitee。" property="og:description"/><meta content="/static/images/logo.svg" itemProp="image" property="og:image"/><link rel="shortcut icon" href="/favicon.ico"/><link rel="preconnect" href="https://e-assets.gitee.com"/><link rel="preconnect" href="https://portrait.gitee.com"/><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><meta name="browsermode" content="application"/><meta name="x5-page-mode" content="app"/><style id="disable-transition">*, *::before, *::after {transition: none!important;}</style><meta name="next-head-count" content="23"/><link rel="preload" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/481f764af5ff3988.css" as="style"/><link rel="stylesheet" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/481f764af5ff3988.css" data-n-g=""/><link rel="preload" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/9d3cd056a91cf22e.css" as="style"/><link rel="stylesheet" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/9d3cd056a91cf22e.css" data-n-p=""/><link rel="preload" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/e1c165965a2d94c4.css" as="style"/><link rel="stylesheet" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/e1c165965a2d94c4.css" data-n-p=""/><link rel="preload" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/152cec2a259e3537.css" as="style"/><link rel="stylesheet" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/152cec2a259e3537.css" data-n-p=""/><link rel="preload" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/89e25959bd615771.css" as="style"/><link rel="stylesheet" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/89e25959bd615771.css" data-n-p=""/><link rel="preload" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/48b904ec9ea14129.css" as="style"/><link rel="stylesheet" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/48b904ec9ea14129.css" data-n-p=""/><link rel="preload" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/b63b0793b97a08cd.css" as="style"/><link rel="stylesheet" href="https://e-assets.gitee.com/gitee-community-web/_next/static/css/b63b0793b97a08cd.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/webpack-99d5700719834e48.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/framework-4ed89e9640adfb9e.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/main-9236fa288a868402.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/pages/_app-e34632f3779603f8.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/4962-252f314c97357eb2.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/6489-9cd50c6b89e305a8.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/3442-afc6f8a30f2d662f.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/5998-359cb943ada0f363.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/1983-d6f6fef17d6de8aa.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/2532-86324c8e87a8f02d.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/9916-ee16b5cd352283cd.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/2612-72e44f0d56bbdc9e.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/4027-f623f25f7ed473e8.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/8612-5980d446547e5b3c.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/5957-1188033211100f15.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/5879-73f480dff36254ed.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/1680-94194b2076dfed7c.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/2791-1622671269925e9d.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/6443-9cf079c3b1d440bb.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/2147-6a8d53879d8015b2.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/4721-3d76cb98a21d58bc.js" defer=""></script><script src="https://e-assets.gitee.com/gitee-community-web/_next/static/chunks/8170-9d817e19f446d755.js" defer=""></script><script
。。。。
。。。。
。。。。
(2)text/css
HTTP/1.1 200 OK
Cache-Control: public, max-age=432000, no-transform, immutable
Content-Length: 6390
Content-Type: text/css
Content-MD5: ywFRW6rEYeOSQBh31Yzzdg==
Last-Modified: Tue, 22 Apr 2025 18:12:36 GMT
ETag: 0x8DD81C942BD541B
X-Cache: TCP_HIT
x-ms-request-id: 1611cae6-c01e-0096-4d43-d367fa000000
x-ms-version: 2009-09-19
x-ms-lease-status: unlocked
x-ms-blob-type: BlockBlob
Access-Control-Allow-Origin: *
Accept-CH: Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version
X-Azure-Ref-OriginShield: Ref A: 3C00DB50D1E14E328F20FF67353A3091 Ref B: SG2EDGE2411 Ref C: 2025-06-03T02:31:38Z
timing-allow-origin: *
cross-origin-resource-policy: cross-origin
nel: {"report_to":"network-errors","max_age":604800,"success_fraction":0.001,"failure_fraction":1.0}
report-to: {"group":"network-errors","max_age":604800,"endpoints":[{"url":"https://aefd.nelreports.net/api/report?cat=bingaot"}]}
X-MSEdge-Ref: Ref A: 5B60D6A1B940447683D062A5927326B2 Ref B: BJ1EDGE0706 Ref C: 2025-06-05T10:30:22Z
Date: Thu, 05 Jun 2025 10:30:21 GMT.overlayView{width:100%;height:100%;position:absolute;top:0;left:0;touch-action:none}.cropRect,.cropRect .left,.cropRect .right,.cropRect .top,.cropRect .bottom,.cropRect .leftTop,.cropRect .rightTop,.cropRect .leftBottom,.cropRect .rightBottom{position:absolute;z-index:1}.cropRect .leftTop{border-top-left-radius:6px}.cropRect .rightTop{border-top-right-radi
。。。
(3)application/javascript
HTTP/1.1 200 OK
Server: nginx/1.17.3
Date: Thu, 10 Jun 2021 07:25:09 GMT
Content-Type: application/javascript; charset=utf-8
Last-Modified: Thu, 13 May 2021 09:01:26 GMT
Connection: keep-alive
ETag: W/"609ceae6-427d4"
Content-Length: 272340(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["app"],{0:function(t,11
......
(4)application/json
HTTP/1.1 200 OK
Content-Length: 9
Content-Type: application/json
Server: Microsoft-HTTPAPI/2.0
Strict-Transport-Security: max-age=31536000
time-delta-millis: 3290
Access-Control-Allow-Headers: time-delta-millis
Access-Control-Allow-Methods: POST
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: time-delta-millis
Date: Thu, 05 Jun 2025 10:27:49 GMT{"acc":2}
HTTP进化史----从“慢递”到“闪送”
HTTP/0.9(1991)
·只能发GET请求
·没有Header,没有状态码
·响应内容只能是HTML
HTTP/1.0(1996)
·增加Header和状态码
·支持多种文件类型(图片/视频)
·每次请求都要新建连接(效率低)
HTTP/1.1(1997)
·持久连接(Connection:keep-alive)
·管道化请求(可连续发送多个请求)
·新增PUT/DELETE等方法
·虚拟主机支持(一个服务器托管多个网站)
HTTP/2(2015)
·二进制分帧(把数据切成小块传输)
·多路复用(同时发送多个请求)
·头部压缩(减少传输体积)
·服务器推送(主动给客户端发资源)
HTTP/3(2020)
·基于QUIC协议(用UDP替代TCP)
·更快建立连接(0-RTT握手)
·天然支持多路复用
·更好的移动网络适应性
实战演练---用Fiddler工具抓包
关于Fiddler的下载及使用,可以看下面这篇文章
【工具】Fiddler抓包_fiddler classic-CSDN博客
Fiddler抓包工具的原理
Fiddler相当于一个“代理”
当浏览器访问sogou.com时,就会把HTTP请求先发给Fiddler,Fiddler再把请求转发给sogou的服务器。当sogou的服务器返回数据时,Fiddler拿到返回数据,再把数据交给浏览器
因此,FIddler对于浏览器和sogou服务器之间交互的数据细节,都是非常清楚的
代理就可以简单理解为一个跑腿小弟。你想买罐冰可乐,又不想自己下楼去超市,那么就可以把钱给你的跑腿小弟,跑腿小弟来到超时把钱给超市老板,再把冰可乐拿回来交到你手上。这个过程中,这个跑腿小弟对于“你”和“超市老板”之间的交易细节,是非常清楚的
HTTP常见问题解答
1.GET和POST有什么区别?
·GET参数在URL中可见,POST在请求体中
·GET有长度限制(约2KB),POST理论无限制
·GET适合查询(请求),POST适合修改数据(响应)
2.Cookie和Session有什么区别?
·Cookie存在客户端,Session存在服务器
·Cookie不安全(可被篡改),Session更安全
·通常配合使用:Cookie存SessionId,Session存用户数据
HTTP/2比HTTP/1.1快多少?
·页面加载速度提升15%-50%
·特别适合移动端(弱网环境优化明显)
·主流网站(Google/Facebook/淘宝)已全面启用
补充知识点
DNS
一、DNS基础概念
1.定义与作用
DNS(Domain Name System)是互联网的核心服务,负责将人类可读的域名(如www.baidu.com)转换为机器可识别的IP地址(如192.168.1.1),类似“互联网电话簿”。
·必要性:IP地址(如202.108.22.5)难以记忆,DNS简化了网络访问
·协议与端口:主要使用UDP协议(端口53)进行查询,TCP用于区域传输等可靠场景
2.域名空间结构
DNS采用树状层次结构,从根域(.)开始,逐级分为:
·根域(Root):全球13组根服务器(如a.root-servers.net)
·顶级域(TLD):如 .com(商业)、 .org(组织)、 .cn(中国)
·二级域:由组织或个人注册(如baidu.com)
·子域:如www.baidu.com中的www
·FQDN(完全限定域名):如www.baidu.com. (末尾的 . 表示根域)
二、DNS工作原理
1.解析流程
用户输入域名后,DNS解析过程如下:
·本地缓存检查:浏览器、操作系统、本地DNS服务器依次查询缓存
·递归查询:若本地DNS服务器无记录,则向根服务器发起请求
·迭代查询:根服务器返回顶级域服务器地址(如 .com),本地服务器逐级查询至权威服务器
·返回结果:权威服务器返回IP地址,逐层返回至用户,并缓存结果
2.关键组件
·递归解析器:用户直接交互的DNS服务器(如8.8.8.8)
·根服务器:存储顶级域服务器信息
·顶级域服务器:管理特定顶级域(如 .com)
·权威服务器:存储域名最终IP记录(由域名所有者维护)
DNS解析流程实例:访问www.example.com
1.本地缓存检查
·浏览器缓存:用户输入www.example.com后,浏览器首先检查自身缓存(如Chrome的DNS缓存),若存在且未过期,直接返回IP地址,流程结束
·操作系统缓存:若浏览器无缓存,系统(如Windows/macOS)检查本机hosts文件及系统DNS缓存
·本地DNS服务器缓存:若系统无缓存,查询用户配置的本地DNS服务器(如家庭路由器或运营商DNS(192.168.1.1)
假设所有缓存均未命中,进入递归查询阶段
2.递归查询:本地DNS服务器向根服务器发起请求
·本地DNS服务器(如8.8.8.8)向根服务器(Root Server)发送查询请求,询问www.example.com的IP地址
·根服务器不直接存储域名记录,但知道所有顶级域(TLD)服务器信息。它返回 .com 顶级域服务器的地址(如a.gtld-servers.net)
3.迭代查询:逐级查询至权威服务器
·步骤1:查询 .com 顶级域服务器
本地DNS服务器向 .com 顶级域服务器发送请求,询问example.com的权威服务器地址
·步骤2:获取权威服务器
.com 服务器返回example.com 的权威服务器地址(如 ns1.example.com和 ns2.example.com)
·步骤3:查询权威服务器
本地DNS服务器向ns1.example.com 发送请求,询问www.example.com的IP地址
查询 .com顶级域服务器(询问权威服务器地址)---->获取权威服务器---->查询权威服务器(询问IP地址)
4.返回结果:权威服务器响应IP地址
·权威服务器(由域名所有者维护)从数据库中查询www.example.com的记录。假设其配置如下:
www.example.com. IN A 93.184.216.34
·权威服务器将IP地址93.184.216.34返回给本地DNS服务器
5.缓存结果并逐层返回
·本地DNS服务器缓存:将www.example.com ---->93.184.216.34 记录缓存(TTL时间,如3600s)
·系统缓存:操作系统缓存此记录
·浏览器缓存:浏览器将结果存储以备后续使用
·最终,IP地址返回给用户,浏览器与93.184.216.34建立TCP连接,加载网页
关键组件角色总结
补充说明
·递归与迭代查询的区别
·递归查询:本地DNS服务器代表用户“全程代办”,逐级查询并返回最终结果
·迭代查询:根/顶级域服务器仅返回下一步查询的地址,由本地DNS服务器自行继续
·负载均衡与冗余:
权威服务器可能配置多条A记录(如www.example.com IN A 93.184.216.34和93.184.216.35),实现流量分配
·DNSSEC的作用:
若启用DNSSEC,权威服务器会对响应进行数字签名,防止缓存投毒攻击