首页 > 编程笔记

HTTP是什么(入门必读)

HTTP 全称 HyperText Transfer Protocol,翻译过来叫做超文本传输协议,是因特网上应用最广泛的一种网络传输协议,所有WWW文件都必须遵守这个标准。

HTTP 是基于 TCP/IP 协议传送数据的,并且允许传送任意类型的数据对象,包括 HTML 文件、普通文本数据和二进制数据等。

HTTP 主要工作于 B/S 架构上,浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务器发送所有请求,服务器则根据接收的请求,向客户端发送对应的响应信息。

HTTP的特点

1) HTTP连接是一次性的

HTTP 限制每次连接只能处理一个请求,当服务器返回本次请求的响应信息后,便立即关闭连接,下一次请求时再重新建立连接。

HTTP 的一次性连接主要考虑到服务器面对的是成千上万个 Internet 用户,所以只能提供有限个连接,并且服务器不会让一个连接处于等待状态,因为及时地释放连接可以大幅提升服务器的执行效率。

2) HTTP是一种无状态协议

无状态是指协议对于事务的处理没有任何记忆能力,这就极大地减轻了服务器的负担,从而可以保持较快的响应速度。

3) HTTP支持持久连接

在 HTTP 1.1 中,引入了管道机制,即允许客户端不用等待上一次请求的响应信息返回,就可以发出下一次请求,但服务器必须按照接收到客户端请求的先后顺序,依次返回响应信息,以保证客户端能够区分出每次请求的响应信息,这样就能显著地减少整个下载过程所需要的时间。

HTTP请求和响应

1、HTTP请求

HTTP 请求是由客户端向服务器发送的相关数据,其可以分为 4 部分内容,即请求方法(Request Method)、请求网址(Request URL)、请求头(Request Headers)和请求体(Request Body)。

1) 请求方法

当在浏览器中输入 URL 并按 Enter 键时,便会以某种请求方法发起一个 HTTP 请求,常用的请求方法如下表所示。

表 1 常用的请求方法
请求方法 描  述
GET 请求指定的页面信息,并返回实体主体
HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或上传文件),数据被包含在请求体中
PUT 从客户端向服务器传送的数据取代指定文档中的内容
DELETE 请求服务器删除指定的页面
CONNECT HTTP 1.1 协议中预留给能够将连接改为管道方式的代理服务器
OPTIONS 允许客户端查看服务器的性能
TRACE 回显服务器收到的请求,主要用于测试或诊断
PATCH PUT方法的补充,用来对已知资源进行局部更新

2) 请求网址

请求网址,即统一资源定位符 URL,通过请求网址可以唯一确定所请求的资源。

URL 通常由 4 部分组成,即协议、主机、端口和路径,其一般的语法格式如下:
protocol://hostname[:port]/path/[;parameters][?query]#fragment
其中,protocol 表示协议;hostname 表示主机名;port 表示端口号;path 表示路径;parameters 表示参数;query 表示查询;fragment 表示信息片断。

3) 请求头

由于 HTTP 是一种无状态协议,所以需要在请求头中添加相关的首部字段,使服务器明确客户端的目的,其常用的首部字段包括 Accept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、Cookie、Expect、From、Host、Proxy-Authorization、Referer 和 User-Agent 等。

4) 请求体

请求体的内容一般通过请求方法 POST 所提交的数据获得。

2、HTTP响应

HTTP 响应是由服务器返回客户端的相关数据,其可以分为 3 部分内容,即响应状态码(Status Code)、响应头(Response Headers)和响应体(Response Body)。

1) 响应状态码

