赞
踩
目录
在做接口请求时 ,我们经常会遇到这样的场景 ,就是系统的登录认证是通过cookies处理的 。
比如我要请求一个添加用户的接口 ,直接请求的话,系统认为你还没有登录 ,提示让你登录。怎么办 ?你只能先请求登录接口 ,然后从登录接口的响应中提取cookies ,然后再将cookies传递给添加用户接口 。这样添加用户接口才能正确的返回数据 。
那如果使用Python代码该如何实现呢 ? 在实现之前,你需要理解如下两点 :
什么是cookies ? 它是如何鉴权的 ?
如何使用requests进行鉴权 ?
指某些网站为了辨别用户身份而储存在用户本地终端上的一些数据,这些数据通常是经过加密的 。而cookies本身属于http协议中的一个特性。
而http有个特点就是无状态 , 比如 ,你要访问某宝,你的本次访问和下一次访问,对于服务器来说是它是不知道是否是同一个人。 这样的话,也就没有办法实现账号登录了,因为你这一秒的登录,下一秒网站就不再认识你了。 因此,必须让浏览器记住某些关键的信息,以便于你再下一次请求该网站时会带上这些信息, 以保持登录状态 。而这些关键信息就是存放在本地的cookies数据 。
Cookies的鉴权用户方式主要是通过在用户第一次访问服务器时,服务器会生成一个Cookies,包含用户的部分信息,如用户ID、sessionid等,然后通过响应头里的Set-Cookie传输到客户端并保存。之后,客户端在每次访问服务器时,都会在请求头里面包含这个Cookie,服务器通过比对Cookie里面的信息来确认用户的身份。为了防止Cookie被人为修改,通常会使用HMAC等加密技术进行签名。
以下是一系统的请求认证过程 :
第一次客户端请求 ,服务端返回了phpsessid ,客户端保存到了本地(浏览器中)
2. 第二次客户请求 ,带着刚才保存的phpsessid继续请求 。
3.进行登录成功时 ,服务端会返回登录账号和账号id ,通过cookies返回给客户端 。
4.再往后所有的客户端请求 ,都会带着这几个关键信息 ,比如:用户账号 、对应id 、phpsessid等 。服务器根据这些信息就判断出了是那个账号在登录以及是否登录 ,从而就解决了http无状态的情况 。
如果你使用代码去处理cookies的信息 ,那么就的知道有这么一个三方包也可以搞定这个问题 ,它就是requests .
这就需要你掌握一些requests的一些知识 ,如有需要可参考可参考 :如果你有意学习接口自动化测试 ?这个包是你要首先掌握的。 - 知乎 (zhihu.com)
使用requests其实只需要三步就可以搞定 :
请求登录接口 ,获取cookies信息 ,通过响应对象,调用cookies属性 , 具体代码 :response.cookies
将获取到的cookies信息转化为字典格式 ,这个需要用到requests.utils.dict_from_cookiejar()
方法,就是将上面获取到的cookies信息传入此方法内 ,即可转化位Python字典格式 。
将Python字段再转化为cookies对象 ,转化后的对象即可传入对应的请求方法中了 。具体转化代码 :requests.utils.cookiejar_from_dict(cookies, cookiejar=None, overwrite=True)
具体代码 :
- import requests
- import requests.utils
- from cacheout import Cache
-
- cache = Cache()
-
- # 调用登录接口
- def login():
- url = "http://127.0.0.1:81/zentao/user-login.html"
- body = {"account":"admin","password":"123456","passwordStrength":0}
- response = requests.post(url,data=body)
- cookies = requests.utils.dict_from_cookiejar(response.cookies) # 转化位Python对象
- cookie_jar = requests.utils.cookiejar_from_dict(cookies, cookiejar=None, overwrite=True) # 生成cookies对象
- cache.set('cookie_jar',cookie_jar) # 将cookies 保存到本地缓存中。
- print(response.text)
通过以上代码的实现 ,就成功将cookies信息保存到了本地缓存了 ,下次其他的任何接口请求带上这个cookeis对象就可以了 。
以下使用的是一个禅道系统,我要调用它的测试用例接口 ,但是再调用前就遇到登录认证的问题了 ,而它的认证方式就是使用的cookies认证 。故我们就可以使用上面方案去解决 。
就调用该系统下的如下两个接口 。
- import requests
- import json
- import requests.utils
- from cacheout import Cache
-
- cache = Cache()
-
-
- # 调用登录接口
- def login():
- url = "http://127.0.0.1:81/zentao/user-login.html"
- body = {"account":"admin","password":"123456","passwordStrength":0}
- response = requests.post(url,data=body)
- cookies = requests.utils.dict_from_cookiejar(response.cookies)
- cookie_jar = requests.utils.cookiejar_from_dict(cookies, cookiejar=None, overwrite=True)
- cache.set('cookie_jar',cookie_jar)
- print(response.text)
-
-
- class Zentao:
-
- def __init__(self):
- login()
- self.client = requests.Session()
- self.cooikes = cache.get('cookie_jar')
-
-
- # 获取某个项目的测试用例
- def get_project_cases(self,productID):
- url = "http://127.0.0.1:81/zentao/testcase-browse-{}.html".format(productID)
- response = requests.get(url,self.cooikes)
- print(response.text)
-
- # 为某一项目创建测试用例
- def create_cases(self,productID,title,type='feature',**kwargs):
- url = "http://127.0.0.1:81/zentao/testcase-create-{}-0-0.html".format(productID)
- body = {'product':productID,'title':title,'type':type}
- if kwargs:
- body.update(**kwargs)
- response = requests.post(url,data=body,cookies=self.cooikes)
- return response.text
-
-
- if __name__ == '__main__':
- zentao = Zentao()
- print(zentao.get_zentao_all_cases())
- print(zentao.get_project_cases(16))
-
- # 若不加步骤就把这个参数去掉 。
- steps = {'steps[1]':'测试用例步骤1','expects[1]':'预期正常','steps[2]':'这是测试用例第二步','expects[2]':'预期也正常'}
- print(zentao.create_cases(16,'这次的测试用例带有测试步骤',**steps))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。