接口测试(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地址,如https://www.baidu.com
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并返回数据。
token

HTTP协议的请求类型
GET:从服务器端获取资源或数据
POST:向服务器端提交数据
OPTIONS,HEAD,DELETE,PUT,TRACE
GET和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('http://www.fanyunedu.com/mms/login.html')
    resp.encoding = 'utf8'
    print(resp.text)
2.1带参数传参---直接通过url地址传,后面加?传参
def func2():
     resp = requests.get('http://www.tencent.com:5000/general/search?kw=健力宝')
     print(resp.text)

2.2带参数传参----通过字典传,params=字典名
 params1 = {
        'kw': 'bmw'
    }
    resp = requests.get('http://www.tencent.com: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('http://www.tencent.com/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('http://www.tencent.com: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('http://www.tencent.com:5000/', headers=headers)
    print(resp.text)
2.利用登陆后的cookie,绕过登录,骗服务器 ----headers=”cookie“
def func5():
    headers = {
        'Cookie': 'JSESSIONID=DD86F5991F9C6EFE19664D78B9FF9E02'
    }
    resp = requests.get('http://www.tencent.com/mms/Login/GetLoginName',headers=headers)
    print(resp.text)
用session维持会话状态(在接口测试中,凡是要使用登录来进行测试的接口,一律使用session对象来请求。)
def func6():
    sess = requests.Session()  # 创建一个session,用于在代码中保持会话状态
    data = {
        'username': 'admin',
        'password': 'admin123'
    }
    sess.post('http://www.tencent.com/mms/Login/loginUser', data=data)
    resp = sess.get('http://www.tencent.com/mms/Login/GetLoginName')
    print(resp.text)

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

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

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

def func8():
    # 先构造普通参数
    data = {
        'batchname': 'GB20220322'
    }
    # 构造文件参数
    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('http://www.taobao.com: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 hashlib
def 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('http://www.tencent.com:5000/general/userinfo_sign', json=data)
    print(resp.text)

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

import etree
def func12():
    sess = requests.Session()  # 创建一个session,用于在代码中保持会话状态
    data = {
        'username': 'admin',
        'password': 'admin123'
    }
    sess.post('http://www.taobao.com/mms/Login/loginUser', data=data)
    resp = sess.get('http://www.taobao.com/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('http://www.tencent.com:5000/general/login_token', data=data)  #先得到响应结果
    resp_json = resp.json()   # 只适合于响应对象的值是json的情况,如果返回值不是json,则会报错   #再从响应结果中得到响应的json的内容
    token = resp_json['data']   #再从json里获取token

    headers = {
        'auth-token': token
    }
    resp = requests.get('http://www.tencent.com:5000/general/userinfo_token', headers=headers)  #带上token进入里面的网址,类似于cookie
    resp_json = resp.json()  #里面的网址的json值
    print(resp_json['data']['联系方式'])  #获取json里的data中的联系方式

func14()


版权声明:本文为qq_43023590原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。