响应状态码如下表所示,共分为 5 种:
表 2 响应状态码
状态码 状态码英文 描  述
100 Continue 当前一切正常,客户端应该继续请求,如果已完成请求则忽略
101 Switching Protocols 服务器应客户端升级协议的请求正在切换协议
200 OK 服务器已成功处理了请求
201 Created 服务器已成功处理了请求,并且创建了新的资源
202 Accepted 已经收到请求消息,但是尚未进行处理
203 Non-Authoritative
Information
请求已经成功被响应,但是获得的负载与源头服务器的状态码为 200 的响应相比,经过了拥有转换功能的代理服务器的修改
204 No Content 请求已经成功了,但是客户端的客户不需要离开当前页面
205 Reset Content 服务器已成功处理了请求,并通知客户端重置文档视图
206 Partial Content 请求已经成功,并且主体包含所请求的数据区间
300 Multiple Choices 该请求拥有多种可能的响应
301 Moved Permanently 请求的资源已经被移动到了由 Location 首部字段指定的 URL 上,并且是固定不变的
302 Found 请求的资源被暂时移动到了由 Location 首部字段指定的 URL 上
303 See Other 重定向链接指向的不是新上传的资源,而是另外一个页面
304 Not Modified 无须再次传输请求的内容
307 Temporary Redirect 请求的资源被暂时移动到了由 Location 首部字段指定的 URL 上。 需要注意的是,响应状态码 307 与 302 的区别在于,307 可以确保 请求方法和消息主体不会发生变化;302 则会在一些旧客户端中 错误地将请求方法转换为 GET
308 Permanent Redirect 请求的资源已经被永久地移动到了由 Location 首部字段指定的 URL 上
400 Bad Request 由于语法无效,服务器无法理解该请求
401 Unauthorized 缺乏目标资源要求的身份验证凭证,发送的请求未得到满足
403 Forbidden 服务器有能力处理该请求,但是拒绝授权访问
404 Not Found 服务器无法找到所请求的资源
405 Method Not Allowed 服务器禁止了使用当前 HTTP 方法的请求
406 Not Acceptable 服务器无法提供与 Accept-Charset 及 Accept-Language 首部字段相匹配的响应
407 Proxy Authentication Required 由于缺乏位于浏览器与可以访问所请求资源的服务器之间的代理服务器所要求的身份验证凭证,发送的请求尚未得到满足
408 Request Time-out 服务器将关闭空闲的连接
409 Conflict 请求与服务器目标资源的当前状态相冲突
410 Gone 请求的目标资源在原服务器上不存在了,并且是永久性的丢失
411 Length Required 由于缺少确定的 Content-Length 首部字段,服务器拒绝客户端的请求
412 Precondition Failed 目标资源的访问请求被拒绝
413 Request Entity Too Large 请求主体的大小超过了服务器愿意或有能力处理的限度,服务器可能会关闭连接以防止客户端继续发送该请求
414 Request-URI Too Large 客户端所请求的 URI 超过了服务器允许的范围
415 Unsupported Media Type 服务器由于不支持其有效载荷的格式,从而拒绝接受客户端的请求
416 Requested range not satisfiable 服务器无法处理所请求的数据区间
417 Expectation Failed 服务器无法满足 Expect 首部字段中的期望条件
422 Unprocessable Entity 服务器理解请求实体的内容类型,并且请求实体的语法是正确的,但是服务器无法处理所包含的指令
426 Upgrade Required 服务器拒绝处理客户端使用当前协议发送的请求,但是可以接受其使用升级后的协议发送的请求
429 Too Many Requests 在一定的时间内用户发送了过多的请求,即超岀了“频次限制”
431 Request Header
Fields Too Large
请求中的首部字段的值过大,服务器拒绝接受客户端的请求
451 Unavailable For Legal Reasons 服务器由于法律原因,无法提供客户端请求的资源
500 Internal Server Error 所请求的服务器遇到意外的情况,并阻止其执行请求
501 Not Implemented 请求的方法不被服务器支持,因此无法被处理
502 Bad Gateway 作为网关或代理角色的服务器,从上游服务器中接收的响应是无 效的
503 Service Unavailable 服务器尚未处于可以接受请求的状态
504 Gateway Time-out 网关或者代理的服务器无法在规定的时间内获得需要的响应
505 HTTP Version not supported 服务器不支持请求所使用的HTTP版本
511 Network Authentication Required 客户端需要通过验证才能使用该网络

2) 响应头

响应头包含了服务器对客户端请求的应答信息,其常用的首部字段包括 Age、Expires、ETag、Last-Modified、Location、Server、Set-Cookie、Transfer-Encoding 和 X-Content-Type-Options 等。

3) 响应体

根据所选择资源的类型,服务器返回客户端的相关数据全部在响应体中。正因为如此,在编写网络爬虫时,主要通过响应体获取网页的源代码或 JSON 数据,并可以进一步从中提取所需要的内容。

3、HTTP请求和响应的过程

下面通过访问一个网站来具体了解 HTTP 请求和响应的过程。

首先打开 Chrome 浏览器,右击并选择“检查”即可打开浏览器的开发者工具面板,然后在网址栏输入URL“http://www.oldxia.com”并按 Enter 键,此时就可以看到该 URL 所对应的网站页面了,而在这个过程中,浏览器向网站所在的服务器发送了一个请求,服务器接收到这个请求后进行相应处理,并返回响应的结果,包括 HTML、图片、声频或视频等,最后浏览器再进行解析,这样就可以将网页的内容展现出来了。

单击开发者工具面板中的 Network 选项,该选项由 5 部分组成,如图 1 所示。


图 1 Network选项

而 Requests Table(请求列表)中的每条资源信息都表示进行了一次 HTTP 请求和响应。

下面再来详细了解 Requests Table(请求列表)中每列的具体含义,如下表所示。

表 3 Requests Table中列的含义
描  述
Name 资源名称,单击该资源可以查看资源的详细情况
Status 响应状态码
Type 请求资源的 MIME 类型
Initiator 请求源,标记请求是由哪个对象或进程发起的
Size 从服务器下载的文件和请求的资源大小
Time 从发起请求到获取响应所用的总时间
Waterfall 网络请求的可视化瀑布流

此时,单击第 1 条资源 www.oldxia.com,进而可以查看该资源的详细情况,其由 6 部分组成,如图 2 所示。


图 2 资源的详细情况

1) Headers

该部分表示资源的 HTTP 头信息,其包含 6 部分内容,具体如下:

这里需要注意的是,Form Data 和 Request Payload 中的数据就是请求体(Request Body)。


2) Preview
根据所选择资源的类型显示相对应的预览信息。

3) Response
根据所选择资源的类型显示相对应的响应内容。该响应内容就是响应体(Response Body),也是解析的目标。

4) Initiator
显示请求的依赖关系,以及发出请求的原因。

5) Timing
显示资源在整个请求生命周期中各部分所花费的时间。

6) Cookies
显示所选择资源请求和响应过程中存在的Cookie信息。

4、HTTP请求和响应过程中的Cookie

单击开发者工具面板中的 Application 选项,然后单击该选项左侧 Storage 中的 Cookies,即可查看客户端中的 Cookie,如图 3 所示。


图 3 Application选项

表 7 中的每条信息表示 1 条 Cookie,其所对应每列的具体含义如表中所示。

表 7 Cookie中列的含义
属  性 描  述
Name Cookie 的名称,并且一旦创建,该名称不可更改
Value Cookie 的值
Domain 可以访问该 Cookie 的域名
Max-Age Cookie 失效的时间,单位为秒
Path Cookie 的使用路径
Size Cookie 的大小
Http Cookie 的 httponly 属性
Secure Cookie 是否仅被使用安全协议传输
SameSite 设置 Cookie,以便在何种场景下会被发送,从而屏蔽跨站时发送 Cookie,用于阻止跨站请求伪造攻击(CSRF)

推荐阅读