一、统一资源定位符URL
平时我们俗称的 “网址” 其实说的就是 URL
URL(Uniform Resource Locator,统一资源定位符)是互联网上用于定位资源的字符串。它定义了资源的地址,允许用户通过Web浏览器或其他工具访问这些资源。URL通常由几个部分组成,每个部分都有其特定的含义。下面是对URL的基本介绍,以及它各个部分的说明:
1.1 URL的基本结构
一个典型的URL由以下几部分组成,各部分之间用冒号(:
)、斜杠(/
)等分隔符分隔:
scheme://username:password@host:port/path?query#fragment
- scheme(协议):指定了访问资源时所使用的协议类型,如
http
、https
、ftp
等。 - username:password(用户名:密码):指定了访问资源时可能需要的用户名和密码(可选)。现代Web应用中,出于安全考虑,直接在URL中传递用户名和密码的做法已经较少见。
- host(主机名):资源所在的服务器名称(域名)或IP地址。
- port(端口号):指定了服务器监听的端口号,用于区分同一主机上运行的不同服务(可选,默认为协议的标准端口,如HTTP的80,HTTPS的443)。
- path(路径):资源在服务器上的具体位置。
- query(查询字符串):可选部分,用于向服务器传递额外的信息,通常以键值对的形式出现,多个键值对之间用
&
分隔。 - fragment(片段标识符):指定了资源内部的一个片段或锚点,浏览器会自动滚动到该位置(仅在客户端有效,不发送给服务器)。
示例
https://www.example.com/path/to/resource?name=value#section1
- scheme:
https
,表示使用HTTPS协议进行通信。 - host:
www.example.com
,是资源所在的服务器地址。 - path:
/path/to/resource
,是资源在服务器上的具体位置。 - query:
?name=value
,是传递给服务器的查询参数。 - fragment:
#section1
,是指向资源内部section1
部分的锚点。
URL是互联网上资源访问的基础,理解其结构对于进行Web开发、网络爬虫、SEO优化等工作都非常重要。
1.2 域名和域名解析
域名系统:
由于IP地址是一串难以记忆的数字(如192.0.2.1
),人们设计了域名系统(DNS, Domain Name System)来将域名和IP地址相互映射,以便更方便地访问互联网资源。域名解析(Domain Name Resolution)是将域名转换为IP地址的过程。
域名的组成:
域名由多个部分组成,包括数字和字母,但每个标号(即用点分隔的每一部分)不超过63个字符,且除了连字符(-)外不能使用其他标点符号。级别最低的域名写在最左边,而级别最高的域名写在最右边。例如,在域名www.example.com
中,com
是顶级域名(TLD),example
是二级域名,www
是主机名(也可以称为子域名)。域名是需要注册和购买的。
域名解析的过程:
当用户输入一个域名(如www.example.com
)并尝试访问时,浏览器会向DNS服务器(位于运营商数据中心)发送一个查询请求。DNS服务器会查找该域名对应的IP地址,并将其返回给浏览器。浏览器随后使用该IP地址与对应的服务器建立连接,从而访问所需的资源。
- 查询:用户在浏览器中输入域名,浏览器向DNS服务器发送查询请求。
- 解析:DNS服务器查找域名对应的IP地址,并将其返回给浏览器。
- 连接:浏览器使用返回的IP地址与服务器建立连接,访问所需资源。
总之,域名和域名解析是互联网中不可或缺的部分,它们共同构成了网络世界的基石,使得人们能够方便地访问和共享各种网络资源。
1.3 Web根目录
Web根目录是Web服务器上存放网站文件的最顶层目录。它是Web服务器的默认文件夹,所有的网站文件都存放在该目录下。Web服务器根目录一般由Web服务器软件的配置文件指定,常见的Web服务器软件如Apache、Nginx等都会在其配置文件中指定一个文件夹作为根目录。
Web根目录在Web服务器的工作流程中扮演着至关重要的角色。当用户在浏览器中输入网站的域名或IP地址时,Web服务器会根据配置文件中指定的根目录路径去查找对应的文件。例如,如果根目录被设定为/var/www/html
,而用户请求的网页文件路径为/index.html
,那么Web服务器就会在/var/www/html
目录下寻找index.html
文件,并将其发送给用户的浏览器进行显示。
Web根目录的作用主要体现在以下几个方面:
- 存放网站文件:Web根目录是存放网站文件的最外层目录,包括HTML页面、CSS样式表、JavaScript脚本、图片、视频、音频等所有与网站相关的文件。这些文件构成了网站的主体内容,是网站得以正常运行的基础。
- 定义网站的访问路径:Web根目录中的文件和文件夹的相对路径关系可以定义网站的访问路径。例如,根目录下的
index.html
文件可以通过访问根路径(如http://example.com
)或者访问根路径下的index.html
(如http://example.com/index.html
)来访问。 - 默认网页的显示:当用户访问Web服务器的根目录时,服务器会根据配置显示一个默认网页(首页)。这个默认网页通常是
index.html
、index.php
或default.html
等文件名。如果存在这样的默认网页文件,服务器将自动加载并显示它。 - 访问控制:Web根目录可能包含敏感数据或需要保密的文件。因此,Web服务器通常会根据访问权限控制根目录中文件的查看和访问。这可以通过服务器配置文件或访问控制列表(ACL)来实现。
1.4 URL编码
URL编码(也称为百分比编码或URL转义)是一种将非ASCII字符(如汉字)和某些特殊字符转换为可在URL中安全传输的格式的方法。这是必要的,因为URL的标准格式(URI)仅包含ASCII字符的一个子集,并且保留了某些字符(如/
、?
、#
等)用于特殊用途。
URL编码
URL编码过程将不安全的字符替换为%
后跟两位十六进制数的形式。例如,空格字符在URL中是不安全的,因为它可能被解释为URL不同部分的分隔符。因此,空格通常被编码为%20
。
一些常用的URL编码字符包括:
- 空格 (
%20
#
编码为%23
%
本身编码为%25
&
编码为%26
+
编码为%2B
/
在某些上下文中(如路径部分)不需要编码,但在查询字符串中作为分隔符使用时,如果需要将其作为普通字符传递,则可能需要编码为%2F
?
编码为%3F
=
编码为%3D
URL解码
URL解码是编码的逆过程,即将%
后跟两位十六进制数转换回原始字符。
二、HTTP协议格式
HTTP协议(Hypertext Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它基于TCP/IP协议运行,是Web上进行数据交换的基础,也是一种客户端-服务器协议。HTTP协议的基本格式包括请求(Request)和响应(Response)两部分,下面分别进行介绍:
2.1 HTTP请求(Request)
HTTP请求由四部分组成:请求行(Request Line)、请求头部(Header)、空行和请求体(Body,可选)。
-
请求行
- 格式:
[方法] [URL] [HTTP版本]
- 示例:
GET /index.html HTTP/1.1
- 方法:常见的有GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE、CONNECT等。
- URL:统一资源定位符,用于定位互联网上的资源。
- HTTP版本:指示客户端使用的HTTP协议版本,如HTTP/1.1。
- 格式:
-
请求头部
- HTTP 头部(Headers)是 HTTP 请求和响应消息中非常关键的一部分,它们包含了关于请求或响应的元信息(metadata)。
- 格式:键值对结构,每对键值占一行,键和值之间用冒号+空格分隔,如
Host: www.baidu.com
。
-
空行
- 用来分隔请求头部和请求体。
-
请求体(可选)
- 当使用POST、PUT等方法时,请求体包含要发送给服务器的数据。
- 数据格式和长度由请求头部的Content-Type和Content-Length指定。
2.2 HTTP响应(Response)
HTTP响应也由四部分组成:状态行(Status Line)、响应头部(Header)、空行和响应体(Body)。
- 状态行
- 格式:
[HTTP版本] [状态码] [状态消息]
- 示例:
HTTP/1.1 200 OK
- HTTP版本:响应使用的HTTP协议版本。
- 状态码:表示请求的处理结果,如200表示成功,404表示未找到资源。
- 状态消息:对状态码的简单文本描述。
- 格式:
- 响应头部
- 格式与请求头部相同,也是键值对结构,键和值之间用冒号+空格分隔。
- 空行
- 用来分隔响应头部和响应体。
- 响应体
- 服务器返回给客户端的资源内容,如HTML文档、图片等。
- 响应体的长度和内容类型由响应头部的Content-Length和Content-Type指定。
2.3 调试代理工具Fiddler
Fiddler是一款功能强大、易于使用的HTTP协议调试代理工具,它能够帮助开发人员和测试人员更好地理解和调试网络流量。通过捕获和查看HTTP/HTTPS请求和响应的详细信息,Fiddler可以帮助用户分析和诊断网络通信中的问题,优化性能,提高开发效率。
主要功能
- 网络调试和分析:
- Fiddler能够捕获和查看HTTP/HTTPS请求和响应的详细信息,包括请求头、请求体、响应头和响应体等。
- 通过这些信息,开发人员和测试人员可以分析和诊断网络通信中的问题,识别错误,优化性能,并进行网络安全测试。
- 修改和篡改请求:
- Fiddler允许用户修改和篡改网络请求,以模拟不同的场景。
- 用户可以更改请求头、请求参数、请求体等,以查看服务端的不同响应,这对于测试和调试非常有用。
- 模拟网络环境:
- Fiddler可以模拟慢速网络连接、高延迟、网络丢包等不同网络环境,以测试应用程序在不同网络条件下的表现。
- 这对于评估应用程序的性能和可靠性非常有帮助。
- 自定义扩展和脚本:
- Fiddler具有强大的扩展功能,允许开发人员编写自定义扩展和脚本,以执行各种自动化任务和增强Fiddler的功能。
- 用户可以根据自己的需求来定制Fiddler,并实现更多的自动化功能。
工作原理
- Fiddler以代理web服务器的形式工作,它使用代理地址127.0.0.1和端口8888。
- 当Fiddler启动时,它会将自己变成一个代理服务器,并默认监听127.0.0.1:8888。
- 浏览器或其他客户端在发送HTTP请求时,会先经过Fiddler,然后Fiddler再将请求转发给服务器。
- 服务器返回响应时,也会先经过Fiddler,然后Fiddler再将响应返回给客户端。
安装与基本操作
- 官网下载地址:Download Fiddler Web Debugging Tool for Free by Telerik
- 基本操作视频:Fiddler实战1-fiddler的下载与安装_哔哩哔哩_bilibili
三、HTTP请求的方法
HTTP请求的GET和POST方法是HTTP协议中两种最基本且最常用的请求方法,它们各自具有不同的特点和用途。
3.1 GET方法
GET方法主要用于从服务器获取资源,也可以用于向服务器传递请求参数。以下是GET方法的一些关键特点:
- 请求参数通过URL传递:GET请求将请求参数附加在URL后面,以查询字符串的形式进行传递。例如,
http://example.com/resource?param1=value1¶m2=value2
。 - 请求参数长度有限制:由于请求参数是作为URL的一部分传递的,因此URL长度有限制。不同的浏览器和服务器对URL长度的限制可能有所不同,但通常在几千个字符左右。
- 请求结果可被缓存:GET请求被视为幂等的,即多次对同一URL发起GET请求,应得到相同的结果。因此,GET请求的结果可以被缓存,以提高网络性能和资源利用率。
- 请求可被收藏和分享:由于GET请求的参数直接暴露在URL中,因此带有特定参数的URL可以被收藏或分享给他人,以便他们直接访问相同的资源。
- 请求对服务器无副作用:GET请求应仅用于获取资源,而不应对服务器进行任何修改操作。因此,GET请求不应产生服务器端的副作用。
- 请求数据在URL中可见:由于请求参数直接暴露在URL中,敏感信息不应通过GET请求传递,以避免信息泄露。
GET方法常用于浏览器请求网页、获取静态资源、进行搜索等场景。
3.2 POST方法
POST方法主要用于向服务器提交数据,通常是用来创建新资源或者对现有资源进行修改。以下是POST方法的一些关键特点:
- 请求参数包含在请求体中:与GET方法不同,POST请求的参数不是附加在URL上,而是包含在请求体中。这意味着POST请求可以提交大量的数据,且不受URL长度限制。
- 数据类型和编码方式灵活:POST请求支持多种数据类型和编码方式。例如,
application/x-www-form-urlencoded
是最常见的 POST 数据提交方式,它用于模拟表单提交;multipart/form-data
主要用于文件上传;而application/json
则常用于提交JSON格式的数据,便于处理复杂的结构化数据。 - 对数据的修改:POST请求通常用于提交数据以创建新资源或修改现有资源。与GET请求不同,POST请求可能对服务器上的资源状态产生影响。
- 安全性:由于POST请求的参数不会直接暴露在URL中,因此它在一定程度上比GET请求更安全。然而,这并不意味着POST请求可以完全避免安全漏洞,如跨站请求伪造(CSRF)等。
POST方法常用于表单提交、文件上传、数据更新等场景。
3.3 接口测试工具Postman
Postman是一款功能强大的接口测试工具,它主要用于测试HTTP请求,并支持各种HTTP请求方法,包括GET、POST、PUT、DELETE等。
基本概述
- 定义:Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,并获取对应的响应结果,从而验证响应中的结果数据是否和预期值相匹配。
- 应用场景:Postman广泛应用于接口测试和开发阶段,帮助开发人员和测试人员快速、高效地测试和管理API接口。
主要功能
- 支持多种HTTP请求方法:Postman支持HTTP协议的所有请求方式,满足各种测试需求。
- 请求参数设置:用户可以设置请求的URL参数、请求头、请求体等,支持表单格式和JSON格式的数据发送。
- 模拟登录和Cookies管理:Postman可以模拟登录过程,保存登录后的Cookies,以便在后续的请求中使用。
- 数据同步和团队协作:支持数据同步功能,可以在不同设备上同步测试数据;支持团队协作,可以推送请求给团队成员执行或继续开发。
- 接口开发和测试全流程支持:从接口开发到测试,再到模拟测试和监控,Postman提供了全面的支持。
- 内置脚本和测试自动化:支持编写内置脚本进行接口测试自动化,提高测试效率。
安装与基本操作
使用Postman测试GET方法
请求URL:https://wis.qq.com/weather/common
请求方式:GET
参数:
参数名 必选 类型 说明
source 是 string pc
weather_type 是 string observe
province 是 string 省
city 是 string 市
county 是 string 县
请求和返回示例:
四、HTTP响应的状态码
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。我们常见的404 Not Found就是HTTP状态码之一。
4.1 状态码的分类
所有状态码的第一个数字代表了响应的五种状态之一:
- 1xx(信息性状态码):表示临时的响应,需要请求者继续执行操作。
- 2xx(成功状态码):表示请求已成功被服务器接收、理解并处理。
- 3xx(重定向状态码):表示客户端需要采取进一步的操作才能完成请求。
- 4xx(客户端错误状态码):表示请求包含错误或无法被服务器理解。
- 5xx(服务器错误状态码):表示服务器在处理请求时遇到了错误。
4.2 常见状态码的含义
- 200 OK:请求已成功,请求所希望的响应内容将会在消息主体中返回。
- 204 No Content:服务器成功处理了请求,但没有返回任何内容。
- 301 Moved Permanently:请求的资源已经永久移动到新的URL,应使用新的URL进行访问(永久移动)。
- 302 Found:请求的资源临时从不同的URI返回(临时移动)。
- 400 Bad Request:服务器不理解请求的语法。
- 401 Unauthorized:请求需要用户验证。
- 403 Forbidden:服务器理解请求,但拒绝执行。
- 404 Not Found:服务器无法找到请求的资源。
- 500 Internal Server Error:服务器遇到错误,无法完成请求。
- 503 Service Unavailable:服务器当前无法处理请求,由于维护或过载。
五、HTTP头部的常见字段
5.1 常见的请求头部字段
-
Host:请求资源的主机名和端口号。
-
User-Agent:发出请求的客户端信息,其中包括操作系统和浏览器信息。
-
Accept:客户端能够接收的内容类型。
-
Accept-Language:客户端首选的语言。
-
Referer: 当前页面是从哪个页面或资源跳转过来的;
-
Connection:指示是否需要保持连接打开(keep-alive),或者请求/响应完成后关闭。在HTTP/1.1中,默认是keep-alive,但在HTTP/1.0中可能需要显式指定。
-
Cookie(如果cookie存在):这是客户端发送给服务器的。在随后的请求中,如果客户端需要向服务器发送之前存储的cookie,它会在HTTP请求的头部中包含一个
Cookie
字段。这个字段包含了客户端想要发送给服务器的所有cookie的名称和值,通常以分号和空格分隔。 -
Content-Type(如果请求体存在):请求体的媒体类型。
-
Content-Length(如果请求体存在):请求体的长度。
5.2 常见的响应头部字段
- Server:服务器软件的信息,如Apache/2.4.25 (Unix)。这个头部可以被用来识别特定的服务器软件,但也可能暴露给攻击者一些安全相关的细节。
- Connection:指定连接类型,如keep-alive表示持久连接。
- Set-Cookie:这是服务器发送给客户端的。当服务器想要设置或更新客户端的cookie时,它会在HTTP响应的头部中包含一个或多个
Set-Cookie
字段。这些字段告诉客户端(如浏览器)应该存储哪些cookie信息。 - Location: 搭配3xx状态码使用,用于指示请求的资源现在位于何处,或者客户端应该使用哪个URI来访问请求的资源。它通常与HTTP重定向相关,当服务器希望客户端访问另一个URI时,会在响应中包含Location字段,并返回状态码如301(永久移动)、302(临时移动)或307(临时重定向)等。
- Date:响应生成的日期和时间。
- Content-Type:响应体的媒体类型。
- Content-Length:响应体的长度。
六、HTTP协议的特性
HTTP协议具有无状态性和无连接性两个重要特性,下面分别进行介绍:
6.1 无状态性
定义:
HTTP协议的无状态性指的是协议对于事务处理没有记忆能力。即服务器不会保存任何客户端的状态信息,每次请求都是独立的,服务器不会记住之前的请求。
原因:
HTTP无状态的根本原因在于浏览器与服务器之间是通过Socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的Socket连接,并且服务器也会在处理完页面之后销毁页面对象。
优缺点:
- 优点:解放了服务器,使服务器不需要持续追踪和管理客户端的状态,每一次请求都“点到为止”,不会造成不必要的连接占用,提高了服务器的处理效率和可伸缩性。
- 缺点:如果后续处理需要前面的信息,则必须重传,这可能导致每次连接传送的数据量增大,增加了网络负担。此外,无状态性也阻碍了需要保持状态的Web应用程序的实现。
解决方案:
为了处理HTTP无状态带来的问题,引入了Cookie和Session机制。HTTP协议中的Cookie和Session机制是Web开发中用于管理用户会话状态的两种重要技术。Cookie通过客户端保持状态,Session则通过服务器保持状态。这两种机制通过在客户端和服务器之间传递标识符来跟踪会话状态。
6.1.1 Cookie机制
1. 定义
Cookie是由W3C组织提出,并在Netscape社区发展起来的一种机制,目前已成为标准,被所有主流浏览器支持。Cookie是一种在客户端保存少量数据并随每次请求发送到服务器的技术。
2. 工作原理
- 当用户首次访问Web站点时,服务器会在HTTP响应头中包含一个Set-Cookie字段,将Cookie信息发送给客户端(浏览器)。
- 浏览器将Cookie信息保存在用户的计算机上(内存级或文件级),并在后续对同一网站的请求中,将Cookie信息添加到HTTP请求头中发送给服务器。
- 服务器通过读取Cookie信息来识别用户身份,并据此提供相应的响应。
3. 主要属性
- NAME=VALUE:指定Cookie的名称和值,名称大小写不敏感,值必须经过URL编码。
- domain:Cookie的有效域名,即哪些域名下的请求会带上这个Cookie。
- path:指定向域中的哪个路径发送请求时,应该带上这个Cookie。
- expires/max-age:Cookie的有效时间,指定何时应该停止向服务器发送这个Cookie。如果未设置,默认为浏览器会话结束即删除。
- Secure:仅在HTTPS安全通信时才会发送Cookie。
- HttpOnly:该Cookie不能被脚本访问,提高了安全性。
4. 优缺点
- 优点:
- 无需在服务器端保存大量数据,减轻了服务器的负担。
- Cookie的读写操作简单,易于实现。
- 缺点:
- Cookie数据存储在客户端,容易被篡改或窃取,存在安全隐患。
- Cookie的大小和数量受到浏览器限制,不能存储大量数据。
6.1.2 Session机制
1. 定义
Session是一种在服务器端保存用户会话状态的技术。每个用户访问网站时,服务器都会为其创建一个唯一的会话ID(Session ID),并通过Cookie或URL重写等方式将这个会话ID发送给客户端。客户端在后续的请求中会携带这个会话ID,服务器通过识别会话ID来恢复用户的会话状态。
2. 工作原理
- 用户首次访问Web站点时,服务器为其创建一个会话ID,并将其存储在服务器上(通常是内存或数据库中)。
- 服务器将会话ID通过Cookie或URL重写等方式发送给客户端。
- 客户端在后续的请求中会携带会话ID,服务器通过识别会话ID来恢复用户的会话状态。
3. 优缺点
- 优点:
- 会话数据存储在服务器端,更加安全,不易被篡改或窃取。
- 可以存储大量数据,不受客户端限制。
- 缺点:
- 服务器需要保存大量会话数据,增加了服务器的负担。
- 如果用户很多,服务器会存储大量的Session,消耗大量的内存。
6.2 无连接性
定义:
HTTP协议的无连接性指的是每次连接只处理一个请求,服务端处理完客户端一次请求,等到客户端作出回应之后便断开连接。这种无连接性可以节省服务器资源,但也会增加每个请求的延迟,因为需要重新建立连接。
发展:
- HTTP/1.0:提出了持久连接(Keep-Alive)的概念,允许一个TCP连接处理多个HTTP请求,减少了建立和断开连接的次数。
- HTTP/1.1:将持久连接作为默认连接方式,进一步提高了传输效率。同时,提出了pipelining的概念,允许客户端在收到前一个请求的响应之前发送多个请求,但服务器仍需按照请求的顺序返回响应。
- HTTP/2:引入了多路复用(multiplexing)技术,允许多个请求和响应的传输完全混杂在一起进行,通过streamID来互相区别,极大地提高了传输效率。
注意:互联网上的服务器可能采用不同版本的HTTP协议,各版本对长连接的支持技术不同,可能存在兼容性问题。因此在客户端首次访问服务器时,通信双方交换HTTP协议的版本(请求行和状态行),通过协商确定通信双方是否都支持长连接技术,之后才能正常进行长连接通信。
总结:
HTTP协议的无状态性和无连接性是其设计之初就确定的基本特性。无状态性简化了服务器的设计,提高了服务器的处理效率,但也带来了状态管理的问题;无连接性则通过不断的发展和改进,从最初的每次连接只处理一个请求,到持久连接、pipelining,再到HTTP/2的多路复用技术,逐步提高了传输效率和用户体验。