接上次博客:JavaEE初阶(10)网络原理——TCP/IP协议(再谈协议、应用层、自定义协议、传输层:UDP 协议、 TCP协议、异常、TCP和UDP的对比、网络层重点协议、数据链路层重点协议)-CSDN博客
目录
HTTP 协议概念
HTTP 协议发展历程
适用场景
1. 浏览器打开网站:
2. 手机应用程序访问服务器:
HTTP的报文格式
HTTP协议的不同使用场景
下载并使用抓包工具
HTTP请求报文格式:
HTTP响应报文格式:编辑
URL
认识 "方法" (method)
1、GET 方法
2、POST 方法
GET 和 POST 的区别(面试题)
HTTP其他方法
HTTP请求详解
认识请求 "报头" (header)
前期准备
登陆请求
登录请求头部
登录响应头部
响应主体
访问其他页面
GET请求头部
理解登陆过程
认识请求 "正文" (body)
HTTP 响应详解
200 OK
404 Not Found
403 Forbidden
405 Method Not Allowed
500 Internal Server Error
504 Gateway Timeout
302 Move temporarily
301 Moved Permanently
418 I am a teapot!
状态码小结
认识响应 "报头" (header)
Content-Type
认识响应 "正文" (body)
(1)text/html
(2)text/css
(3) application/javascript
(4)application/json
那么我们如何让客户端构造一个HTTP请求?如何让服务器处理一个HTTP请求?
浏览器构造HTTP请求:
服务器处理HTTP请求(具体的以后介绍):
通过 form 表单构造
form 发送 GET 请求
表单form的重要参数
输入字段 input 的重要参数
体会 form 代码和 HTTP 请求之间的对应关系
form 发送 POST 请求
通过AJAX的方式构造
发送 GET 请求
浏览器和服务器交互过程(引入 ajax 后):
发送 POST 请求
练习:
HTTP是“超文本传输协议”(Hypertext Transfer Protocol)的缩写,它是一种应用层协议,用于在互联网上传输超文本文档,通常指的是网页。HTTP是Web上最基本的协议之一,它定义了客户端(例如Web浏览器)和服务器之间的通信规则,使我们能够在Web上浏览、搜索和与各种Web资源进行交互。
HTTP的主要功能包括:
传输数据:HTTP负责在客户端和服务器之间传输数据,通常是HTML文档、图像、样式表和其他Web资源。这些资源以超文本的形式链接在一起,构成了Web页面。
请求-响应模型:客户端通过HTTP请求发送到服务器,并等待服务器的HTTP响应。请求包括所需的资源,以及其他信息如请求方法(GET、POST、PUT、DELETE等),请求头(包含有关请求的元数据),以及请求体(对于某些方法,如POST)。
状态代码:HTTP响应包括一个状态代码,指示请求是否成功。例如,200表示成功,404表示未找到请求的资源,302表示重定向等。
无状态性:HTTP是一种无状态协议,这意味着每个HTTP请求都是独立的,不依赖于之前的请求。这使得Web服务器可以处理大量的并发请求,但也要求使用会话(如cookies)来跟踪用户状态。
可扩展性:HTTP是一个灵活的协议,可以轻松添加新的头部字段和方法,以支持不断发展的Web应用需求。
连接管理:HTTP/1.1引入了持久连接,允许多个请求和响应在单个TCP连接上进行,减少了连接的开销。
HTTP的版本有多个,目前最常用的是HTTP/1.1和HTTP/2.0。HTTP/2.0引入了更多的性能优化,如多路复用、头部压缩和服务器推送,以提高Web应用的加载速度和性能。
HTTP是Web的基础之一,负责连接客户端和服务器,使我们能够在浏览器中浏览、搜索和与Web上的各种资源进行交互。无论您是浏览网页、下载文件还是与Web应用程序进行通信,HTTP都在幕后起着至关重要的作用。
HTTP 诞生与1991年,目前已经发展为最主流使用的一种应用层协议。
HTTP通常是基于传输层的TCP协议实现的,而HTTP/1.0、HTTP/1.1和HTTP/2.0都使用TCP作为其底层传输协议。HTTP/3.0则采用了基于UDP的QUIC(Quick UDP Internet Connections)协议。
HTTP/1.1和HTTP/2.0是当前最常用的HTTP版本:
HTTP/1.1:HTTP/1.1是目前广泛采用的HTTP版本,它建立在TCP连接之上,使用一系列请求-响应的模式来传输数据。HTTP/1.1引入了持久连接,允许多个请求和响应在单个TCP连接上复用,以减少连接的开销。然而,它仍然存在一些性能瓶颈,如"队头阻塞",这在HTTP/2.0中得到了改善。
HTTP/2.0:HTTP/2.0是HTTP/1.1的进化版本,它引入了多路复用、头部压缩、服务器推送等特性,以提高性能和减少加载时间。HTTP/2.0仍然基于TCP,但通过并行处理多个请求,解决了HTTP/1.1中的队头阻塞问题。
HTTP/3.0采用了UDP上的QUIC协议,以进一步提高性能和安全性。QUIC是由Google开发的协议,它允许多个流(包括HTTP请求和响应)在同一连接上独立传输,降低了延迟。此协议还包括一层加密,从而提高了安全性。然而,HTTP/3.0尚未被广泛采用,而HTTP/1.1和HTTP/2.0仍然是大多数Web应用的主要版本。
总的来说,不同版本的HTTP都在不断发展和改进,以适应不断增长的互联网应用需求。选择使用哪个版本通常取决于你的应用需求和支持的技术。在实际应用中,往往需要综合考虑性能、兼容性和安全性等因素来选择合适的HTTP版本。
HTTP协议在许多不同的场景中都得到了广泛的应用,其中包括浏览器打开网站和手机应用程序访问服务器。以下是这两种常见情况的简要说明:
当我们在Web浏览器中输入网站地址或点击书签时,会发生以下过程:
浏览器将发送一个HTTP请求到目标网站的服务器,请求指定的网页或资源。
目标服务器接收到请求后,会根据请求的路径和其他信息查找并准备要发送的资源。
服务器会构建HTTP响应,其中包括所请求资源的内容以及一些元数据,如响应状态代码、响应头(包含有关响应的元信息)等。
服务器将HTTP响应发送回浏览器。
浏览器接收响应后,会解析响应内容,渲染页面并显示在用户的屏幕上。
用户可以与网页交互,点击链接、填写表单等。
这是典型的HTTP协议用例,其中HTTP用于在浏览器和服务器之间传输网页和相关资源。
移动应用程序通常需要与服务器通信来获取数据、更新内容、进行用户身份验证等。在这种情况下,HTTP通常用于构建移动应用程序与服务器之间的通信。
移动应用程序会使用HTTP请求与服务器交互。这可以包括GET请求来获取数据、POST请求来提交表单数据或执行其他操作,以及其他HTTP方法。
服务器将处理这些请求,执行相关操作,然后构建HTTP响应,将所需的数据或响应状态返回给应用程序。
移动应用程序将解析HTTP响应,处理数据,然后在用户界面上呈现或执行适当的操作。
这种情况下,HTTP用于支持移动应用程序与服务器之间的数据交换,使应用程序能够实时获取和展示数据。
总的来说,HTTP是一种通用的协议,适用于各种互联网应用。无论是通过浏览器访问网站还是通过移动应用程序与服务器通信,HTTP都是连接客户端和服务器的关键技术之一。
当然,我们要学习HTTP的协议,重点还是学习HTTP的报文格式,接下来就让我们主要来看看HTTP的报文格式。
根据不同的交互需求,HTTP可以被用于不同的模式:
一问一答访问网站:这是HTTP最常见的使用方式,通常用于浏览网站。客户端(通常是Web浏览器)向服务器发送HTTP请求,请求网页或资源,服务器返回相应的HTTP响应,包含所请求的内容。这是典型的请求-响应模式,客户端请求一个资源,服务器响应提供该资源。
多问一答上传文件:在这种情况下,客户端需要上传文件到服务器。客户端使用HTTP请求,通常是使用HTTP POST方法,将文件数据作为请求体发送到服务器。服务器接收到请求后,可以将文件保存在服务器上,然后返回一个表示上传成功的HTTP响应。
一问多答下载文件:这是当客户端需要从服务器下载文件时的模式。客户端向服务器发送HTTP请求,请求服务器提供特定的文件或资源。服务器返回文件内容作为HTTP响应体,客户端可以下载并保存该文件。
多问多大串流/远程桌面:这是一种更复杂的应用程序场景,其中HTTP用于建立多个请求和响应的串流通信。这可以是多个请求和响应,以进行复杂的交互,也可以是远程桌面协议,使远程控制和屏幕共享成为可能。
理解HTTP协议的报文格式对于有效地使用和分析HTTP通信至关重要。HTTP协议是一种基于"一问一答"结构模型的协议,它用于在客户端和服务器之间传输超文本文档和其他资源。客户端向服务器发送HTTP请求报文,服务器接收请求并发送HTTP响应报文作为响应。
和我们之前学的TCP和UDP相对比,它的请求和响应在协议格式上有一些差异,主要体现在报文的结构和内容上。
以下是HTTP请求和响应报文的基本格式:
如何查看到HTTP请求和响应的格式呢?
我们需要抓包工具:把网卡上经过的数据获取到并显示出来,它们是分析调试的程序的重要手段。
这些工具可以拦截、捕获和分析经过网络接口的数据流,包括HTTP请求和响应。以下是一些常用的抓包工具:
Wireshark:Wireshark是一款流行的开源网络分析工具,可以捕获网络数据包并以易于理解的形式显示它们。我们可以使用Wireshark来查看HTTP请求和响应的详细信息,包括请求报文、响应报文、报文头和报文体,但是不太方便。
Fiddler:Fiddler是一个Windows平台上的免费Web调试代理工具,专注于HTTP调试。它可以捕获HTTP请求和响应,以及WebSocket通信。Fiddler还提供了详细的请求和响应的解析、筛选和修改功能。
Charles:Charles是一款跨平台的HTTP代理工具,用于查看HTTP请求和响应以及进行调试。它允许我们查看和修改流经代理的数据,从而可以分析和调试HTTP通信。
Postman:Postman是一个强大的API测试和调试工具,可以捕获和查看HTTP请求和响应。虽然它主要用于API测试,但也可以用于HTTP请求的查看和调试。
接下来我们就使用 Fiddler 来讲解。
Fiddler是一个强大的网络调试代理工具,它的界面通常分为左侧和右侧两个部分,用于查看捕获的HTTP请求和响应。
左侧部分是一个包含捕获的HTTP请求和响应的列表,我们可以在这里查看所有经过Fiddler代理的数据包,这些数据包按时间顺序排列。
右侧部分通常用于显示选定请求或响应的详细信息,包括请求头、响应头、报文体等。这个部分用于分析特定的请求或响应的内容。
启用HTTPS抓包功能:
安装Fiddler根证书:
开始抓包:
注意,安装Fiddler根证书可能需要管理员权限,并且在某些操作系统和浏览器中,你可能需要额外的配置步骤。一旦配置完成,就可以使用Fiddler来分析HTTPS流量,检查请求和响应的详细信息,以及进行网络调试。
安装的 Fiddler 需要手动开启HTTP功能,并且安装证书,否则只能抓http。
安装根证书,一定要选择“同意”,否则你就只能卸载重装了:
把该勾选的项都勾选上:
这样就正常了:
但是Fiddler 本质上是一个“代理”,可能会和其他的代理软件冲突。
Fiddler在其核心上是一个正向代理服务器,用于HTTP和HTTPS网络调试。它充当客户端(例如Web浏览器)和目标服务器之间的中间人,允许开发人员捕获、查看和修改这两方之间的交互数据。
正向代理和反向代理是两种代理服务器的不同用途:
正向代理(Forward Proxy):
反向代理(Reverse Proxy):
以下是Fiddler作为正向代理的程序过程:
Fiddler 用于中继HTTP请求和响应,以便分析和调试网络通信。由于它的代理特性,可能与其他代理软件或配置的代理服务产生冲突。
冲突和如何解决它们的方法:
冲突的代理设置:如果您的计算机上已经配置了其他代理服务(如VPN代理、代理服务器软件等),它们可能会与Fiddler产生冲突。在这种情况下,你可以考虑暂时禁用其他代理服务,以便Fiddler能够正常工作。
端口冲突:Fiddler默认监听的端口是8888,如果其他代理服务或应用程序正在使用相同的端口,可能会导致冲突。你可以在Fiddler选项中更改Fiddler的监听端口,以避免与其他服务冲突。
安全软件干预:某些安全软件可能会检测到代理行为,并视其为潜在风险。这可能导致安全软件干预Fiddler的操作。你可以在安全软件中配置允许Fiddler运行,并排除其干预。
操作系统代理设置:在某些操作系统中,代理设置可能会全局影响网络连接。如果Fiddler设置为全局代理,它可能会与其他代理设置产生冲突。确保Fiddler的代理设置仅用于需要调试的应用程序。
解决这些冲突通常需要一些配置调整和可能的冲突排除。在使用Fiddler之前,你可以检查你的计算机上是否有其他代理服务或代理设置,并确保它们不会干扰Fiddler的正常运行。
平常我们见过的一些程序,比如:VPN和加速器,这些都是“代理”,它们都会冲突。所以你应该先关闭之前的一些代理软件,也有可能是一个浏览器插件。你还可以尝试使用不同的浏览器,edge通常会有点问题。
为了方便观察,我们先清空一下原先的数据列表:
CTRL+A全选,
选择 "Edit" 菜单中的 "Remove" 选项,或者使用键盘上的 Delete 键。这将删除你选择的HTTP请求数据。
如果你删除了某个请求但后来需要查看或分析它,你可以在 "File" 菜单中找到 "Restore" 选项来恢复已删除的请求。
一个网站打开的时候往往不是只和服务器进行一次操作,大概率是多次操作。
在Fiddler中,HTTP请求和响应的颜色编码通常是用来区分不同类型的请求和响应的状态。
一般情况下,Fiddler的颜色编码如下:
这些颜色编码有助于用户迅速识别HTTP请求和响应的状态和类型。例如,红色的请求和响应通常表示问题或错误,绿色的请求和响应表示成功,黄色表示重定向,等等。这使得Fiddler成为一个强大的网络调试工具,有助于开发人员分析和解决与HTTP通信相关的问题。
HTTP协议是文本格式的协议,我们点开协议里面的HTTP请求部分,会发现内容都是字符串。
我们之前学的TCP和UDP、IP都是二进制。
HTTP响应其实也是文本的,但是直接查看我们看到的是二进制文件,因为这里是压缩后的。
HTTP响应经常会被压缩,压缩之后体积会变小,传输的时候节省网络带宽。
解压缩点这个按钮:
解压缩之后可以看到响应的数据其实是HTML。浏览器显示的网页就是HTML,往往都是浏览器先请求对应的服务器,从服务器那边拿到的页面数据。
Server: openresty
Date: Thu, 19 Oct 2023 12:41:06 GMT
Content-Type: text/html
Connection: keep-alive
Set-Cookie: seedcode=9598557; path=/; Expires=Thu, 19-Oct-23 12:46:06 GMT
Set-Cookie: fingerprint=7e4fd68bf40a423ceff6a9b72f2e139e; path=/; Expires=Thu, 19-Oct-23 12:46:06 GMT
Content-Length: 504
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, */*;q=0.8
HTTP请求报文由以下几部分组成:
请求行:包括HTTP方法(GET、POST、PUT、DELETE等)、请求的URI(Uniform Resource Identifier,即请求的路径),以及HTTP协议版本(通常是HTTP/1.1)。
请求头:包含请求的元数据,如User-Agent(客户端的用户代理)、Host(请求的目标主机名)、Accept(客户端可以接受的响应媒体类型)等。
空行:用于分隔请求头和请求体。
请求体(可选):包含请求的数据,通常在HTTP方法是POST或PUT时使用,例如表单数据或上传的文件。
从行的角度来看:
首行:
请求头(Header):
空行:
请求正文(Body):
HTTP/1.1 200 OK
Server: openresty
Date: Thu, 19 Oct 2023 12:41:10 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Set-Cookie: checkcode=9728; path=/; Expires=Fri, 20-Oct-23 12:41:06 GMT
Set-Cookie: seedcode=9598557; path=/; Expires=Fri, 20-Oct-23 12:41:06 GMT
Set-Cookie: fingerprint=7e4fd68bf40a423ceff6a9b72f2e139e; path=/; Expires=Fri, 20-Oct-23 12:41:06 GMT
Product: Z-BlogPHP 1.7.3
X-XSS-Protection: 1; mode=block
Upgrade-Insecure-Requests: 1
Content-Length: 47507
中国大学mooc现代邮政英语(English for Modern Postal Service)_网课宝盒
HTTP/1.1 200 OK
Date: Thu, 20 Jan 2022 15:50:23 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Length: 1234
Content-Type: text/html
Example Page
Hello, World!
HTTP响应报文由以下几部分组成:
状态行:包括HTTP协议版本(通常是HTTP/1.1)、状态码(指示请求的处理结果,如200表示成功,404表示未找到,302表示重定向等)和状态短语(与状态码相关的短描述)。
响应头:包含响应的元数据,如Server(响应的服务器软件)、Content-Type(响应的媒体类型)、Content-Length(响应的内容长度)等。
空行:用于分隔响应头和响应体。
响应体:包含响应的数据,通常是网页内容、文件内容或其他资源的数据。
从行的角度来看:
首行:
响应头(Header):
空行:
响应正文(Body):
计算机中非常重要的概念。表述了某个资源在网络上的所属位置。数据库也算是一种资源。
https://user:[email protected]:8080/directory/file.html?query=value#fragment
现在,让我们逐个拆解这个URL:
综上,URL提供了一个标准方法来描述互联网上资源的位置,并为客户端提供了所需的所有信息来定位和检索这些资源。
对于Query String来说,当查询参数的值(value)包含特殊字符、空格、或者非标准ASCII字符时,通常需要进行URL编码(URL encoding)以确保它们在URL中传输和解析正确。这些特殊符号可能会使浏览器/HTT[服务器对于URL的解析出错。所以我们需要进行转义。URL encode本质就是一种“转义字符”。
URL编码将特殊字符和非标准字符转换为URL安全的形式,通常是使用百分号编码(Percent Encoding)来表示。
URL编码的一般规则是将字符转换为"%XX"的形式,其中XX是字符的十六进制ASCII码。例如,空格字符会被编码为"%20",而问号字符?会被编码为"%3F"。这确保了URL中的字符不会与URL的语法和解析发生冲突。
例如,如果你想在查询参数中包含一个特殊字符,比如问号?,你应该将它编码为%3F,如下所示:
原始URL:https://www.example.com/search?q=some?query
编码后的URL:https://www.example.com/search?q=some%3Fquery
在不同的编程语言和框架中,都提供了URL编码和解码的函数或方法来处理这些情况。例如,Python中的urllib.parse库提供了quote()函数用于URL编码,以及unquote()函数用于解码。在JavaScript中,encodeURIComponent()函数用于URL编码,而decodeURIComponent()函数用于解码。
定义与用途:
请求特点:
关于GET请求的URL长度问题:
总之,尽管HTTP协议本身没有限制URL的长度,但在实际应用中,浏览器和服务器的具体实现可能会设置一些限制。在设计Web应用时,考虑到跨浏览器和跨平台的兼容性,通常建议不要使用过长的URL。
定义与用途:
这里我其实最开始没能抓到返回页面的请求,原因是命中了浏览器缓存。
浏览器显示的页面其实都是从服务器这边下载的HTML,它的内容可能比较多,体积比较大,通过网络加载消耗的时间也会比较多。
所以浏览器一般都会自己带有缓存,就把之前加载过的页面保存在本地硬盘上,下次访问可以直接读取本地硬盘的数据。
请求特点:
POST方法主要用于将数据传输到服务器,这些数据通常包含在请求主体中。与GET请求不同,POST请求通常用于非幂等操作,例如在服务器上创建新资源,因此具有状态更改的潜力。在POST请求中,主体的数据格式通常由 Content-Type 头部字段指定,可以是表单数据、JSON、XML等格式。
你会发现我上传了一张图片,这里的body非常长,因为此处把图片放到HTTP请求中,往往要进行mb4转码
在HTTP请求中上传一张图片,这可能导致请求主体(body)非常大,因为图像文件通常具有较大的文件大小。如果将图像文件作为HTTP请求的一部分上传,可能需要将二进制数据进行编码,以便在HTTP请求中传输。
常用的图像编码格式包括Base64编码,这将二进制数据编码为文本字符串,使其可以包含在HTTP请求中。具体的编码方法和格式可能因不同的编程语言和HTTP库而异。通常,编码后的图像数据会放在请求的主体中,而请求头会包含有关数据类型(例如Content-Type)和数据长度(例如Content-Length)的信息。
在服务器端,我们需要解码请求主体,以还原图像文件的二进制数据。这可以通过编程语言的库和工具来完成。
注意,虽然可以将图像文件包含在HTTP请求中,但对于大型文件或多个文件的上传,通常更常见的做法是使用多部分表单(multipart/form-data),这样可以更有效地处理文件上传。此外,HTTP服务器通常有文件上传限制,需要根据服务器配置来确定最大请求主体的大小。
GET和POST其实并没有本质的区别!!!双方可以替换对方的场景。
但是虽然没有本质区别,但是在使用习惯上还是存在一些差异。
这是习惯上最大的差别。当时上述情况并非绝对,GET也可以使用body,POST也可以使用 query、string ,使用的前提是客户端/服务器都得按照一样的方式来处理代码。 所以一般还是建议大家按照约定俗成的习惯,不要太特立独行~~~
语义不同:
数据传递方式:
幂等性:
缓存:
其他补充说明:
这里我们需要具体解释一下。
网络上经常有一些说法,需要注意:
1、GET请求能传递的数据量有上,POST没有。这个说法是一个历史遗留问题,早期版本的浏览器硬件资源非常匮乏,针对GET请求的URL长度做出了限制。但是实际上RFC标准文档中并没有明确规定URL能有多长,目前的浏览器和服务器的实现过程中,URL可以是非常长的,甚至可以使用URL传递一些图片这样的数据;
2、GET传递数据不安全,POST请求传递数据更安全。依据是:如果使用GET请求进行实现登陆,点击登陆的时候就会把用户名和密码放到URL中,进一步的显示到浏览器的地址栏里,相比之下POST则是在body中,不会在界面上显示出来,所以更安全。但是我们通常说的“安全”指的是传递的数据不容易被黑客获取,或者被获取到之后不容易被破解。所以此处的密码是加密的,即使拿到了也不容易破解。
3、GET只能给服务器传输文本数据,POST可以给服务器传输文本和二进制数据。
4、GET请求可以被浏览器收藏夹收藏,POST不能,因为收藏的时候可能会丢失body。这个说法目前是正确的,但是可能和技术关系不大,主要还是看你怎么提需求。
我虽然提供了GET和POST方法之间的主要区别,但是具体的实现和应用还是得取决于浏览器和服务器的配置和要求。
PUT:
DELETE:
OPTIONS:
HEAD:
TRACE:
CONNECT:
我们提到这些HTTP方法可以使用Ajax或网络编程语言来构造,任何能进行网络编程的语言都可以构造HTTP请求,实质上就是通过TCP socket发送符合HTTP协议规则的字符串。
这些HTTP的请求最初的初心其实就是未来表示不同的语义。可是在现在的实际使用过程中,这个初心已经被遗忘了。HTTP的各种请求目前来说已经不一定完全遵守自己的规定了,你可以更加随意的使用。
请求头(header)是HTTP请求中的一部分,用于携带关于请求的元数据和其他信息。
HTTP请求头通常采用键值对的格式,每个键值对占一行,键和值之间使用冒号分隔(而不是分号)。
请求头提供了有关请求的重要信息,包括请求的方法、URL、主机、内容类型、身份验证凭证等等。
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
在上面的示例中,每个键值对表示一个请求头,例如,"Host"头部指定了请求的主机名,"User-Agent"指定了发送请求的用户代理,"Accept"头部指定了接受的内容类型等等。
HTTP请求头是HTTP请求的一部分,它提供了关于请求的元数据信息,它们以键值对的格式表示,而不是使用分号分隔。
报头的种类有很多, 此处我们仅介绍几个常见的。
1、Host:
定义与用途: 指定请求的服务器主机地址和端口。
示例: Host: www.example.com
这个信息在URL中也是存在的。但是在使用代理的情况下,Host的内容可能和URL中的内容不同。
2、Content-Length:
定义与用途: 指定请求主体或响应主体的数据长度,以字节为单位。
示例: Content-Length: 1234
非必须,请求里面有body才会有这个属性。通常情况下,GET请求里面就没有,POST就有。
TCP涉及到粘包问题,HTTP在传输层就是基于TCP的。使用同一个TCP连接,传输多个HTTP数据报,此时就会使多个GTTP数据包在TCP接收缓冲区中挨在一起。接收方解析的时候就需要能够清楚HTTP数据包之间的边界。
对于GET这种没有body的请求,直接使用空行作为分隔符;
对于POST这种有body的请求,就需要结合空行和Content-Length。
3、Content-Type:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
非必须,请求里面有body才会有这个属性。通常情况下,GET请求里面就没有,POST就有。
请求头部提供了关于请求内容和其他元数据的关键信息,帮助服务器正确解析和响应请求。
HTTP请求和响应的body中的格式可以有多种选择,取决于数据的类型和需求。以下是一些常见的HTTP请求和响应body中的格式:
HTTP请求body中的格式:
HTTP响应body中的格式:
后续给服务器提交给请求不同的 Content-Type ,服务器处理数据的逻辑也是不同的。服务器返回数据给浏览器们也需要设置合适的 Content-Type,浏览器也会根据不同的 Content-Type做出不同的处理。
其中响应中的HTML、CSS、JavaScript构成网页的主体,HTML表示页面的骨架,CSS表示页面的样式,JavaScript 表示页面的行为。
4、User-Agent(简称 UA)
定义与用途:表示发送请求的用户代理的属性,通常是浏览器或其他客户端应用。描述里你使用什么设备上网。
格式与内容:
UA字符串通常包含操作系统、硬件类型、浏览器以及浏览器的渲染引擎等信息。
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36
Windows NT 10.0; Win64; x64 表示操作系统版本信息。
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 表示浏览器版本和其使用的渲染引擎信息。
背景与历史:
User-Agent(UA)字符串的格式和内容常常受到历史遗留问题的影响。在互联网的早期,网站的内容相对简单,而浏览器之间的差异也很大。为了提供最佳的用户体验,网站开发者需要考虑到多个浏览器版本的兼容性。
随着时间的推移,网页的内容变得越来越丰富,浏览器更新和升级的速度也加快了。这导致了新旧版本浏览器的并存,因此,开发者既要考虑到老版本浏览器的兼容性,又要确保新版本浏览器用户的体验得到保障。为了解决这个问题,开发者开始使用UA来识别并区分不同的浏览器。UA中记录了浏览器的版本、所支持的特性等信息,这为开发者提供了巨大的帮助。
然而,随着各大浏览器厂商争夺市场份额,为了确保网站能够在其浏览器上正确显示,浏览器开始在UA字符串中包含其他浏览器的标识。这导致了UA字符串变得越来越复杂和冗长。
总之,User-Agent 请求头部字段提供了关于请求来源的用户代理的详细信息,这有助于服务器为不同的设备、操作系统或浏览器提供适当的响应。
5、Referer
定义与用途:
Referer字段通常用于标识从哪个页面跳转过来,以便网站或服务器了解用户的访问来源。但在直接输入URL或使用书签的情况下,没有上一个页面可供标识,因此没有Referer信息发送到目标网页。
用户点击广告之后,广告平台每次跳转之前都会先跳转到一个计费服务器,再跳转到广告主的页面。广告主通过记录日志就知道点击情况了。
广告主也可能会在很多不同的平台投放广告,广告主的服务器就需要区分出哪些请求是来自A,哪些请求又是来自B?我们通过Referer就可以进行区分(域名不同)
是否会存在一种情况?有人把Referer给改了,本来是“搜狗”的广告,结果跳转到了别的广告平台?在早期的互联网中,确实存在运营商或中间人劫持的情况,其中修改HTTP请求或响应中的信息,如Referer,是其中的一种手法。这种行为通常是为了注入广告或跟踪用户活动,甚至可能用于监视和搜集用户的数据。因为网络数据都是通过运营商的设备(路由器/交换机)转发的,运营商通过在路由器上部署一些特定的程序,就很容易能够获取到,也就很容易篡改。所以后面就使用HTTTPS来替代HTTP,HTTP最大的问题在于“明文传输”,这就容易被第三方获取并篡改。而HTTPS对HTTP的数据进行了加密,第三方想要获取并篡改就没那么容易了,通过这个手段就可以有效地遏制运营商劫持。
HTTPS的广泛采用是一个重要的改进,因为它通过加密通信来保护数据的完整性和隐私,使运营商或其他恶意第三方更难以篡改用户的数据。HTTPS的加密机制通过使用SSL/TLS协议来实现,确保了数据在传输过程中的保密性。
运营商劫持等恶意行为在HTTPS广泛采用后变得更加困难,因为HTTPS通信中的数据在客户端和服务器之间进行端到端的加密,防止了中间人的干预。此外,Web浏览器和网站也会检测证书,以确保与服务器建立安全的HTTPS连接。
尽管HTTPS提供了更高的安全性,但仍然可能存在一些其他安全漏洞和攻击,例如钓鱼攻击、恶意证书颁发等。因此,大家都需要保持警惕,并确保采取适当的安全措施,以降低潜在威胁的风险。同时,不断更新和改进网络协议和安全措施也是网络安全的一部分。
示例:
注意:
Referer
字段可能为空或缺失。6、 Cookie
定义与用途:
示例:
关于域名和Cookie:
Referer和Cookie是HTTP请求头部字段的一部分,它们提供了在Web应用程序中进行跟踪和标识的功能,用于了解用户行为和提供个性化服务。
通过抓包观察网页登录过程是一种常见的方式来了解网络通信和验证身份的过程。以下是一般的步骤,以观察码云登录过程为例:
安装抓包工具:
启动抓包工具:
清除浏览器中的Cookie:
进行登录:
观察抓包工具:
查看登录请求和响应:
分析数据:
这个过程允许你深入了解网站登录的内部工作原理,并可以帮助你识别如何实施身份验证和会话管理等功能。请注意,进行网络抓包时,请遵守相关法律和道德规范,不要滥用这些信息。
登陆操作
POST https://gitee.com/login HTTP/1.1
Host: gitee.com
Connection: keep-alive
Content-Length: 394
Cache-Control: max-age=0
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
Origin: https://gitee.com
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/91.0.4472.101 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,imag
e/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://gitee.com/login
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
encrypt_key=password&utf8=%E2%9C%93&authenticity_token=36ZqO9tglSN6EB6pF6f2Gt%2B
dalgkbpTDUsJC5OER7w8%3D&redirect_to_url=%2FHGtz2222&user%5Blogin%5D=HGtz2222&enc
rypt_data%5Buser%5Bpassword%5D%5D=Hy2gjJ60312Ss12jSe21GMLPEb766tAhCygL281FLRMpiz
xJVaWGOPlQF7lZhelab1HS2vBiwfBo5C7BnR5ospoBiK1hR6jNXv1lesaYifv9dP1iRC6ozLLMszo%2F
aRh5j5DeYRyKcE0QJjXRGEDg4emXEK1LHVY4M1uqzFS0W58%3D&user%5Bremember_me%5D=0
这是一个示例的登录请求,采用POST方法,发送到https://gitee.com/login
。以下是请求头的详细解释,按照你之前提供的格式:
请求方法和URL:
POST
https://gitee.com/login
Host:
Host: gitee.com
Connection:
Connection: keep-alive
Content-Length:
Content-Length: 394
Cache-Control:
Cache-Control: max-age=0
User-Agent:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36
Accept:
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.9
Content-Type:
application/x-www-form-urlencoded
,表示表单数据。Content-Type: application/x-www-form-urlencoded
Referer:
Referer: https://gitee.com/login
Accept-Encoding:
Accept-Encoding: gzip, deflate, br
Accept-Language:
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
请求主体 (Body):
encrypt_key=password
、user[login]=HGtz2222
等。这个请求头部用于将登录信息发送到https://gitee.com/login
,以进行用户身份验证。服务器将使用请求主体中的数据来验证用户并进行相应的操作。请注意,登录请求通常包含用户名和密码等敏感信息,应该使用安全的HTTPS连接来保护这些数据的传输。
登陆响应
HTTP/1.1 302 Found
Date: Thu, 10 Jun 2021 04:15:58 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Keep-Alive: timeout=60
Server: nginx
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/HGtz2222
Cache-Control: no-cache
Set-Cookie: oschina_new_user=false; path=/; expires=Mon, 10 Jun 2041 04:16:00
-0000
Set-Cookie: gitee_user=true; path=/
Set-Cookie: gitee-sessionn=M1Rhbk1QUUxQdWk1VEZVQ1BvZXYybG13ZUJFNGR1V0pSYTZyTllEa21pVHlBUE5QU2Qwdk44NXdEam
11T3FZYXFidGNYaFJxcTVDRE1xU05GUXN0ek1Uc08reXRTay9ueTV3OGl5bTdzVGJjU1lUbTJ4bTUvN1
l3RFl4N2hNQmI1SEZpdmVJWStETlJrdWtyU0lDckhvSGJHc3NEZDFWdHc5cjdHaGVtNThNcEVOeFZlaH
c0WVY5NGUzWjc2cjdOcCtSdVJ0VndzdVNxb3dHK1hPSDBDSFB6WlZDc3prUVZ2RVJyTnpTb1c4aFg1Mm
UxM1YvQTFkb1EwaU4zT3hJcmRrS3dxVFZJNXoxaVJwa1liMlplbWR5QXQxY0lvUDNic1hxN2o0WDg1Wk
E9LS10N0VIYXg4Vm5xdllHVzdxa0VlUEp3PT0%3D-
-2f6a24f8d33929fe88ed19d4dea495fbb40ebed6; domain=.gitee.com; path=/; HttpOnly
X-Request-Id: 77f12d095edc98fab27d040a861f63b1
X-Runtime: 0.166621
Content-Length: 92
You are being redirected.
这是一个示例的登录响应,HTTP响应代码为302 Found,表示重定向。
可以看到, 响应中包含了 3 个 Set-Cookie 属性. 其中我们重点关注第三个. 里面包含了一个 gitee-session-n 这样的属性, 属性值是一串很长的加 密之后的信息。这个信息就是用户当前登陆的身份标识. 也称为 "令牌(token)"
以下是响应头和主体的详细解释:
HTTP版本和状态码:
Date:
Date: Thu, 10 Jun 2021 04:15:58 GMT
Content-Type:
Content-Type: text/html; charset=utf-8
Connection:
Connection: keep-alive
Keep-Alive:
Keep-Alive: timeout=60
Server:
Server: nginx
X-XSS-Protection:
X-XSS-Protection: 1; mode=block
X-Content-Type-Options:
X-Content-Type-Options: nosniff
X-UA-Compatible:
X-UA-Compatible: chrome=1
Expires:
Expires: Sun, 1 Jan 2000 01:00:00 GMT
Pragma:
Pragma: must-revalidate, no-cache, private
Location:
https://gitee.com/HGtz2222
。Location: https://gitee.com/HGtz2222
Cache-Control:
Cache-Control: no-cache
Set-Cookie:
oschina_new_user
和gitee_user
等Cookie。Set-Cookie: oschina_new_user=false; path=/; expires=Mon, 10 Jun 2041 04:16:00 -0000
Set-Cookie: gitee_user=true; path=/
Set-Cookie: ...
X-Request-Id:
X-Request-Id: 77f12d095edc98fab27d040a861f63b1
X-Runtime:
X-Runtime: 0.166621
响应主体是一个HTML文档,包含了重定向消息,告诉用户他们将被重定向到https://gitee.com/HGtz2222
。这是一个常见的登录成功后的操作,用户将被重定向到他们的个人页面或其他受保护的区域。
这个响应表明登录成功,并且用户的身份验证状态已更新,将被重定向到新的URL。登录后,用户的身份将由gitee_user
Cookie来维护,这个Cookie将在登录成功后的响应头中设置。
重定向是常见的用户身份验证操作之一,它允许用户成功登录后被自动导航到他们的目标页面,以提供良好的用户体验。
登陆成功之后, 此时可以看到后续访问码云的其他页面(比如个人主页), 请求中就都会带着刚才获取到的 Cookie 信息
GET https://gitee.com/HGtz2222 HTTP/1.1
Host: gitee.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/91.0.4472.101 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,imag
e/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
Referer: https://gitee.com/login
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: oschina_new_user=false; user_locale=zh-CN; yp_riddler_id=1ce4a551-a160-
4358-aa73-472762c79dc0; visit-gitee--2021-05-06%2010%3A12%3A24%20%2B0800=1;
sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22726826%22%2C%22first_id%22%3
A%22175869ba5888b6-0ea2311dc53295-303464-2073600-
175869ba5899ac%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E
7%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%2
4latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%22175869ba5888b6-
0ea2311dc53295-303464-2073600-175869ba5899ac%22%7D; remote_way=svn;
tz=Asia%2FShanghai;
Hm_lvt_24f17767262929947cc3631f99bfd274=1622637014,1622712683,1622863899,1623298
442; Hm_lpvt_24f17767262929947cc3631f99bfd274=1623298550; gitee_user=true; giteesessionn=M1Rhbk1QUUxQdWk1VEZVQ1BvZXYybG13ZUJFNGR1V0pSYTZyTllEa21pVHlBUE5QU2Qwdk44NXdEam
11T3FZYXFidGNYaFJxcTVDRE1xU05GUXN0ek1Uc08reXRTay9ueTV3OGl5bTdzVGJjU1lUbTJ4bTUvN1
l3RFl4N2hNQmI1SEZpdmVJWStETlJrdWtyU0lDckhvSGJHc3NEZDFWdHc5cjdHaGVtNThNcEVOeFZlaH
c0WVY5NGUzWjc2cjdOcCtSdVJ0VndzdVNxb3dHK1hPSDBDSFB6WlZDc3prUVZ2RVJyTnpTb1c4aFg1Mm
UxM1YvQTFkb1EwaU4zT3hJcmRrS3dxVFZJNXoxaVJwa1liMlplbWR5QXQxY0lvUDNic1hxN2o0WDg1Wk
E9LS10N0VIYXg4Vm5xdllHVzdxa0VlUEp3PT0%3D-
-2f6a24f8d33929fe88ed19d4dea495fbb40ebed6
这是一个示例的GET请求,用于访问 https://gitee.com/HGtz2222
登陆成功之后的页面。以下是请求头的详细解释,:
请求方法和URL:
GET
https://gitee.com/HGtz2222
Host:
Host: gitee.com
Connection:
Connection: keep-alive
Cache-Control:
Cache-Control: max-age=0
Upgrade-Insecure-Requests:
Upgrade-Insecure-Requests: 1
User-Agent:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36
Accept:
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.9
Sec-Fetch-Site:
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode:
Sec-Fetch-Mode: navigate
Sec-Fetch-User:
Sec-Fetch-User: ?1
Sec-Fetch-Dest:
Sec-Fetch-Dest: document
sec-ch-ua:
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile:
sec-ch-ua-mobile: ?0
Referer:
Referer: https://gitee.com/login
Accept-Encoding:
Accept-Encoding: gzip, deflate, br
Accept-Language:
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie:
Cookie: oschina_new_user=false; user_locale=zh-CN; ...
这个GET请求包含了之前登录成功后获取的Cookie信息,用于访问个人主页
请求你中的 Cookie 字段也包含了一个 gitee-session-n 属性, 里面的值和刚才服务器返回的值相 同。 后续只要访问 gitee 这个网站, 就会一直带着这个令牌, 直到令牌过期/下次重新登陆。
这个过程和去医院看病很相似:
到医院挂号:
后续去各个科室:
看完病后注销就诊卡:
再次来医院看病:
通过这个比喻,我们可以更容易地理解身份验证的原理,以及令牌和Cookie在其中的作用。这也强调了为什么在使用完后应该注销令牌或Cookie,以保护自己的账户安全。
正文中的内容格式和 header 中的 Content-Type 密切相关。 上面也罗列了三种常见的情况。
HTTP请求正文(Request Body)是HTTP请求的一部分,它包含了客户端发送给服务器的数据或内容。请求正文的内容格式通常与请求头中的Content-Type字段密切相关,Content-Type字段指定了请求正文的数据类型和格式。
以下是几种常见的请求正文示例,每种示例与不同的Content-Type相关:
1、application/x-www-form-urlencoded:这是一种常见的请求正文格式,通常用于HTML表单提交。数据以键值对的形式编码,并以application/x-www-form-urlencoded格式发送给服务器。示例:
Content-Type: application/x-www-form-urlencoded
user=username&password=pass123
这个请求正文包含了用户的用户名和密码。
2、application/json:JSON格式的请求正文通常用于通过JSON对象发送数据给服务器。示例:
Content-Type: application/json
{
"name": "John",
"age": 30,
"city": "New York"
}
这个请求正文包含了一个JSON对象,描述了用户的名称、年龄和所在城市。
3、multipart/form-data:这种格式通常用于文件上传,允许在请求正文中包含文件数据。示例:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="example.jpg"
Content-Type: image/jpeg
(binary data for the file)
这个请求正文包含了一个文件,文件名为"example.jpg"。
HTTP请求正文的内容可以根据应用程序的需求和HTTP请求的目的而有所不同。Content-Type字段用于指定请求正文的数据类型和编码方式,以确保服务器能够正确解释和处理请求的内容。服务器会根据Content-Type的值来解析请求正文,并采取相应的操作,无论是提交表单数据、JSON对象,还是上传文件。
下面可以通过抓包来观察这几种情况:
(1)application/x-www-form-urlencoded,抓取码云上传头像请求
POST https://gitee.com/profile/upload_portrait_with_base64 HTTP/1.1
Host: gitee.com
Connection: keep-alive
Content-Length: 107389
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
Accept: */*
X-CSRF-Token: 6ROfZGr4Y7Qx8td1TuKCnrG8gbODLCSUqUBZSw2b+ac=
X-Requested-With: XMLHttpRequest
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/91.0.4472.101 Safari/537.36
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/HGtz2222
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: oschina_new_user=false; user_locale=zh-CN; yp_riddler_id=1ce4a551-a160-
4358-aa73-472762c79dc0; visit-gitee--2021-05-06%2010%3A12%3A24%20%2B0800=1;
sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22726826%22%2C%22first_id%22%3
A%22175869ba5888b6-0ea2311dc53295-303464-2073600-
175869ba5899ac%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E
7%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%2
4latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%22175869ba5888b6-
0ea2311dc53295-303464-2073600-175869ba5899ac%22%7D; remote_way=svn;
tz=Asia%2FShanghai;
Hm_lvt_24f17767262929947cc3631f99bfd274=1622637014,1622712683,1622863899,1623298
442; gitee_user=true; Hm_lpvt_24f17767262929947cc3631f99bfd274=1623298560; giteesessionn=c0hXQ0I5SjR1bWg5M01IR3RYS3hLT0RhelN1aFVuMExKdEdSSmRaQWIwRy9QWFUwV0thdzV1alIzYj
RaOU9ZeDdkZEJZK2RtTVRNeTNFRHNYVW9ha2hEcWJyclIwS1NVRG1EL0xxTmJXSGxvSzh3c28zOHBia1
pIOFQrU3RYeWE0bE13S09DTm5MZWZ5WW5WUVFpSzFiMGFWbHRDQ0xRakc1Um5yY21HQllqeUpNLzBvZF
gxbHVhN09uK2h1VVVmRHZkS3BmVGEwcDhyNjJVb1p0RFRLY0VOem5vNEEvd0FuYzJJYlhZcGlyenZQc3
dSbXBNUWI3UUwrRDBrV2N0UHZRdjFBUXF5b0Y0L1Vrd09pQVBKNkdjZmY5cHlDTCtMWG4ya0tIaW5LcE
tBTkw4cGFGVjhUQ0djMWhkOXI0bUFteUY4VW80RHl2T2Q2YmxwR1d3M3Rad1RhZWhhdnNiTTNrcE1RV2
NyZ1dYeDRoR0dpanh4bERNMTBuenB1NkgxLS16QUdJS3NlZG9mTVBtYlVlREppck1BPT0%3D-
-898d1284181ca494918d29ac44f9a3a79d448a9b
avatar=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAPgAAAD4CAYAAADB0Ss
LAAAg......
实际的抓包结果比较长, 此处没有全部贴出。
这是一个通过POST请求上传用户头像的示例。让我们来分析一下这个请求:
请求方法:这是一个HTTP POST请求。
请求目标:请求的URL是https://gitee.com/profile/upload_portrait_with_base64
请求头部:
请求正文(Body):
这个请求的主要目的是将用户头像数据上传到指定的URL。请求头中包含了一些与请求相关的信息,包括用户代理(User-Agent)、来源(Referer)、Cookie等。请求正文中包含了头像数据,可以由服务器来解析和处理。
(2)multipart/form-data 抓取系统的 "上传简历" 功能:
POST https://v.bitedu.vip/tms/oss/upload/file HTTP/1.1
Host: v.CSDN.vip
Connection: keep-alive
Content-Length: 293252
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
Authorization: Bearer
eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjFiYThjMDM5LWUyN2UtNDdhZS04YTAzLTN
mNWMzY2UwN2YyNSJ9.VQWoqrrgWZpDNc81tYfSvna8A9uZP6QKqucnvGMuY8wbavHF30rx7NG9VxnAo1
78V0nOJBd75QxRvNRgpY6-Iw
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/91.0.4472.101 Safari/537.36
Content-Type: multipart/form-data; boundary=----
WebKitFormBoundary8d5Rp4eJgrUSS3wT
Accept: */*
Origin: https://v.bitedu.vip
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://v.baidu.vip/personInf/student?userId=634
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: rememberMe=true; username=2342412223; AdminToken=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbleSI6IjFiYThjMDM5LWUyN2UtNDdhZS04Y
TAzLTNmNWMzY2UwN2YyNSJ9.VQWoqrrgWZpDNc81tYfSvna8A9uZP6QKqucnvGMuY8wbavHF30rx7NG9
VxnAo178V0nOJBd75QxRvNRgpY6-Iw
------WebKitFormBoundary8d5Rp4eJgrUSS3wT
Content-Disposition: form-data; name="file"; filename="李星亚 Java开发工程师.pdf"
Content-Type: application/pdf
%PDF-1.7
%³
1 0 obj
<> /Outlines 5 0 R /Pages 2 0 R /Type /Catalog>>
endobj
3 0 obj
<>
endobj
13 0 obj
<>
endobj
实际的抓包结果比较长, 此处没有全部贴出。
这是一个通过POST请求上传文件的示例,使用的是multipart/form-data
格式。让我来分析这个请求:
请求方法:这是一个HTTP POST请求。
请求目标:请求的URL是https://v.CSDN.vip/tms/oss/upload/file。
请求头部:
请求正文(Body):
这个请求的主要目的是将一个文件上传到指定的URL,文件的名称是"李星亚 Java开发工程师.pdf",文件类型为PDF。请求头中包含了一些与请求相关的信息,包括用户代理(User-Agent)、授权信息(Authorization)、来源(Referer)、Cookie等。请求正文以multipart/form-data格式包含了文件数据。
(3) application/json 抓取系统的 "上传简历" 功能:
POST https://v.bitedu.vip/tms/login HTTP/1.1
Host: v.CSDN.vip
Connection: keep-alive
Content-Length: 105
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/91.0.4472.101 Safari/537.36
Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS
Content-Type: application/json;charset=UTF-8
Access-Control-Allow-Origin: *
Accept: application/json, text/plain, */*
Access-Control-Allow-Headers: Content-Type, Content-Length, Authorization,
Accept, X-Requested-With , yourHeaderFeild
Origin: https://v.CSDN.vip
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://v.CSDN.vip/login
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: rememberMe=true; username=123456789
{"username":"123456789","password":"xxxx","code":"u58u","uuid":"9bd8e09ea27b48cd
acc6a6bc41d9f462"}
这是一个通过POST请求发送JSON数据的示例。下面是对这个请求的分析:
请求方法:这是一个HTTP POST请求。
请求目标:请求的URL是 https://v.CSDN.vip/tms/login 。
请求头部:
请求正文(Body):
这个请求的主要目的是向 https://v.CSDN.vip/tms/login 发送一个JSON数据,包含了用户名、密码、验证码等信息。请求头中包含了一些与请求相关的信息,包括用户代理(User-Agent)、CORS设置、来源(Referer)、Cookie等。
HTTP响应是服务器对客户端请求的回复。每次你在浏览器中输入一个URL、点击一个链接或者通过其他方式进行网络请求,都会收到一个HTTP响应。HTTP响应由三部分组成:状态行、响应头和响应正文。
状态行:这是响应的第一行,包含了HTTP版本、状态码和状态描述。例如:"HTTP/1.1 200 OK"。
认识 "状态码" (status code)
HTTP响应的状态码(Status Code)是用于表示请求处理结果的三位数字代码,表示访问一个页面的结果。每个状态码对应一种不同的响应情况,用于通知客户端发出的请求是否成功,或者出现了什么问题。
状态码:状态码是一个三位数,用于表示请求的处理结果。状态码的第一个数字定义了响应的类别:
1xx
:信息响应。表示请求已接收,继续处理。2xx
:成功。表示请求已被成功接收、理解和接受。3xx
:重定向。要完成请求,需要进一步操作。4xx
:客户端错误。请求包含语法错误或无法完成。5xx
:服务器错误。服务器在处理请求时发生错误。以下是一些常见的HTTP状态码:
200 OK:这是最常见的状态码,表示请求已成功处理。服务器已返回请求的数据。
201 Created:表示请求已经成功,并且服务器创建了一个新的资源,通常在POST请求成功后返回。
204 No Content:表示请求已成功处理,但响应不包含实体主体。通常用于DELETE请求。
400 Bad Request:客户端请求有语法错误,服务器无法理解。
401 Unauthorized:表示需要进行身份验证或者认证信息无效,通常要求用户提供有效的用户名和密码。
403 Forbidden:服务器已经理解请求,但拒绝执行它,通常是因为权限不足。
404 Not Found:请求的资源未找到。
500 Internal Server Error:表示服务器在执行请求时出现了错误,客户端通常无法解决。
502 Bad Gateway:服务器作为网关或代理,从上游服务器接收到无效响应。
503 Service Unavailable:服务器当前无法处理请求,通常是因为服务器过载或正在维护。
这些状态码帮助客户端理解请求的结果,根据不同的状态码,客户端可以采取相应的行动。HTTP协议还有许多其他状态码,每个状态码都有特定的含义。理解这些状态码有助于开发者和系统管理员更好地诊断和解决HTTP请求和响应的问题。
认识重定向
重定向是一种HTTP响应机制,用于将客户端请求从一个URL(通常是A)重定向到另一个URL(通常是B)。重定向是服务器向客户端发出的指令,告诉客户端重新发起请求,但这次请求的目标是新的URL。
HTTP重定向通常用于以下情况:
永久重定向——资源永久移动:HTTP状态码301 Moved Permanently表示资源的位置已永久移动到新的URL,客户端应该将以后的请求直接发送到新的URL。可缓存。
临时重定向——资源临时移动:HTTP状态码302 Found表示资源的位置已临时移动到新的URL,客户端应该发送下一个请求到新的URL。这个重定向可能只是暂时的。不可缓存。
登录或认证:网站可能要求用户登录或提供身份验证信息才能访问某些资源。如果用户尚未登录或未提供必要的身份验证信息,服务器可能返回一个重定向响应,将用户引导到登录页面。
URL重写或规范化:有时,服务器将对URL进行规范化或重写,以确保一致性和遵循最佳实践。这可以通过重定向来实现。
很多时候页面跳转也可以通过重定向来实现,还有的时候某个网站/服务器迁移了(IP/域名改变),就可以给旧的地址一个重定向响应,访问地址就会
重定向在Web开发和网站维护中非常常见,用于多种情况,包括页面跳转和处理服务器迁移。以下是一些常见的应用情景:
页面跳转:重定向经常用于实现页面跳转,如从一个URL重定向到另一个URL。这可以用于用户登录后自动跳转到他们的个人资料页面,或者从旧的URL跳转到新的URL以维护网站的结构和导航。
服务器迁移:当网站的服务器或IP地址发生变化时,服务器可以向旧的地址发送重定向响应,将访问者引导到新的地址。这有助于确保旧的链接仍然有效,避免了断裂的链接和丢失的访问者。
SEO优化:在搜索引擎优化(SEO)方面,重定向是维护网站的排名和搜索引擎索引的关键工具。当网页的URL结构发生变化时,通过使用301永久重定向,可以将搜索引擎引导到新的URL,以确保排名和索引的连续性。
身份验证和授权:网站可能会使用重定向来引导用户进行身份验证,例如在用户未登录时将他们重定向到登录页面。一旦登录成功,他们将被重定向回原始请求的页面。
重定向是HTTP协议的一个强大特性,它允许网站管理者以一种用户友好的方式维护网站结构,同时确保访问者能够访问所需的内容。这对于提供良好的用户体验和维护网站的可用性至关重要。
总的来说,重定向是HTTP中的一种重要机制,允许服务器将客户端请求引导到新的URL,以实现资源的移动、登录、规范化等目的。客户端收到重定向响应后,会自动向新的URL重新发送请求。
这是一个最常见的状态码, 表示访问成功。
抓包抓到的大部分结果都是 200:
例如访问搜狗主页:
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 10 Jun 2021 06:07:27 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: black_passportid=; path=/; expires=Thu, 01 Jan 1970 00:00:00
GMT; domain=.sogou.com
Pragma: No-cache
Cache-Control: max-age=0
Expires: Thu, 10 Jun 2021 06:07:27 GMT
UUID: 80022370-065c-49b0-a970-31bc467ff244
Content-Length: 14805