一、HTTP 协议基础

HTTP 简介

HTTP 是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通常是由客户端发起一个请求,创建一个到服务器的 TCP 连接,当服务器监听到客户端的请求时,便会向客户端返回一个状态和内容。如下图所示,便是客户端发起请求,服务端响应的一个简单过程。

【接口测试】HTTP协议_网络

HTTP 工作原理 

HTTP工作原理主要涉及客户端和服务器之间的交互。

  1. 当我们在浏览器中输入网址并回车后,浏览器会向服务器发送一个HTTP请求。这个请求由多个部分组成,包括请求行、头部和正文。请求行包含请求方法、请求URI和HTTP版本号,如GET、POST、PUT、DELETE等。请求URI指定了要访问的资源的位置。HTTP版本号表示请求所使用的HTTP协议版本。头部包含了一系列的键值对,用于向服务器传递一些请求信息。例如,Accept表示客户端可以接受的响应内容类型,User-Agent表示客户端的浏览器信息,Referer表示客户端从哪个页面跳转而来等等。正文是可选的,用于向服务器传递一些数据。例如,当客户端向服务器提交表单时,表单数据就可以放在请求的正文中。
  2. 服务器接收到请求消息后,根据请求消息的URL和相应的处理逻辑,生成服务器响应消息,并将其发送给客户端。响应消息中包含协议版本、状态码、响应头和响应体等信息。状态行包含HTTP版本号、状态码和状态短语。HTTP版本号表示响应所使用的HTTP协议版本。状态码是一个三位数字,用于表示服务器对请求的处理结果,如200表示成功、404表示未找到资源、500表示服务器内部错误等等。状态短语是对状态码的简短描述,例如200对应的状态短语是OK,404对应的状词短语是Not Found。头部包含了一系列的键值对,用于向客户端传递一些响应信息。例如,Content-Type表示响应内容的类型,Content-Length表示响应内容的长度,Set-Cookie表示服务器要求客户端保存一个Cookie等等。正文是响应的实际内容。例如,当客户端请求一个网页时,网页的HTML代码就可以放在响应的正文中。
HTTP 特点 
  1. 支持客户/服务器模式:HTTP协议支持客户/服务器模式,客户端向服务器发起请求并接收响应。
  2. 简单快速:HTTP协议简单且快速,客户端向服务器发送请求时只需传送请求方法和路径,响应也较为迅速。
  3. 灵活:HTTP允许传输任意类型的数据对象,具有灵活性,这意味着它不仅可以传输文本,还可以传输图片、音频、视频等非文本数据。
  4. 无连接:HTTP协议无连接,即限制每次连接只处理一个请求。服务器处理完客户的请求并收到客户端的应答后,即断开连接,以节省资源。
  5. 无状态:HTTP协议无状态,每个请求都是独立的,这意味着服务器不会保存之前和现在的请求和响应之间的关联。
HTTP 和 HTTPS

上面介绍 HTTP 的工作原理和特点,看起来是一个很不错的协议,但是 HTTP 也存在许多不足,特别是在安全方面。HTTP 通信使用明文传输,并且在通信中是不验证通信方的身份,也无法证明报文是完整的,因此使用 HTTP 通信有可能使内容被窃听,通信方身份被伪装,报文遭篡改。

HTTP 协议中是没有加密机制,但是可以和 SSL(Secure Socket Layer )或 TLS(Transport Layer Security)组合使用,从而加密 HTTP 的通信内容。即出现了 HTTPS。HTTPS 中的 S 可以理解为是 Secure,是以安全为目标的 HTTP 通道。大家可以这样理解 HTTPS = HTTP + 加密 + 认证 + 完整性保护。

细心的同学应该会发现,在一些大型网站,特别是银行、支付等网站使用的都是 HTTPS,因为它更安全。

二、HTTP 协议介绍

1.URL


URL:是互联网上标准资源的地址,一般称为统一资源定位符。


组成: 协议 :// hostname[:port] / path / [? 查询参数1 & 查询参数2]



如:

【接口测试】HTTP协议_运维_02


2. HTTP协议


HTTP:超文本传输协议,基于请求与响应的应用层协议。


作用:规定了客户端与服务器之间信息传递规范,是二者共同遵守的协议。



组成:


  • HTTP请求:定义请求数据格式      请求行、请求头、请求体
  •  HTTP响应:定义响应数据格式     状态行、响应头、响应体

我们以瑞吉外卖项目为例,在登录界面发送了一个请求,按住F12进行调试:

【接口测试】HTTP协议_服务器_03

1.请求行


位置:请求数据 第一行


作用:说明 请求方法访问的资源 、协议版本



