Requests接口测试-对cookies的操作处理(一)
大家都对cookie都不陌生,我们本篇文章使用requests结合cookie进行实例演示。我们使用一个接口项目地址,因为接口项目涉及到隐私问题,所以这里接口的地址我暂时不会给大家开放,但是我会给大家演示一个整体cookie的处理流程,因为这部分在实际的接口测试中是十分重点的。大家只需要把处理cookie的流程和原理整明白了,其他的就都好说了。。。我们接下开始干:
首先呢,我们要知道整个cookie的一个实现:
其实cookie是一个客户端的机制,关于cookie的实现其实是很复杂的。大家可以访问这篇文章去学习和了解:深入理解cookie和session ok,我们了解了什么是cookie以后在来看下面的操作。首先我们要知道cookie的一个整个请求处理流程:
1.发送登陆请求
2.登陆成功后
3.获取session信息并返回
4.带着登陆成功后的session登陆后的其他接口
在访问登陆接口时,我们先开启charles进行抓包,然后在定义一个login方法,来看代码的实现方法:

抓取登陆请求后,我们使用requests进行编写login接口:
import requests def login():
r = requests.post(
'http://xxxxxxx:20080/auth/login',
data={"username":'system',"password":""}
)
return r.json()
print (login())
我们查看登陆后,系统返回的结果:
C:\Python35\python.exe E:/project/index.py
{'code': } Process finished with exit code
很明显,返回了一个code=200的状态码,这个并不是我们需要的,我们需要的是登陆后,服务器返回的session,我们要获取这个Session,方便我们访问系统的其他接口,所以,这里面,我们需要使用一个特殊的方法来获取登陆系统后,服务器返回的session,继续往下看,我们将上面的代码进行处理: r.cookies是获取服务器返回的session方法
import requests def login():
r = requests.post(
'http://xxxxxxx:20080/auth/login',
data={"username":'system',"password":""}
)
return r.cookies
print (login())
返回结果:
<RequestsCookieJar[<Cookie port= for 117.39.63.66/>, <Cookie session=.eJwdjsuKwkAQRX9Fau0ibesmMIuGSJNAdxGoGKo2wmh8lMkmjsRp8d8nzvZwz-W8YH8au_sF8p_x0S1hfz1C_oLFN-SAPqyDbldIO-U2bIQOv-hrw63ceKgT68EK8SYOpYnaGKHGiopyclZ8MyGFp2h_ZS2nD0dqMmznDUkvhQyh_Xhyi-qykESDryde7fqQI7gveS3jcu_G_Hwy8_wA-akbj.DlapFg.6CIk-zQ13C3TbJ-mjjNP_tpxySw for 117.39.63.66/>]>
OK,我们得到了服务端返回的cookies,类似这种的<Cookie session=.eJwdjsuKwkAQRX9Fau0ibesmMIuGSJNAdxGoGKo2wmh8lMkmjsRp8d8nzvZwz-W8YH 然后我们取到session,使用的方法是:r.cookies["session"],看代码如下:
import requests def login():
r = requests.post(
'http://xxxxxxx:20080/auth/login',
data={"username":'system',"password":""}
)
return r.cookies['session']
print (login())
返回结果如下:
.eJwdjsuKwkAQRX9Fau0ibesmMIuGSJNAdxGoGKo2wmh8lMkmjsRp8d8nzvZwz-W8YH8au_sF8p_x0S1hfz1C_oLFN-SAPqyDbldIO-U2bIQOv-hrw63ceKgT68EK8SYOpYnaGKHGiopyclZ8MyGFp2h_ZS2nD0dqMmznDUkvhQyh_Xhyi-qykESDryde7fqQ2GBx7KOyRV8N828KdE5M1QWpnptKK4XLkCplcs9I7gveS3jcu_G_Hwy8_wA-akbj.Dlaprw.y-qE1LxdvCMnz0W9B87H6Cv8W80
ok,整个cookie的获取流程我们就到这里了。假设如果我们不带上session,直接访问系统的其它任意一个接口,我们来看一下是否可以呢?我们继续定义一个方法,叫getInfo,代码如下:
import requests def login():
r = requests.post(
'http://xxxxxxx:20080/auth/login',
data={"username":'system',"password":""}
)
return r.cookies['session'] def getInfo():
r =requests.get('http://xxxxx:20080/settings/option/cloud/data')
return r.text
print(getInfo())
查看返回结果:
C:\Python35\python.exe E:/project/index.py
<!DOCTYPE html>
<!--[if IE ]>
<html lang="en" class="ie8 no-js"> <![endif]-->
<!--[if IE ]>
<html lang="en" class="ie9 no-js"> <![endif]-->
<!--[if !IE]><!-->
<html lang="en">
<!--<![endif]-->
<!-- BEGIN HEAD --> <head>
<meta charset="utf-8" />
<title>
xxxxxxxxx系统
</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="width=device-width, initial-scale=1" name="viewport" />
<meta content="" name="description" />
<meta content="" name="author" />
<!-- BEGIN GLOBAL MANDATORY STYLES -->
<link href="../static/global/plugins/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
<link href="../static/global/plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<link href="../static/global/plugins/uniform/css/uniform.default.css" rel="stylesheet" type="text/css" />
<!-- BEGIN PAGE LEVEL STYLES -->
<link href="../static/pages/css/login-1.min.css" rel="stylesheet" type="text/css" />
<!-- END PAGE LEVEL STYLES -->
<!-- BEGIN THEME LAYOUT STYLES -->
<!-- END THEME LAYOUT STYLES -->
<link rel="shortcut icon" href="/static/img/favicon.ico" /> </head>
<!-- END HEAD --> <body class=" login"> <div id="wrapper">
<div class="login_box">
<form class="login-form" action="/auth/login" method="post" onsubmit="return false;">
<div class="alert alert-danger display-hide" style="display: none">
<button class="close" data-close="alert"></button>
<span> 请输入用户名密码. </span>
</div>
<div class="login_right">
<div class="login_wrapper">
<div class="park_icon">
<div class="left">
<img src="/static/img/login_icon.png" alt="">
</div>
<div class="right">
<img src="/static/img/login_text.png" alt="">
</div>
</div>
<div class="title">
xxxxxxxxxx
系统 </div> <div class="input_box"> <div class="form-group"> <div class="input-icon"> <input class="form_login" type="text" placeholder="用户名" name="username" /> </div> </div> <div class="form-group"> <div class="input-icon"> <input class="form_login" type="password" placeholder="密码" name="password" /> </div> </div> </div> <button type="submit" class="btn white pull-right"> 登录 </button> </div> </div> </form> </div> </div> <script src="../static/global/plugins/jquery.min.js" type="text/javascript"></script> <script src="../static/global/plugins/bootstrap/js/bootstrap.min.js" type="text/javascript"></script> <script src="../static/global/plugins/uniform/jquery.uniform.min.js" type="text/javascript"></script> <!-- END CORE PLUGINS --> <!-- BEGIN PAGE LEVEL PLUGINS --> <script src="../static/global/plugins/jquery-validation/js/jquery.validate.min.js" type="text/javascript"></script> <script src="../static/global/plugins/jquery-validation/js/additional-methods.min.js" type="text/javascript"></script> <!-- END PAGE LEVEL PLUGINS --> <!-- BEGIN THEME GLOBAL SCRIPTS --> <script src="../static/global/scripts/app.min.js" type="text/javascript"></script> <!-- END THEME GLOBAL SCRIPTS --> <!-- BEGIN PAGE LEVEL SCRIPTS --> <script type="text/javascript"> jQuery(document).ready(function() { $(".login-form").validate({ errorElement: "span", errorClass: "help-block", focusInvalid: !, rules: { username: { required: ! }, password: { required: ! }, remember: { required: ! } }, messages: { username: { required: "用户名不能为空." }, password: { required: "密码不能为空." } }, invalidHandler: function(e, r) { $(".alert-danger span").text("请输入用户名密码."); $(".alert-danger", $(".login-form")).show() }, highlight: function(e) { $(e).closest(".form-group").addClass("has-error") }, success: function(e) { e.closest(".form-group").removeClass("has-error"), e.remove() }, errorPlacement: function(e, r) { e.insertAfter(r.closest(".input-icon")) }, submitHandler: function(e) { $('button').html('正在登录...').css('opacity', '0.5').css('cursor', 'progress'); $('#username, #password').attr('disabled', 'disabled'); var postData = $(e).serialize(); $.post("/auth/login", postData, function(data) { if (data.code == ) { window.location.href = "/"; } else { $(".alert-danger span").text(data.err_msg); $(".alert-danger", $(".login-form")).show(); $('button').html('登录').css('opacity', '').css('cursor', 'pointer'); $('#username, #password').removeAttr('diabled'); } }); return false; } }); $(".login-form input").keypress(function(e) { return == e.which ? ($(".login-form").validate().form() && $(".login-form").submit(), !) : void }); }); </script> </body> </html> Process finished with exit code
答案显而易见,我们没有登录成功,所以这个接口我们是无法访问的.这时候我们就要带上session来访问我们刚刚的接口了,我们继续来看 加上session后的整个代码的处理:
import requests def login():
r = requests.post(
'http://117.39.xxxx/auth/login',
data={"username":'system',"password":""}
)
return r.cookies['session'] def getInfo():
r =requests.get('http://117.39.xxxxx/settings/option/cloud/data',
cookies={"session":login()}) #增加session
return r.json() print(getInfo())
查看返回的结果:
{'code': , 'data': {'cloud_ip': {'value': 'sc.parkingwang.com'}, 'waiting_enable_flag': {'value': ''}, 'parkno_type': {'value': }, 'terminal_operator': {'value': '192.168.199.1'}, 'total_full_limit_type': {'value': ''}, 'tmp_full_limit_flag': {'value': ''}, 'cloud_port': {'value': ''}, 'arm_no': {'value': ''}, 'connected': {'value': ''}, 'pic_upload': {'value': ''}, 'cloud_url': {'value': 'http://api.com/picupload/'}, 'auth_car_waiting_enable_flag': {'value': ''}, 'fixed_full_limit_flag': {'value': ''}}}
很明显,我们登录成功了,系统的接口也访问成功了。


