接上次博客: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 协议概念 

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 协议发展历程 

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协议在许多不同的场景中都得到了广泛的应用,其中包括浏览器打开网站和手机应用程序访问服务器。以下是这两种常见情况的简要说明:

1. 浏览器打开网站:

当我们在Web浏览器中输入网站地址或点击书签时,会发生以下过程:

浏览器将发送一个HTTP请求到目标网站的服务器,请求指定的网页或资源。 目标服务器接收到请求后,会根据请求的路径和其他信息查找并准备要发送的资源。 服务器会构建HTTP响应,其中包括所请求资源的内容以及一些元数据,如响应状态代码、响应头(包含有关响应的元信息)等。 服务器将HTTP响应发送回浏览器。 浏览器接收响应后,会解析响应内容,渲染页面并显示在用户的屏幕上。 用户可以与网页交互,点击链接、填写表单等。

这是典型的HTTP协议用例,其中HTTP用于在浏览器和服务器之间传输网页和相关资源。

2. 手机应用程序访问服务器:

移动应用程序通常需要与服务器通信来获取数据、更新内容、进行用户身份验证等。在这种情况下,HTTP通常用于构建移动应用程序与服务器之间的通信。

移动应用程序会使用HTTP请求与服务器交互。这可以包括GET请求来获取数据、POST请求来提交表单数据或执行其他操作,以及其他HTTP方法。 服务器将处理这些请求,执行相关操作,然后构建HTTP响应,将所需的数据或响应状态返回给应用程序。 移动应用程序将解析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的菜单栏中,选择“Tools”(工具) > “Options”(选项)。在选项对话框中,选择“HTTPS”选项卡。在该选项卡下,勾选“Capture HTTPS CONNECTs”和“Decrypt HTTPS traffic”选项。 安装Fiddler根证书:

一旦你启用了HTTPS抓包功能,Fiddler会充当中间代理,要能够解密HTTPS流量,就需要安装Fiddler根证书。在Fiddler选项对话框的“HTTPS”选项卡下,单击“Actions”(操作)。在下拉菜单中,选择“Trust Root Certificate”(信任根证书)。按照提示,将Fiddler根证书安装到你的操作系统或浏览器中。这将允许Fiddler解密HTTPS流量并进行分析。 开始抓包:

确保Fiddler已经启动并配置为捕获HTTPS流量。打开任何浏览器或应用程序,执行你希望分析的操作,以触发HTTPS流量。在Fiddler的左侧列表中,你将看到捕获的请求和响应,包括HTTP和HTTPS的内容。单击每个请求或响应,以查看详细信息,包括请求报文和响应报文。

注意,安装Fiddler根证书可能需要管理员权限,并且在某些操作系统和浏览器中,你可能需要额外的配置步骤。一旦配置完成,就可以使用Fiddler来分析HTTPS流量,检查请求和响应的详细信息,以及进行网络调试。

安装的 Fiddler 需要手动开启HTTP功能,并且安装证书,否则只能抓http。

安装根证书,一定要选择“同意”,否则你就只能卸载重装了: 

 把该勾选的项都勾选上:

这样就正常了:

但是Fiddler 本质上是一个“代理”,可能会和其他的代理软件冲突。

Fiddler在其核心上是一个正向代理服务器,用于HTTP和HTTPS网络调试。它充当客户端(例如Web浏览器)和目标服务器之间的中间人,允许开发人员捕获、查看和修改这两方之间的交互数据。

正向代理和反向代理是两种代理服务器的不同用途:

正向代理(Forward Proxy):

正向代理是代理服务器,代表客户端发起请求,以隐藏客户端的身份或绕过防火墙等网络安全限制。客户端(例如,浏览器)配置正向代理服务器的地址和端口,然后将请求发送到代理服务器。代理服务器代表客户端发起请求,接收响应,然后将响应返回给客户端。正向代理充当客户端的中介,客户端的请求似乎是来自代理服务器而不是客户端自身。这可用于访问受限制的内容或绕过网络过滤。 反向代理(Reverse Proxy):

