Day 1 :接口及相关概念(1).

一.接口

1.1 什么是接口.

接口是一种抽象化的概念,通过它可以把不同的事物连接起来,例如插头插座就是接口(插头插座实际上就是电器和电路的连接),我们今天讨论的主要是计算机领域的接口。

1.2 接口的分类

硬件接口和软件接口
硬件接口是指同一计算机不同功能层之间的通信规则称为接口,例如通过usb接口把鼠标与计算机连接起来。
软件接口:实现不同软件,或者软件的不同部分之间数据交互的定义,可以是个函数,类又或者是个定义。

1.3 应用架构

目前几乎所有的商业应用都是基于互联网的,它们一般采用c/s架构,b/s架构,m/s架构或它们的组合
① c/s 架构
client客户端(装在用户电脑上的那个软件)
server 服务端(装在提供服务的商家的服务器上的软件)通过这个软件为客户端提供服务。
举例:对于jupyter lab 来说 cmd就是服务端,浏览器就是客户端。通过浏览器向服务程序请求数据,并把对应的数据展示在浏览器上。

② b/s 架构 browser浏览器(浏览器是客户端的一种)
直接依赖浏览器厂商的浏览器,不需要额外地去开发客户端,只用去开发后台程序就可以了,可以大大加快开发效率,,我们把以浏览器作为客户端的应用我们称为b/s架构,像网站这种,都是b/s架构。其实所有b/s架构的都可以理解为网站,因为它都可以用浏览器去呈现。

·
③ m/s架构 mobile server
我们把所有装在手机,或者是你的ipad这种移动设备上面的客户端我们称为移动端

不管是浏览器还是移动端,它其实统统都是客户端,只不过浏览器服务器是一类,对于这一类它的开发方式不一样,它可能只注重服务端开发以及在不同浏览器之间的兼容效果的开发上,所以把这种单独抽出来叫做b/s;移动端目前比较流行的一个是Android,一个是ios,它们的开发方式也是不一样的,所以我们也会把它们抽出来m/s。

b/s ,m/s 本质上是c/s的一种,只是按照设备单独拿出来分类一下。
对于一些大型的商业应用来说,一般又有c/s,又有b/s,还有m/s
在这里插入图片描述
服务器其实就是功能更强大一点的电脑,和我们普通的电脑没有太多的区别,只不过它性能更高价格更贵,仅此而已,因为所有的程序都是跑在计算机系统上的,所以它本质上还是一个计算机,不管是客户端还是服务端。
在这里插入图片描述
补充:你去面试的时候或者你在写你的简历的时候,如果你的项目经验比较匮乏,那么这个时候你的系统它有客户端,也可以用浏览器访问,它也有移动端有自己的app,小程序这些,那么你可以把它们拆分为三个项目,因为不同的端你的测试是不一样的,如果你的项目经验比较丰富,那可以写成一个项目,一个项目的不同端的测试。

那客户端和服务端是如何进行通信的呢?
客户端和服务端进行通信说白了就是两个电脑进行通信,每个电脑的系统不一样,我的是windows你的可能是mac,linux,…这里就要讲到网络传输模型。

二.网络传输模型

也叫做开放式通信系统参考模型
(数据在网络里面是怎样传递的)

2.1 OSI七层模型(参考模型)

OSI模型,它是国际标准化组织(ISO)提出的一个试图使计算机在世界范围内互连为网络的标准框架,简称OSI。
它总共分为7层,所以也叫网络7层模型,它从下往上分别是,物理层,数据链路层,网络层,传输层,会话层,表达层和应用层。
在这里插入图片描述
传输过程如下图,把服务器省略,假设我们是直连的。
在这里插入图片描述
信息从一台计算机的应用程序传出到另一台的应用程序需要先从应用层往下到物理层,再从物理层往上到应用层来完成整个通信过程。

2.2 TCP/IP协议(传输层)

OSI模型只是描述了一些概念,用来协调进程间通信标准的制定,但并没有提供一个实现的方法说白了就是嘴炮,只说了没有做,实际标准是TCP/IP参考模型
TCP/IP 协议不是TCP和IP这两个协议的合称,而是指因特网的整个TCP/IP协议族,里面有很多的协议。
TCP/IP协议对我们的七层模型做了一个压缩。
从协议分层模型方面讲,从下往上四个层次组成:网络接口层,网络层,传输层,应用层。
TCP/IP 传输模型并不完全复合OSI的七层参考模型,它和OSI的结构对于如下:
在这里插入图片描述
TCP/IP 协议对我们的OSI七层模型做了压缩
它把物理层和数据链路层压缩为网络接口层,网络层还是网络层,传输层还是传输层,会话层和表示层和应用层 压缩成了应用层。

TCP协议:

特点:面向连接的,可靠的(TCP协议需要先连接才能传数据,传完数据后再断开连接。每次发数据的时候都会校验,发错了就会重新传),基于字节流的传输层应用协议
效率低但是可靠(每次发送都会校验),TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和,如果不对的话就得重新传。
在这里插入图片描述

TCP 协议 “三次握手四次挥手”

TCP协议建立连接的过程(三次握手)跟UDP协议对比
TCP协议是安全的,每个包发过去后会确认,确认数据对不对,不对就重新发。
所以通过TCP协议传输数据只要传过去就是对的不会出错误比较可靠,但是它的效率比较低
大多数数据我们是需要很可靠的,所以只会用TCP去传

TCP - 打电话 又管发又管收 比较认真负责 但是效率比较低,我传文件给你,用的是TCP协议,要校验,如果我不校验,错一个字节这个文件就完了。如果我们对数据我们要求它完整不能出错,这种我们就用TCP协议。

UDP - 发电报 不是面向连接不可靠 只管发不管收 好处是效率高 因为它管发不管收 你收没收到我不管但是我会不停向你发 像我们的视频信号,直播 一般都会用UDP协议(数据在传输过程中错误是非常常见的,如果每次出错都要重新传,这个视频就会很卡,像视频这些其实是一帧一帧的图片,我少个一两帧其实是不影响整体的观看的),如果我们对数据的完整性要求不是特别严格,对时效性要求非常严格的时候我们就用UDP协议
我们上课如果不用udp协议那么你的延时会非常高。

TCP建立连接的三次握手过程

1,客户端向服务端发送一个同步请求:你在吗?我要传数据给你了。(不在就算了,客户端会等,过了一定时间会超时)
2,服务端给个应答,: 我在,我准备接收数据了
3,客户端:好的,我们建立连接,马上传数据。
当你的客户端服务端建立好连接后它们就可以传数据了
在这里插入图片描述

直播的时候也会用UDP协议


断开一个连接需要经历四次挥手
TCP 协议断开连接的过程(四次挥手)

1,客户端向服务端发送一个断开连接的请求:我要断开了
2,服务端:我收到了
3 , 服务端:我也要断开了
4,客户端:我也收到了
在这里插入图片描述
TCP协议数据属于传输层,是我们应用程序开发所能达到的最底层,需要有非常专业的计算机知识,一般情况我们不需要直接操作,这里我们知道了三次握手四次挥手即可。

互联网传输数据主要用到两个协议:TCP 和 UDP
UDP是无连接的,直接发,不管收到不收到。思考:什么情况用TCP,什么情况用UDP
理解小技巧:TCP是打电话,必须接通才能说话,UDP是写信或者发电报,写完投递就可以了,电报发完就可以了,你收没收到我不知道。有可能别人没有收到。

2.4 ip地址

如果我发送请求我两个电脑之间要进行通信那我怎么知道对方在哪里呢?你首选要知道它的ip地址,你不知道它的ip地址你根本在网上就找不到它,就更别说建立tcp连接了,这个就是ip地址的作用。
我们在互联网上想找到某一台主机我们需要的就是它的ip

tcp和ip是一起的,建立TCP连接是基于IP的
客户端和服务端要建立连接,需要IP
ip地址就是网络上主机的逻辑地址,ip其实就是给我们网络上面每个电脑的编号。
日常情况下,每一台联网的pc都必须要有ip,没有ip不能上网,有了ip才能通信。
ip v4 现在ipv4 已经不够用了
ip地址是一个32位的二进制数,通常被分隔成四个8位的二进制数,每个八位二进制最多表示256种情况
IP地址通常使用点分十进制表示(a.b.c.d)的形式,其中,abcd都是0-255之间的十进制整数,例如:192.168.1.1, 为了便于寻址以及层次化

最初设计网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID)即网络ID和主机ID,同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应,intrenet委员会定义了五种IP地址以适合不同容量的网络,ip地址分为ABCDE 5类,它们适用的类型分别为:大型网络:中型网络,小型网络,多目地址,备用,常用的是B和C两类 ,其中A,B,C(如下表格)由internetNIC在全球范围内统一分配,D,E 类为特殊地址

  • ip地址分类 ( 按照规模)
  • 在这里插入图片描述

A 大型网络 私有地址 10.0.0.0-10.255.255.255 很大的集团网
前面一个256表示网络号,后面三个256相乘表示可以容纳的最大主机数
B 中型网络 私有地址 172.16.0.0-172.31.255.255
前面两个256表示网络号,后面两个256表示主机
C 小型网络 私有地址 192.168.0.0 -192.168.255.255
前面三个256相乘表示网络号,最后一个表示主机。小型网络里面最多容纳254台电脑,这里面还涉及到子网掩码。
注意:最大主机数乘了还要减去2,减去的是路由和网关,

  • ip地址分类 (按照公有和私有)