请求行分为三个部分:请求方法、请求地址 URL 和 HTTP 协议版本,它们之间用空格分割。例如下图中的:POST /employee/login HTTP/1.1。

【接口测试】HTTP协议_运维_04

请求方法

HTTP/1.1 中定义的请求方法有 8 种,分别是 GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。GET 和 POST 是最常见的两种请求方法。如果是 RESTFul 接口则是 GET、POST、DELETE、PUT。


GET:从服务器获取资源


POST:在服务器新建一个资源


PUT:在服务器更新资源


DELETE: 从服务器删除资源



协议版本

协议版本的格式为:协议名称/主版本号.次版本号,常见的有 HTTP/1.0 和 HTTP/1.1。



2.请求头

位置:请求数据第二行到空白行之间

作用:通知服务器客户端请求信息


特点:请求头部由 键值对 组成,每行一对





【接口测试】HTTP协议_客户端_05


Content-Type:请求体数据类型


  • text/html:HTML格式
  • image/jpeg:jpg图片格式
  • application/json:JSON数据格式
  • application/x-www-form-urlencoded: 表单默认的提交数据格式
  • multipart/form-data:在表单中进行文件上传时使用

3.请求体

 

【接口测试】HTTP协议_客户端_06

4.响应行


位置:响应数据 第一行


作用:描述服务器处理结果


内容: 状态行由协议版本号、 状态码 、状态消息组成




【接口测试】HTTP协议_服务器_07


分为三个部分:HTTP 协议版本、状态码和状态码描述,它们之间用空格分割。例如 HTTP/1.1 200 OK

  • HTTP 协议版本:与请求行中的协议版本一致,格式为:协议名称/主版本号.次版本号,常见的有 HTTP/1.0 和 HTTP/1.1。
  • 状态码:表示网页服务器超文本传输协议响应状态的 3 位数字代码。第一个数字代表当前响应的类型。例如 1xx 表示请求已经被服务器接收,需要继续处理。
  • 状态码描述:也叫状态描述,是对状态码的一个说明。
HTTP 常见响应码

我们经常会听到开发人员说,200、404、500 等数字,其实说的就是状态码。

HTTP 状态码(HTTP Status Code)由三个十进制的数字组成。状态码的第一个数字定义了状态码的类别,HTTP 状态码总共有五种类别,如下所示:

  • 1xx:信息。表示服务器接收到请求,需要继续处理。
  • 2xx:成功。请求已经被成功接收并处理。
  • 3xx:重定向。需要客户端采取进一步操作才能完成请求。
  • 4xx:客户端错误。客户端发送的请求有语法错误或者请求无法实现。
  • 5xx:服务端错误。服务器在处理请求的过程中发生了错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。

下面列举出一些常见的状态码:

状态码

英文名

描述

100

Continue

客户端应当继续发送请求

101

Switching Protocols

服务器根据客户端的请求切换协议

200

OK

请求成功。请求所希望的响应头或数据体将随此响应返回

203

Accepted

服务器已经接受请求,但未处理完成

204

No Content

服务器成功处理,但未返回内容

301

Moved Permanently

请求的资源已被永久的移动到新 URI,浏览器会自动定向到新 URI

305

Use Proxy

被请求的资源必须通过代理才能被访问

400

Bad Request

客户端请求的语法错误,服务器无法理解

401

Unauthorized

请求要求用户的身份认证

403

Forbidden

服务器理解请求,但是拒绝执行此请求

404

Not Found

请求失败,服务器上无法找到请求的资源

500

Internal Server Error

服务器内部错误,无法完成请求

503

Service Unavailable

由于超载或系统维护,服务器暂时无法处理客户端的请求

505

HTTP Version not supported

服务器不支持,或者拒绝支持请求中使用的 HTTP 协议的版本

响应头

响应头部用来说明客户端需要使用的一些附加信息。与请求头部类似,包含若干个属性,每行一对,传递着固定的信息。格式为:属性名:属性值。下面列举一些响应头部内容。

响应头

说明

示例

Server

服务器应用程序软件的名称和版本

Server: Tengine

Date

此消息被发送时的日期和时间

Date: Tue, 15 Jun 2021 11:28:29 GMT

Content-Type

当前文档的 MIME 类型

Content-Type: text/html; charset=utf-8

Content-Encoding

当前文档使用的编码方式

Content-Encoding: br

Expires

超过该时间则认为文档已经过期

Expires: Fri, 01 Jan 1990 00:00:00 GMT

【接口测试】HTTP协议_服务器_08

6.响应体

作用:服务器返回的数据实体


特点: 有图片、json、xml、html等多种类型



【接口测试】HTTP协议_运维_09