100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 接口测试(http协议 get和post请求和响应)

接口测试(http协议 get和post请求和响应)

时间:2022-08-08 16:44:58

相关推荐

接口测试(http协议 get和post请求和响应)

TCP/IP四层协议模型

HTTP协议

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网 络协议。是基于TCP/IP模型的应用层协议。 为什么叫超文本?不但可以传输文本数据,还可以传输音频、视频、超链接、图片等内容。HTTP协议之URL组成HTTP由请求和响应构成,是一个标准的客户端服务器模型(B/S架构)。HTTP协议永远都是客户端发起请求,服务器回送响应http的端口号是80,https的端口号是443. (补充:socket协议是全双工协议,C/S架构。服务器和客户端都能发送请求)HTTP请求过程一次http操作称为一个事务。 1. 浏览器输入目标url地址,如 2. dns域名解析:域名与ip映射 3. 建立tcp连接 4. 发送http request:请求信息 5. web服务器接收请求(指使用http协议传输资源提供服务) 6. 应用服务器处理业务逻辑(如tomcat,生成动态的http内容) 7. 关闭tcp连接:请求响应完成。如果浏览器在其头部信息中 加入了connection:keep-alive,则tcp连接将仍然保持打开状态 8. 浏览器:渲染响应页面web服务器和应用服务器:Web服务器可以解析(handles)HTTP协议。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应 (response),例如送回一个HTML页面。为了处理一个请求(request),Web服务器可以响应(response)一个静态页面或图片, 进行页面跳转(redirect)。相对而言比较简单。应用服务器处理业务的逻辑。

HTTP协议的特性

1. 无连接性(长连接性) 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并 收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。---用keep-alive保持连接。 2.无状态性 无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么 状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们 发送响应数据回来。但是发送完后不会记录任何信息。 ---解决方式:session,cookie,token。Cookie、Session和Token的作用和区别1.Cookie:一个具体的文本文件,由服务器生成,但保存在客户端。在客户端第一次请求后,服务 器会下发一个装有客户信息的“小贴纸”,后续客户端请求服务器的时候,带上这个“小贴纸”, 服务器就知道客户端的信息了。 2.Session:服务器用于保存客户端信息的“一堆数据”,每个session会有一个session id,这个id会被发送给客户端进行保存。session具有时效性,过期就失效了。 3.Token:服务器保存的session多了,资源有限的情况下必须做扩展。(类似于令牌) 用户通过用户名和密码进行登陆校验。 服务器验证,如果验证通过则返回一个服务器端签名的token 给客户端。 客户端储存token,并且每次用于每次发送请求。 服务端验证token并返回数据。HTTP协议的请求类型GET:从服务器端获取资源或数据POST:向服务器端提交数据OPTIONS,HEAD,DELETE,PUT,TRACEGET和POST的区别: •GET请求一般用于向服务器请求获取一个资源,没有副作用(幂等),一 般会在客户端做缓存POST请求一般用于向服务器提交数据并让其去完成 一件事,所以这个操作是有副作用的,不会在客户端做缓存。 •GET请求发送数据的时候,一般会将请求参数放在url字符串中发送给服务器端,所以从安全性角度来看相对没有POST请求安全性高,所以GET请求 一般不会用于比较隐私数据的传输。而POST请求是将请求数据放在请求体body里面,所以一般用于表单数据、登录数据等数据的传输。 TCP3次握手和四次挥手?TCP/IP协议是传输层的一个面向连接的安全可靠的传输协议,三次握手的机制是为了在客户端和服务端建立一个安全可靠的连接。握手:

挥手:

HTTPS和HTTP的区别?

https就是http协议+ssl协议。https是安全的,http是不安全的。

http的默认端口号:80,https的默认端口号是443

请求和响应的组成部分 1.请求:请求行---url地址 请求头 请求体(仅限POST请求)

请求头里面需要关注的点:

(1)URL地址:通过抓包直接看

(2)content-type:传递请求格式

(3)User-Agent:User-agent主要用作为表明当前请求是谁发送的。主要用于很多网站进行反 爬的时候,服务器会判断当前请求是否是浏览器发送的。(4)Cookie:表明当前请求用户对应的身份或者是状态。 2.响应:响应行—响应码 响应头 响应体

响应码:301表示永久重定向,302暂时重定向。

如何去写接口测试用例?

从正向和反向以及业务逻辑上去考虑。

正向:填写正确的参数组合p0

反向:功能异常(数据错误(非类型和长度错误),补充--已删除的用户名,登录失败);数据异常(传入参数为空,数据类型错误,数据长度错误);参数异常(多了参数,少了参数,没有参数)

业务逻辑:多个接口的组合的执行顺序,以及接口的依赖。

接口测试用例的编写包含的要素:

编号(ID),测试模块用例名称(标题,预期结果(输入内容组合),如:登陆成功(用户名和密码正确)),前置条件(依赖接口),请求url请求类型(post、get),请求头{字典格式},请求参数{字典格式},预期响应状态码预期返回数据{响应体},优先级

接口测试代码撰写:

请求的传参方式:

get请求传参方式:1.发送不带参数的get请求