公有地址(互联网上可以直接访问的地址),是可以直接上网的。
私有地址(局域网)
在这里插入图片描述
在这里插入图片描述
减掉的两个地址是路由和网关
我们知道了IP我们解决了我们在互联网上我们要让两台电脑之间进行通信
在互联网上我们要找到某一台主机,需要的就是它的IP

2.5 端口

ip 找主机
端口找服务程序

当我们确定ip建立连接后,怎么确定我的数据是传输给哪个程序的呢,这个时候引入端口的概念。pc上的端口一共是 65536 个 2**16 四个字节。
需要网络通信的程序都要监听端口,比如qq监听到你发送的数据包里面的端口是qq对应的端口,那么这个数据就会被qq收到。数据包里面含有ip含有端口,数据包从一台电脑发到另外一台电脑后,另外一台电脑的操作系统会拿到对应的端口,拿到的是55544端口那它就会从这个55544端口进来,这个时候因为我的qq监听的是55544,那么这个数据就会被qq收到,这个就是端口的作用
在这里插入图片描述
其实我们常说的端口也叫协议端口,它总是和ip和TCP协议一起出现。一个ip地址的端口可以有65536个

理解小技巧:可以把端口比作银行的服务窗口,对外服务。现金业务提供一个窗口,非现金业务提供一个窗口,贵宾业务提供一个窗口,用来接待不同的客户。操作系统比这个要复杂得多,同时运行的服务程序非常多,为了能够方便的管理,于是就开了很多的窗口,一个服务程序一个,相互不干扰。

注意:协议端口分为TCP端口和UDP端口,由于TCP和UDP两个协议是独立的,因此各自的端口号也相互独立,比如TCP有235端口,UDP也可以有235端口,两者并不冲突。
分类:

  • 周知端口:操作系统占用的端口, 0-1023 这些端口不要随便用,其他的端口是可以自己去分配的。
    http协议 :80端口 https :443
  • 动态端口: 49152-65535 之所以称为动态端口,是因为它一般不固定分配给某种服务,而是动态分配
  • 注册端口:1024-49152 分配给用户或应用程序 ,当然不是绝对的可以去改, 例如 3306 mysql 4723 appium

这里面比较重要的是TCP协议,IP地址,端口。这些概念都要知道,后面我们去做接口自动化都会用到。

总结:
上面的知识是为了让我们从底层了解网络通信,网络通信涉及物理层和应用层,我们进行软件测试针对的是应用层。
不同的客户端和不同的服务端进行数据交互,为了统一,大家制定了协议,也就是网络传输协议,我们的接口测试主要就是测试网络接口。网络接口我们可以简单地理解为网络协议。
目前使用最广泛的网络传输协议是HTTP协议

三. HTTP协议

http协议.

HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是一个用于传输超媒体文档(例如 HTML)的应用层协议(最开始http协议就是发明用来

做html这种网页的网络资源的通信)。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的客户端-服务端模型,客户端打开一个连接以发出请求,然后等待直到收到服务器端响应。HTTP 是无状态协议,这意味着服务器不会在两个请求之间保留任何数据(状态)。尽管通常基于 TCP/IP 层,但它可以在任何可靠的传输层上使用,也就是说,该协议不会像 UDP 那样静默的丢失消息。RUDP——作为 UDP 的可靠化升级版本——是一种合适的替代选择。

主要用途是: 从万维网服务器(也就是我们的web服务器)传递超文本到本地浏览器的传输协议 80端口

概述

HTTP是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议)。它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说,请求通常是由像浏览器这样的接受方(客户端)发起的。一个完整的Web文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。

在这里插入图片描述

一个网页由多个部分组成,浏览器通过互联网向服务端发送请求,我们请求回来的数据可能不是在一个服务器上面的
客户端和服务端通过交换各自的信息(与数据流正好相反)进行交互,由像浏览器这样的客户端发出的信息叫做requests(请求),被服务器响应的消息叫做responses(响应)

HTTP是超文本传输协议,就是一种组织数据的格式,是用于从万维网服务器传递超文本到本地浏览器的传输协议,http是基于TCP/IP协议的应用层协议
超文本传输协议(应用层),默认使用80端口
超文本:除了文本外的其他 图片.文件等

典型的http会话

一次完整的http事务包含以下过程
1,客户与服务器建立连接
2,客户向服务器提出请求 也叫 http请求
3,服务器接受请求,并根据请求返回相应的文件作为应答 也叫http响应
4,客户与服务器关闭连接
其实对于建立连接和关闭连接我们不用管,第一和第四我们不用管,我们主要关注第二和第三点,建立和关闭连接是TCP/IP协议去做的,我们http是在tcp基础之上的,那个是底层我们不关心它,我只关心我的客户端向服务器发送了一个请求(我们叫http请求),然后服务端收到你的请求之后会返回一个响应(http响应)。这一来一回我们把它称为一次http事物,或者有时候我们就叫一个http请求,其实它包含了两部分,即请求和响应。请求就是我要什么,响应就是我拿回了什么。