反向代理是代理服务器,代表服务器接收请求,并将请求路由到后端服务器以获取响应,然后将响应返回给客户端。客户端向反向代理服务器发出请求,但客户端不知道或不需要知道响应来自哪个后端服务器。反向代理通常用于负载均衡、安全性和性能优化,将客户端的请求分发给多个后端服务器以提高性能,并隐藏后端服务器的身份以增强安全性。

以下是Fiddler作为正向代理的程序过程:

当你启动Fiddler时,它会开始监听指定的端口(默认为8888)。你需要在浏览器或其他需要监视的应用程序中,将Fiddler设置为正向代理。通常,这意味着你将网络设置中的代理指向127.0.0.1(本地主机)的端口8888。当你的浏览器或应用程序发起一个网络请求时,请求首先发送到Fiddler。Fiddler捕获请求并在其用户界面中显示详细信息。在此阶段,开发人员可以查看或修改请求内容。一旦完成,Fiddler将请求转发到目标服务器。目标服务器处理请求并将响应发送回Fiddler。Fiddler捕获响应并在其用户界面中显示。开发人员可以查看或修改响应内容。一旦完成,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的颜色编码如下:

蓝色:通常表示返回的是HTML内容,也就是网页的主体部分。HTML通常是由文本、标记和链接组成的,用于呈现网页的结构和内容。黑色:通常表示其他类型的数据,例如JSON、XML、纯文本或二进制数据,这些数据可以用于各种不同的应用,如API通信、文件传输等。绿色:表示成功的HTTP请求。红色:表示HTTP请求失败或返回错误状态码,如404(未找到)或500(服务器内部错误)。黄色:表示重定向的请求,即服务器返回了重定向状态码,如302(临时重定向)。灰色:表示请求是被缓存的。紫色:表示WebSocket通信。

这些颜色编码有助于用户迅速识别HTTP请求和响应的状态和类型。例如,红色的请求和响应通常表示问题或错误,绿色的请求和响应表示成功,黄色表示重定向,等等。这使得Fiddler成为一个强大的网络调试工具,有助于开发人员分析和解决与HTTP通信相关的问题。

HTTP协议是文本格式的协议,我们点开协议里面的HTTP请求部分,会发现内容都是字符串。

我们之前学的TCP和UDP、IP都是二进制。

HTTP响应其实也是文本的,但是直接查看我们看到的是二进制文件,因为这里是压缩后的。

HTTP响应经常会被压缩,压缩之后体积会变小,传输的时候节省网络带宽。

解压缩点这个按钮:

 

解压缩之后可以看到响应的数据其实是HTML。浏览器显示的网页就是HTML,往往都是浏览器先请求对应的服务器,从服务器那边拿到的页面数据。 

HTTP请求报文格式:

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

Please turn on JavaScript

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时使用,例如表单数据或上传的文件。

从行的角度来看:

首行:

第一部分是HTTP请求的方法(GET、POST、PUT等),它指示了客户端希望执行的操作。第二部分是URL(Uniform Resource Locator),描述了所请求资源在网络上的位置。第三部分是HTTP协议的版本号,例如,HTTP/1.1。 请求头(Header):

请求头是一系列键值对,每一对键值对都描述了请求的元数据信息。键和值之间使用冒号和空格分隔,如Host: www.example.com。请求头用于传递客户端的信息和需求,如User-Agent、Accept、Cookie等。 空行:

空行是请求头的结束标记,它表示请求头部分的结束。 请求正文(Body):

请求正文是可选的,它包含请求的数据,如表单提交的数据或上传的文件内容。并非所有HTTP请求都包含请求正文。

HTTP响应报文格式:

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)_网课宝盒

中国大学mooc现代邮政英语(English for Modern Postal Service)

您已经看过

[清空]