# 发送不带参数的get请求def func1():resp = requests.get('/mms/login.html')resp.encoding = 'utf8'print(resp.text)

2.1带参数传参---直接通过url地址传,后面加?传参

def func2():resp = requests.get(':5000/general/search?kw=健力宝')print(resp.text)

2.2带参数传参----通过字典传,params=字典名

params1 = {'kw': 'bmw'}resp = requests.get(':5000/general/search', params=params1)print(resp.text)

post请求传参,需要关注请求头里面的content-type这个字段:

都以字典的格式组装;但是在自动化中传参后,报文会自动变为&连接,如username=wang&password=123456,这种格式,而json格式传参后,依旧保持字典格式。

1.如果content-type的值为application/x-www-form-urlencoded则说明post请求的参数是以普 通表单形式来进行提交。 参数名:data

def func3():data = { # 参数组装的字典'username': 'admin','password': 'admin'}resp = requests.post('/mms/Login/loginUser', data=data)print(resp.text)

2.如果content-type的值为application/json则说明post请求的参数是以json格式提交,参数名:json

data = {'username': 'class94','password': '123456','age': 1,'phone': '15888888888'}resp = requests.post(':5000/general/register_json', json=data)print(resp.text)

3.multipart/form-data,通常是用来上传文件,下面有上传file的代码介绍。

带上headers传参(应用场景)---headers传参一般是请求头里面的内容,比如content-type,cookie,user-agent……均可,以字典形式呈现,以headers传参。1.利用headers绕过反爬虫---headers=”User -Agent“

def func4():headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'}resp = requests.get(':5000/', headers=headers)print(resp.text)

2.利用登陆后的cookie,绕过登录,骗服务器 ----headers=”cookie“

def func5():headers = {'Cookie': 'JSESSIONID=DD86F5991F9C6EFE19664D78B9FF9E02'}resp = requests.get('/mms/Login/GetLoginName',headers=headers)print(resp.text)

用session维持会话状态(在接口测试中,凡是要使用登录来进行测试的接口,一律使用session对象来请求。)

def func6():sess = requests.Session() # 创建一个session,用于在代码中保持会话状态data = {'username': 'admin','password': 'admin123'}sess.post('/mms/Login/loginUser', data=data)resp = sess.get('/mms/Login/GetLoginName')print(resp.text)

上传文件---只有文件参数(记得带open,rb---二进制)

def func7():files = {'file': open(r'demo.txt', 'rb')}resp = requests.post(':5000/general/api/upload', files=files)print(resp.text)

上传文件--除了有文件参数外,还有其它参数(文件参数和其他参数都要传)。上传文件只能用post,下载文件只能用get。

def func8():# 先构造普通参数data = {'batchname': 'GB0322'}# 构造文件参数files = {'batchfile': open(r'demo.txt', 'rb')}resp = requests.post('http://taobao/goods/upload', data=data, files=files)print(resp.text)

下载普通文件-- 和python中文件读写类似(只能用get),将响应的text写入新建的文件中

def func9():resp = requests.get(':5000/general/api/download?file=1647914731.txt')# 下载普通的文本文件with open('result.txt', 'w') as f:f.write(resp.text)

下载图片--响应体的内容格式是content,(通常的响应体的内容格式是text和html)

def func9():resp = requests.get('http://taobao/lancome/image/logo.png')with open('lancome.png', 'wb') as f:f.write(resp.content) # 不能使用resp.text

加密接口请求,要导入hashlib模块,加盐值

import hashlibdef func10():uid, name, password, salt = '4', 'admin', 'admin123', 'taue19BJIOz9n6W8'm = hashlib.md5()m.update(('{}-{}-{}-{}'.format(uid, name, password, salt)).encode('utf8'))sign = m.hexdigest()#完成加盐值加密,下面正常传请求参数就行data = {'uid': '4','sign': sign}resp = requests.post(':5000/general/userinfo_sign', json=data)print(resp.text)

lxml库提取html页面源码的内容

import etreedef func12():sess = requests.Session() # 创建一个session,用于在代码中保持会话状态data = {'username': 'admin','password': 'admin123'}sess.post('/mms/Login/loginUser', data=data)resp = sess.get('/mms/mms/index.html')resp.encoding = 'utf8'html = etree.HTML(resp.text)# result = html.xpath("//a[@href='javascript:logOff()']/text()")result = html.xpath("//a[@href='javascript:logOff()']/@href")print(result)

根据响应内容,来获取返回值,再根据返回值获得其他信息。

def func14():data = {'username': 'admin','password': 'admin123'}resp = requests.post(':5000/general/login_token', data=data) #先得到响应结果resp_json = resp.json() # 只适合于响应对象的值是json的情况,如果返回值不是json,则会报错 #再从响应结果中得到响应的json的内容token = resp_json['data'] #再从json里获取tokenheaders = {'auth-token': token}resp = requests.get(':5000/general/userinfo_token', headers=headers) #带上token进入里面的网址,类似于cookieresp_json = resp.json() #里面的网址的json值print(resp_json['data']['联系方式']) #获取json里的data中的联系方式func14()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。