Requests接口测试-对cookies的操作处理(一)的更多相关文章
- Requests接口测试-对cookies的操作处理(二)
我们继续来讨论一下cookie这方面的内容,我们都知道cookie是数据,一般的话在我接口测试中,数据都是要和代码进行分离的.本篇内容,我们队cookie内容进行处理,我们把登陆成功后的cookie写 ...
- Requests接口测试库-官网快速上手
Requests 一个发送HTTP请求的库基于urllib3,相比自带的库,提供了更高效简洁的可用方法,测试从业者用来做接口测试的一个好工具 文章内容均来自官网:https://requests.re ...
- python requests接口测试
Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最 ...
- Requests发送带cookies请求
一.缘 起 最近学习[悠悠课堂]的接口自动化教程,文中提到Requests发送带cookies请求的方法,笔者随之也将其用于手头实际项目中,大致如下 二.背 景 实际需求是监控平台侧下发消息有无异常, ...
- requests请求获取cookies的字典格式
python中requests请求的cookies值一般是jar包,如何将cookies值改为字典,此处运用了方法.举例如下: import requests response = requests ...
- requests接口测试-requests的安装
requests接口测试-requests的安装 安装常见问题 提示连接不上,443问题 一般是因为浏览器设置了代理,关闭代理. 网络加载慢,设置国内镜像地址 1.pip安装 2.pycharm安装 ...
- (四)requests模块的cookies和代理操作
基于requests模块的cookie操作 引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取某个人“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到 ...
- Python+Requests接口测试教程(1):Fiddler抓包工具
本书涵盖内容:fiddler.http协议.json.requests+unittest+报告.bs4.数据相关(mysql/oracle/logging)等内容.刚买须知:本书是针对零基础入门接口测 ...
- Python+Requests接口测试教程(2):
开讲前,告诉大家requests有他自己的官方文档:http://cn.python-requests.org/zh_CN/latest/ 2.1 发get请求 前言requests模块,也就是老污龟 ...
随机推荐
- phpstorm 光标设置
1.是否允许光标定位在行尾之后的任意位置Allow placement of caret after end of line 这个设置是上下换行的时候,光标可以定位在任意位置,只能通过方向键移动光标, ...
- erp中三大订单CO、PO、MO
ERP即 企业资源计划 (Enterprise Resource Planning),由美国 Gartner Group 公司于1990年提出. ERP系统是指建立在信息技术基础上,以系统化的管理思想 ...
- charles手机抓包配置-2
破解的安装包,自己的百度云里有收藏 http://www.zhimengzhe.com/IOSkaifa/248398.html http://blog.csdn.net/swj6125/articl ...
- POJ 1061 青蛙的约会(拓展欧几里得求同余方程,解ax+by=c)
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 122871 Accepted: 26147 Descript ...
- PhpStorm 配置在浏览器中打开文件
这东东中文资料太少- -鼓捣了好久才有结果 点击File-Settings-Deployment .点+按钮增加服务器 Mapping 设置工程路径等 点击 Edit Confi 这东东中文资料太少- ...
- 【BZOJ】1057 [ZJOI2007]棋盘制作(悬线法)
题目 传送门:QWQ 分析 先把题目给出的矩阵变换一下,如果$ a[i][j] $中$ i+j \mod 2 = 1 $那么就对$ a[i][j] $取一下反. 接着就是求原图中最大的0.1子矩阵 详 ...
- 项目管理工具maven(二)
2 整合ssh框架 2.1 依赖传递 只添加了一个struts2-core依赖,发现项目中出现了很多jar, 这种情况 叫 依赖传递 2.2 依赖版本冲突的解决 1. 第一声明优先原则 <dep ...
- SQL中INNER JOIN的用法
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表 ...
- windows 关机 重启 命令
关机 shutdown -s -t 0 重启 shutdown -r -t 0 重启电脑windows 立即关机 shutdown -s 三十分钟后关机 shutdown -s -t 30 举例说明一 ...
- RAD C++Builder xe7 std::map xtree BUG
c++Builder 6 下的std::map还能用,有代码提示. 换到xe7,代码提示出来就一个tt.operator [](),代码没法往下写了. 最后把Target Platforms切换到64 ...