典型的http会话
在像http这样的Client -Server(客户端-服务器)协议中,会话分为三个阶段:
1: 客户端建立一条TCP连接(如果传输层不是TCP,也可以是其他适合的连接)
2,客户端发送请求并等待应答(请求)
3,服务器处理请求并送回应答,回应包括一个状态码和对应的数据(响应)

在http/1.0之前 我们前面讲http协议传完成了第三个阶段之后,我们会关闭tcp连接,我们叫短连接,你每发送一个请求,都会先建立一个连接,然后服务器会响应回来,响应回来之后会断开。(因为我们在过去我们网页没有现在那么复杂可能就只有图片和html,现在我们随便打开一个网页都会发送几十个上百个请求,如果每次都是打开关闭是非常耗时的
所以我们从http/1.1开始,连接在完成第三阶段后不再关闭,客户端可以再次发起新的请求,这意味着第二步和第三步可以连续进行数次,我们叫长连接 , 即:客户端和服务端建立一次连接后,可以在这条连接上进行多次请求/响应操作

在这里插入图片描述
特点:
1 ,http是简单的,虽然下一代HTTP/2 协议将HTTP消息封装到了帧(frames)中(这是新的技术,现在还没有普及),HTTP大体上还是被设计得简单易读,HTTP报文能够被人读懂,还允许简单测试,降低了门槛,对新人很友好。
2,HTTP协议是可扩展的
在HTTP/1.0 中出现的 HTTP headers 让协议扩展变得非常容易,只要服务端和客户端就新的headers达成语义一致,新功能就可以被轻松加入进来,下次讲项目的时候我们就可以看到有自定义的请求头

3, HTTP是无状态,有会话的 这个面试可能问
在这里插入图片描述

HTTP是无状态的:在同一个连接中,两个执行成功的请求之间是没有关系的,这就带来一个问题,用户没有办法在同一个网站中进行连续的交互,比如在一个电商网站里,用户把某个商品加入到购物车中,切换一个页面后再次添加了商品,这两次添加商品的请求之间没有关联,浏览器无法知道用户最终选择了哪些商品,而使用HTTP的头部扩展,HTTP Cookies 就可以解决这个问题,把Cookies添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。所谓的无状态就是服务器不会去记录两个请求之间的关系,服务器没办法去区分你同一个浏览器先后发过来的请求,就好比打电话,你每次打过来,你对于我都是全新的,我不会记录你的信息,你下次来的时候我还是不认识你,你每次来都是全新的。这就是我们的无状态。 如果别人问你http的无状态是什么意思 :我们的http协议本身不会去记录客户端的任何信息,在同一个连接里面,两次成功的请求之间没有关系。

这是 HTTP协议的设计原理,为什么要这么去设计呢?历史原因
是因为http最开始设计的时候被用来发送网页的,那个时候技术没有现在那么先进,硬件也没有现在那么好,特别是带宽也比较窄,如果这个时候你的协议还要去记录很多的信息,那么你在传递的时候就不高效,所以http协议不会把两个请求联系起来,可以简单理解为它不会去记录客户端的信息,它不去记录客户端的信息它就没办法区分同一个客户端发送的多次请求。

这样就带来一个问题,随着互联网的发展,我们的业务越来越复杂,我就需要在浏览器里面把多个请求联系起来,不然我的服务器怎么判断你这个用户登录还是没有登录呢?所以就有了这样的需求,http虽然是无状态的,但是可以是有会话的,所谓的会话就是浏览器从用户访问某个网站,直到它最后离开这个网站,关闭这个浏览器,这个中间的一来一回一来一回整个的过程我们就称为会话,既然http是无状态的那么它怎样去实现会话呢?这个时候就由我们http的头部扩展就是headers里面的Cooikes就可以解决这个问题,把Cookies添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。

cookies就好比,你要去银行里面去办业务,首先你是不是需要银行的账户,你每次来银行的时候你必须把账户带来,如果你不带账户,银行里面的工作人员不会理你,所以你这个时候你每次来的时候带上cookie,服务器就根据你携带的cookie,如果这个cookie信息相同,cookie里面有某个标志都是一样的的,那服务器就根据你每次携带的cookie来判定你这个请求和另外一个请求是有关联关系的。

注意: HTTP本质是无状态的,使用Cookies可以创建有状态的会话

3在这里插入图片描述

3.1 http报文

http 报文
http/1.1 以及更早的HTTP协议报文都是语义可读的(没有编码,直接用人工都是可以读的)。在HTTP/2 中,这些报文被嵌入到了一个新的二进制结构,帧,帧允许实现很多优化,比如报文头部的压缩和复用,即使只有原始HTTP报文的一部分以及HTTP/2发送出来,每条报文的语义依旧不变,客户端回重组原始HTTP/1.1请求, 因此用 HTTP/1.1 格式来理解HTTP/2报文依旧有效

有两种HTTP报文的类型,请求与响应,每种都有其特定的格式。
请求是由客户端发送给服务端的报文
响应就是服务端响应客户端的报文,每种都有特定的格式。

3.1.1 请求

HTTP请求的一个例子
在这里插入图片描述
请求由以下元素组成:

  • 一个HTTP的method,经常是由一个动词像GET, POST 或者一个名词像OPTIONS,HEAD来定义客户端的动作行为。通常客户端的操作都是获取资源(GET方法)或者发送HTML form表单值(POST方法),虽然在一些情况下也会有其他操作。
  • 要获取的资源的路径,通常是上下文中就很明显的元素资源的URL,它没有protocol (http://),domain(developer.mozilla.org),或是TCP的port (en-US)(HTTP一般在80端口)。
  • HTTP协议版本号。
  • 为服务端表达其他信息的可选头部headers。
  • 对于一些像POST这样的方法,报文的body就包含了发送的资源,这与响应报文的body类似。(请求体)

一个完整的http请求的报文格式
一个完整的HTTP请求报文包括:请求行,请求头,空行和请求数据
下图给出了请求报文的一般格式

下面这个URL我们叫做路径更恰当

在这里插入图片描述
上面的统统都是二进制,或者叫字节类型。在python中二进制数据用byters来表示
在这里插入图片描述
字节数据,二进制数据在python里面会用bytes来表示,它会把每个字节里面的数据会把它转化成对应的 ascii 码字符来表示,如果字节里面本身表示的就是ascii码,那么它就直接输出,如果是其他的数据它就会用一个\x加上这个字节里面的数的十六进制去表示。它其实就是我们电脑上的数据每个字节里面的数,只不过它的形式不一样

http/1.1 以及更早的HTTP协议报文都是语义可读的(没有编码,直接用人工都是可以读的)。在HTTP/2 中,这些报文被嵌入到了一个新的二进制结构,帧,帧允许实现很多优化,比如报文头部的压缩和复用,即使只有原始HTTP报文的一部分以及HTTP/2发送出来,每条报文的语义依旧不变,客户端回重组原始HTTP/1.1请求, 因此用 HTTP/1.1 格式来理解HTTP/2报文依旧有效
有两种HTTP报文的类型,请求与响应,每种都有其特定的格式。
请求是由客户端发送给服务端的报文
响应就是服务端响应客户端的报文,每种都有特定的格式。

例如请求百度首页的请求报文
b’GET / HTTP/1.0\r\nHost:www.baidu.com\r\n\r\n’
b:表示是二进制数据(bytes)
GET:请求方法 , /表示当前路径,表示拿它的首页,协议版本HTP/1.0, Host:头部字段名:值: www.baidu.com 请求数据可以没有,我这是一个get请求所以我没有带请求数据。
注意:上面请求百度首页的请求报文的url是 / 代表根路径,域名没有写路径,就表示请求根路径,在这个报文中的意思就是取Host请求头那个地址的首页。
所谓的http协议就是类似于这样的格式,它怎么组织的就怎么组织,就是对这个数据进行相应格式的组织

我们需要知道 : 这个请求方法是什么意思

3.3 请求方法

HTTP定义了一组请求方法,以表明要对给定资源执行的操作,指示针对给定资源要执行的期望动作,虽然他们也可以是名词,但这些请求方法有时被称为HTTP动词,每一个请求方法都实现了不同的语义,但一些共同的特征由一组共享,例如一个请求方法可以是安全,幂等或可缓存。根据http标准,http请求可以使用多种请求方法,你要想实现的功能不同,你就用对应的请求方法

请求方法
根据http标准,http请求可以使用多种请求方法

1.0 定义了三种请求方法:GET(获取数据) POST(上传,例如登录,将数据传递到服务器) HEAD(类似于GET请求,但是返回的响应里面没有响应体,只有响应头,获取信息)
1.1 新增了六种请求方法,OPTIONS, PUT(大修改,整个修改), PATCH(修改部分), DELETE(删除), TRACE 和 CONNECT方法

我用这个方法我其实就是告诉我当前的请求要干什么,就是一个语义。

PUT(大修改) PATCH(小修改) DELE(删除)

①,安全:比如GET请求就是客户端向服务器获取数据,GET请求它只能获取,那么对于服务器来说,这个GET请求是安全的吗?换个角度!你用GET请求你只能获取我服务器的数据,对于公共资源,它能修改我服务器的数据吗?不可以 !不管你发多少次GET请求,我服务器的资源都是不变的,在这个角度看,GET请求改变不了服务器的状态所以它是安全的。如果你说你服务器里面的数据我不能给你看结果被你看到了,那这个是你服务器自身的而不是我们get请求的原因,因为get请求就是要获取数据,那你这个数据需要被别人获取对不对,那你要给别人嘛,所以你不能说为了安全连访问都不让别人访问那没有意义对不对,从这个角度看GET请求改变不了服务器的状态,所以它是安全的。
②,幂等:同样的请求被执行一次与连续执行多次的效果是一样的,你请求一次和请求十次它的作用是一样的,那么它就是幂等的。换句话说就是幂等方法不应该具有副作用。你发送一次和发送十次对于服务器来说它不改变。
③,可缓存:我们有些网站它上面会有很多的图片,如果你每次打开这个网站,这个图片都要去 Web server去下载的话,那其实是非常耗时的,那我们还会有一个缓存机制,有些资源可以被你缓存到本地,你打开这个网页其实它会把这个图片下载到本地,那下一次它打开这个网页的时候它会先去看一下这个图片有没有变,如果没有变的话,它直接在本地把你这个图片展示出来就可以了,而不需要再去服务器下载一遍。

关于每个方法的安全幂等可缓存可以自己去思考,可以点到网站里面一个一个去看

在这里插入图片描述

用的比较多的: GET(获取) POST(将数据传递到服务器,新增) PUT(大修改) DELETE(删除) PATCH(小修改)

最常用的方法是get和post

get 和 post 方法的区别 经常会问的
get 方法 获取数据
其实简单来说,GET方法一般用来负责获取(查询)数据,或者将一些简短的数据放到URL参数中传递到服务器(最多有1024字节),比POST更加高效和方便。
get请求相对于post请求来说它的传递不太安全,然后数据量也不足(最多在url中携带1024字节),所以我们在传递数据量大或者安全性要求较高的数据的时候我们就使用post请求来传递数据。

get请求一般没有请求体(请求体就是请求数据)。URL其实就是网址,前面部分是域名,问号后面部分是参数,一般get请求才会携带这样的参数(当然post也可以),这个叫查询参数。

面试问:get请求能不能携带请求体 ?-> 根据HTTP协议它的规范,GET请求是不应该携带请求体的,但是如果你非要带请求体其实也是可以的,因为这是协议。

POST
由于GET方法最多在url中携带1024字节的数据数据量不足,且将数据放到URL中传递太不安全,数据量大时URL也会变得冗长,所以传递数据量大或者安全性要求高的数据的时候,最好使用POST方法来传递,上传数据用post‘

PUT 和 PATCH 有什么区别?有可能会问到
PUT是全部修改 全部替换
PATCH 只改变某一部分的信息
举个例子:比如我有某个商品,商品可能有商品的名称,商品的图片,商品的价格,如果我只是改商品的价格,我就用PATCH,因为只需要改价格这一个数据,如果我要把这个商品整个都改了,名称要改,图片要改,价格也要改,我们就用PUT请求

请求方法还可以登录mozilla 网站可以去看对应的方法,会更加具体。

3.4 请求头

HTTP消息头允许客户端和服务器通过request和response传递附加信息,一个请求头由名称(不区分大小写)后跟一个冒号 ‘:’ ,冒号后跟具体的值(不带换行符)组成,该值前面的引号空白会被忽略,请求头不区分大小写。
请求行下方是请求报头,每个报头的形式如下:
报头名 + : + 值
HOST请求头是必须的
请求头其实就是 一些约定

根据不同的上下文,可将消息头分为

  • General headers: 同时适用于请求和响应消息,但与最终消息主体中传输的数据无关的消息头
  • Request headers: 包含更多有关要获取的资源或客户端本身信息的消息头。
  • Response headers: 包含有关响应的补充信息,如其位置或服务器本身(名称和版本等)的消息头
  • Entity headers: 包含有关实体主体的更多信息,比如主体长(Content-Length)度或其MIME类型。

http协议支持自定义请求头,如果你要测试的产品,有自定义请求头,需要手动添加这个请求头。
所谓的请求头其实就是一些约定,请求头可以做什么:打个比方:客户端向服务端发送请求,我要告诉你我有一些特点,我要告诉你我是什么操作系统,我只接收什么数据类型。请求头是我们事先定义好的。
下面见常见的请求头及作用

在这里插入图片描述
例如

  • Usere-Agant (用户代理):
    你发送请求的时候,服务端要知道你的客户端是由哪个软件,什么终端什么操作系统,你是Windows,你是IE,你是谷歌,你还是火狐…你手机,你手机的话是安卓,还是ios,然后你是安卓的话你用的是哪个浏览器,这个用户代理就起这个作用。

  • Accept:你发这个请求的时候你就告诉它你要什么数据。有一些请求它是有的。

  • 不用可以去记,后面用到什么请求头就讲什么请求头,请求头其实就是一些约定

更多请求头和作用:https://developer.mozilla.org/zh-CN/docs/Web/HTTP

请求数据

请求数据通常是使用POST方法进行发送的,GET方法是没有请求数据的,
注意:get请求规范是没有请求数据的,但是有的人它非要带请求数据,规范是不带的
请求数据跟上面的消息报头由一个空行隔开。请求体就是请求数据,请求数据其实就是二进制数据。

扩展:在过去我们发送http协议的时候,每一次请求都会建立和断开,这个没有效率,所以从http1.1开始建立长连接,就是连接之后会发送多个请求,经过一段时间如果你没有请求了我就关闭连接,因为建立和关闭连接是需要花很多时间的。这个叫做长连接,现在一般都是长连接(keep alive )
keep alive 长连接

3.1.2 响应

在这里插入图片描述
状态行:协议版本 响应状态码 响应状态文本(提示信息)
响应头(deaders) :头名:值
响应体

HTTP响应的一个例子
在这里插入图片描述
响应报文包含了下面的元素
1,HTTP协议版本号
2,一个状态码(status code),来告知对应请求执行成功或失败,以及失败的原因
3,一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定,一般情况下都是一致的
4,HTTP headers,响应报头,与请求头部类似
5,响应体(响应回来具体的数据)

一个完整的HTTP响应报文也由四个部分组成,分别是状态行,消息报头,空行和响应正文
在这里插入图片描述

响应状态码

当客户端向服务端发起一次请求后,服务端在返回的响应头中会包含一个HTTP状态码,HTTP状态码是由三位数字来表示的,由第一位数字来表示状态码的类型,一般来说有五种类型。
在这里插入图片描述
100 信息响应
200 ok 成功
201 创建成功

3 开头 重定向 这个请求你发送到服务器之后,这个服务器又转发给别人了,重定向到另外一个域名了,会给你一个消息让你向另外一个地址发请求。我没有登录就直接在淘宝搜索,它就会把我重定向到登录的页面。

400 说明你的请求有误,可能你的参数,你的url有误

403 没有权限,被禁止了

404 url 没有这个资源,这个url找不到

500 服务器错误 重大bug (一般上线产品是不允许有500的,这是非常严重的BUG)

都去读一下,上面提到的要记住,你在做接口自动化调试的时候你碰到了这些状态码你要知道原因是什么
你的项目里面肯定不会每个都出现,但是有一些常用的要知道。

响应报头

同请求头
状态行下方的就是响应报头,常见响应报头如下。
在这里插入图片描述
更详细的响应报头请看: https://developer.mozilla.org/zh-CN/docs/Web/HTTP

响应数据

跟我们请求的数据,发送的数据是一样的,它会以二进制的数据去返回。
响应报文中空行后的内容就是响应数据了。
跟发送的数据是一样的,它会以二进制的数据来返回
json

html

xml

断言

3.1.3 url

URL 中文叫统一资源定位符,是用来标识某一处网络资源的地址,在HTTP的上下文中,URL被叫做“网络地址”或连接。或者就是网址,以下面这个URL为例,介绍下普通URL各部分组成,所谓的URL其实就是网址。
一个完整的url包含以下几部分:
在这里插入图片描述
http 是浏览器自动给我们加的 8080端口是周知端口,也会省略掉

上图中的井号代表锚点: 什么是锚点呢?锚点后就是访问后置顶显示的内容,这个锚点我们做接口测试用不到

谷歌浏览器可以监听http请求 我一回车我浏览器发送的请求
F12 打开谷歌开发者调试工具,我访问网址,如果你想监听当前浏览器发送的请求,点到Network里面我一回车,就会出现一条一条的数据,每一条数据就是一个http请求。
在这里插入图片描述
Request URL(请求URL): 我这次请求,我发送的地址就是这个
https: 协议
s.taobao.com 域名(如果后面是周知端口会省略掉)
/search 路径 这个路径是我要搜索
问号开始后面所有的内容叫url参数,也叫查询参数。 如果在查询参数后面带一个#号,这个就叫做锚点。
扩展
什么是域名?所谓的域名其实就是我们经常说的网址(主机和端口),为什么要有网址呢?因为ip地址是数字不好记忆,你知道百度网站的ip是什么吗?不知道吧,但是你知道他的网址吗,知道吧。你输入www.baidu.com它就帮你打开了百度这个网页,现在大家基本上都是用的https协议,当你在浏览器里面输入这个网址的时候网址后面还会跟一个冒号,冒号后面还会跟一个443端口,如果你是http协议就是80端口(协议和端口通常浏览器会自动给你加上),像这种周知端口我们不用跟,浏览器自动会处理,如果你有特殊的你就要加,域名和IP会有对应关系,每个地方的网络里面都会有一个DNS服务器,这个DNS服务器它就会去把网址和ip一一对应,当我们在浏览器输入www.baidu.com的时候首先它其实不是向百度网站去发请求,会首先向DNS服务器发请求,它会把这个网址发给DNS服务器,DNS服务器会帮你做DNS解析,解析之后会告诉你www.baidu.com 它的 ip是多少,那你拿到这个ip之后你再向ip发请求然后拿到数据,这是这样的一个过程。
有时候我们说DNS劫持,如果你的电脑DNS被劫持了,那么我就可以给你重定向,你百度.com的时候我就可以把你定到我想要你访问你的那个网址 域名就是网址

所以 Host请求头就是域名 (就是主机和端口号),如果你的主机不是域名,你的端口不是对应的80端口,你就需要自己带上。
通过一个域名 解析一个IP,当你访问www.baidu.com,这个域名会被DNS域名解析服务器解析成一个IP
在这里插入图片描述

3.1.4 超文本传输安全协议 https 默认是443端口

http协议是明文传递的,数据在传递的过程中是明文的,包括用户名和密码,用POST请求也没用,别人如果抓你的包,看到的还是明文的。
https在数据传递之前要加密,服务端在接收到数据之后会解密,服务端给出的响应也会加密,接收后也需要解密,需要用到第三方证书才会相互信任

HTTPS 超文本传输安全协议,是以安全为目标的HTTP通道,简单讲是HTTP的安全版
http协议是基于TCP/IP协议的,而https是在http协议的基础之上(底层的协议还是http),再加了一层SSL/TLS协议,数据在传输过程中是加密的
先建立一个加密通道,你在发送的时候把它加密了,发过去的时候在那边再解密。

现在大多数网站都是https协议,

建立好连接之后,我把数据加密了发给你,你再把响应数据加密了发给我,并且对数据进行加密的密钥都是请求和响应的时候随机生成的(在一次连接都会随机生成一个),所以非常安全。简单理解就是安全的http协议

在这里插入图片描述

扩展

HTTP 连接管理

连接管理是一个HTTP的关键话题:打开和保持连接在很大程度上影响着网站和Web应用程序的性能,在HTTP/1.X里有多种模型:短连接,长连接 和HTTP流水线

在http1.0的时候连接它叫短连接,为什么是短连接呢?其实这个也是有历史原因的
在早期,我们的服务器的性能,带宽,数据 相应落后一点,它用短连接响应的效率会更高
HTTP的传输协议主要依赖于TCP来提供从客户端到服务器之间的连接,在早期,HTTP使用一个简单的模型来处理这样的连接,这些连接的生命周期是短暂的,每发起一个请求时都会创建一个新的连接,并在收到应答时立即关闭

你每发送一个请求都会建立一个连接,然后去发送这个请求,然后去返回这个请求,然后把它关闭,这个叫短连接,下次你又想发送的时候,建立连接,发送请求,响应请求。。。关闭 每次都是这样。
在这里插入图片描述

这个简单的模型对性能有先天的限制:创建和关闭每一个连接都是相当耗费资源的操作是非常耗时的,客户端和服务端之间需要交换好些个消息,当请求发起时,网络延迟和带宽都会对性能造成影响,之前可能只需要发送几个请求不会发送很多,但是现在浏览器往往要发起很多请求(十几个或者更多)才能拿到所需的完整信息,用这个简单的模型就意味着要打开关闭打开关闭几十次,证明了这个早期模型的效率低下。
有两个新的模型在HTTP/1.1 诞生了,首先是长连接模型,它会保持连接去完成多次连续的请求,减少了不断重新打开连接的时间,如果你在一定时间内你没有发送新的请求它就认为你的请求结束了,那么它就会关闭连接,节约了很多打开关闭的时间,我只需要等待服务器的等待时间就可以了。
然后是HTTP流水线型模型,它要更先进一些,多个连续的请求甚至都不用等待立即返回就可以被发送,这样就减少了耗费在网路延迟上的时间
长连接:
在这里插入图片描述
长连接也有它的缺陷
服务器那边还是会等待很多时间,如果我的服务器可以并发处理,就是一次可以处理多个请求,把多个请求一起发过来,那我这边可以同时处理,就更节省时间,所以我们又出现了HTTP流水线
在这里插入图片描述
如果你有多个请求的话同时发送,不用等待单个请求响应完之后,而是你可以一起发送,然后我的服务器会同时去帮你处理这些请求,然后再把它返回,它比长连接会更加先进,但是流水线型用的不多,因为它有很多问题,对服务器这边的要求会很高,虽然在某些场景下可能会使用流水线型,但是更多地使用的是长连接。

两篇非常有用的学习博客
a
b

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值