接口测试之requests库

接口测试之requests库

      • requests.get()
      • requests.post()
      • 提取 token 信息
      • 提取 cookie 信息
      • 使用 session 进行会话

requests.get()

将鼠标移至 get处,按住Ctrl,单击鼠标左键,查看源代码

def get(url, params=None, **kwargs):
    r"""Sends a GET request.

    :param url: URL for the new :class:`Request` object.
    :param params: (optional) Dictionary, list of tuples or bytes to send
        in the query string for the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response ` object
    :rtype: requests.Response
    """

    kwargs.setdefault('allow_redirects', True)
    return request('get', url, params=params, **kwargs)
从代码和注释中,可以得到这些信息:
传的参数有url,data,json,**kwargs,
其中,url是位置参数(必传参数);
params属于默认参数,默认为空,调用函数时可传可不传该默认参数的值;
params参数表示的请求格式是 query string
**kwargs 为包裹关键字参数,如果要添加该类型的参数,必须进行声明该参数的变量,加上关键字,才能解析出来
import requests
url1 = 'http://127.0.0.1:8000/axf/home/'

headers ={
     "referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}


res = requests.post(url,headers=headers)

print(res)

requests.post()

将鼠标移至 post 处,按住Ctrl,单击鼠标左键,查看源代码

def post(url, data=None, json=None, **kwargs):
    r"""Sends a POST request.

    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
        object to send in the body of the :class:`Request`.
    :param json: (optional) json data to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response ` object
    :rtype: requests.Response
    """

    return request('post', url, data=data, json=json, **kwargs)
从代码和注释中,可以得到这些信息:
传的参数有url,data,json,**kwargs,
其中,url是位置参数(必传参数);
data、json都是属于属于默认参数,默认为空,调用函数时可传可不传该默认参数的值
data参数表示的请求格式 Content-Type 为 application/x-www-form-urlencoded,表单形式
json参数表示的请求格式 Content-Type 为 application/json,json形式;
**kwargs 为包裹关键字参数,如果要添加该类型的参数,必须进行声明该参数的变量,加上关键字,才能解析出来

以用户注册为例

import requests
url1 = 'http://127.0.0.1:8000/axf/register/'

headers ={
     "Content-Type":"application/text","referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
     "mobile_phone":"17379745548","pwd":"12345678"}


res = requests.post(url,data,headers)

print(res)

这种提交方式会注册失败,因为在调用 requests.post() 方法时,无法解析 headers 变量的内容,headers需以包裹关键字参数方式传递

import requests
url1 = 'http://127.0.0.1:8000/axf/register/'

headers ={
     "Content-Type":"application/text","referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
     "mobile_phone":"17379745548","pwd":"12345678"}


res = requests.post(url,data,headers=headers)

print(res)

而如果参数的提交方式是json格式的形式,则可以通过该种方式提交,就不需要声明 Content-Type了,接口返回的内容,一般也是json格式,获取接口返回内容,进行输出的时候,也可以使用 json 格式的形式输出

import requests
url1 = 'http://127.0.0.1:8000/axf/register/'

headers ={
     "referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
     "mobile_phone":"17379745548","pwd":"12345678"}


res = requests.post(url,json=data,headers=headers)

print(res.json())

当然,也可以通过这种方式提交json格式的数据

import requests
url1 = 'http://127.0.0.1:8000/axf/register/'

headers ={
     "Content-Type":"application/json","referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
     "mobile_phone":"17379745548","pwd":"12345678"}


res = requests.post(url,data,headers=headers)

print(res)

提取 token 信息

在某些网站,用户登录后,用户信息会带有 token 信息,作为鉴权内容,例如用户在登录后进行某些相应操作,这些接口的访问都需要带上 token 信息,所以,在用户登录成功后,需要在登录接口返回信息中提取 token 信息的值

import requests
url1 = 'http://127.0.0.1:8000/axf/login/'

headers ={
     "referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
     "mobile_phone":"17379745548","pwd":"12345678"}


res = requests.post(url,json=data,headers=headers)

print(res.json())

返回的接口信息如下:

{
     
	"code":"0000",
	"statu":"ok",
	"data":
		{
     
		    "id": 700963644,
		    "username": "苹果",
		    "token":"EJF5232E929BA0197B33840B0CBC2F4706F85"
		}
}

token 本质上就是字符串,所以,在返回的json数据中提取出 token 就行了,在访问某个接口需要用到 token 时,就在接口中加上token 信息

token = res.json()["data"]["token"]

token 信息可能放在请求头 headers 里,也可能放到请求体 body 里,这个依据开发的接口文档而定

有些页面,比如购物车页面,用接口方式进行访问,需要带上用户信息,才能返回购物车页面的商品信息

import requests
url1 = 'http://127.0.0.1:8000/axf/login/'

headers ={
     "referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
     "mobile_phone":"17379745548","pwd":"12345678"}

res = requests.post(url,json=data,headers=headers)
token = res.json()["data"]["token"]


url2 = 'http://127.0.0.1:8000/axf/cart/'

headers2 ={
     "referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50","token"=token}

res2 = requests.post(url2,json=data,headers=headers2)
print(res2.text)

提取 cookie 信息

有些项目是使用 token 进行鉴权,有些则是采用 cookie 信息

采用 cookie 信息进行鉴权的,登录成功后接口中就没有返回相应的 token 信息,可能返回的就是这个样子

{
     
	"code":"0000",
	"statu":"ok",
	"data":
		{
     
		    "id": 700963644,
		    "username": "苹果"
		}
}

而有些页面,比如购物车页面,如果这时候进行用接口方式进行访问,且没有带上用户信息,会提示你去登录,或者返回报错

import requests
url1 = 'http://127.0.0.1:8000/axf/login/'
url2 = 'http://127.0.0.1:8000/axf/cart/'


headers ={
     "referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
     "mobile_phone":"17379745548","pwd":"12345678"}


res1 = requests.post(url1,json=data,headers=headers)
print(res1.json())

res2 = requests.post(url2,json=data,headers=headers)
print(res2.text)

res2返回的的内容,并不是购物车页面的内容。可是,鉴权的方式又不是token了,接口返回的参数内容中又没有相关信息,这要怎么进行接口测试?

在用户登录成功后,服务器会有一个 setcookie 的操作,服务器返回的内容,会在 headers 里存放cookie信息,服务器和浏览器之间,就通过 session会话 进行交流。

浏览器cookie中的信息,可能是长这个样子,这个是服务端定义的一个字段,名称中可能会带有 “session”,但一般都不会设置这么明显

JESESSIONID = CBC2F4EJF5232E929BA0197B33840B0706F85

服务端进行用户鉴权,就是通过这个字段,浏览器与服务端进行会话时,会自动带上 cookie 信息,而我们的代码中,则没有 cookie 信息,所以不会正确返回购物车页面的相关信息

所以,在代码中,登录操作成功后,需要获取 cookie 信息

import requests
url1 = 'http://127.0.0.1:8000/axf/login/'
url2 = 'http://127.0.0.1:8000/axf/cart/'


headers ={
     "referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
     "mobile_phone":"17379745548","pwd":"12345678"}


res1 = requests.post(url1,json=data,headers=headers)
print(res1.json())

# 获取cookie
cookies = res1.cookies

res2 = requests.post(url2,json=data,headers=headers,cookies=cookies)
print(res2.text)

当然,如果登录成功后接口返回的不是 json 格式的数据,而是 html 格式的数据,那就可能需要使用正则去匹配到 cookie 信息,再进行一些处理操作

使用 session 进行会话

上面说述方法,每次都要带上 cookie ,有没有简单一点的操作?

还可以通过 session 方式进行会话。requests库中,封装了 session 方法

import requests

session = requests.Session()

url1 = 'http://127.0.0.1:8000/axf/login/'
url2 = 'http://127.0.0.1:8000/axf/cart/'


headers ={
     "referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
     "mobile_phone":"17379745548","pwd":"12345678"}


res1 = session.post(url1,json=data,headers=headers)
print(res1.json())

res2 = session.post(url2,json=data,headers=headers)
print(res2.text)

session.close()

这种方式,也能成功访问购物车页面,可以理解为,session 实现了浏览器的功能,代码通过 session 与服务端进行会话

但是,这里要注意,如果存在多个 session 会话,会话之间的信息不流通使用

import requests

session = requests.Session()

url1 = 'http://127.0.0.1:8000/axf/login/'
url2 = 'http://127.0.0.1:8000/axf/cart/'


headers ={
     "referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
     "mobile_phone":"17379745548","pwd":"12345678"}


res1 = session.post(url1,json=data,headers=headers)
print(res1.json())

res2 = session.post(url2,json=data,headers=headers)
print(res2.text)



session2 = requests.Session()
res3 = session2.post(url2,json=data,headers=headers)
print(res3.text)

res3打印出来的内容,不是购物车页面的内容,因为 session2 这个会话没有进行登录操作

你可能感兴趣的:(#,接口自动化)