ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

学习python自动化——接口(requests+鉴权)

2022-06-25 00:04:22  阅读:185  来源: 互联网

标签:请求 python pprint url json session requests data 鉴权


一、接口概念:传递数据的通道
二、鉴权
  2.1、概念:验证用户是否拥有访问系统的权利
  2.2、session(放到cookie中)(会占用服务器资源)

    2.2.1、session注册鉴权流程
        1)浏览器:我要注册
        2)提交用户名,密码
        3)服务器:数据库无该用户,允许注册,接口处理注册请求,存储用户名和密码到数据库(密码会加密存储)
        4)注册成功
    2.2.2、session登录鉴权流程
        1)浏览器:我要登录
        2)提交用户名,密码
        3)服务器:数据库有该用户,校验密码(拿到密码加密计算然后与数据库对比),密码正确
        4)服务器:创建一个session对象,一般存储在数据库或内存里,把session_id通过响应头Set-cookie字段返回给客户端
        5)浏览器:登录成功从响应头取出Set-cookie字段,设置到下一个接口的请求头当Set-cookie字段中
        6)浏览器:请求其他接口
        7)提交请求参数,Set-cookie会自动携带
        8)服务器:收到请求,从请求报文请求头中获取Cookie,获取session_id与数据库存储的session_id对比,对比一致就处理请求
        9)返回响应数据
  2.3、token(每次登录时的token不同)

    2.3.1、Token鉴权流程
        1)浏览器:我要登录
        2)提交用户名,密码
        3)服务器:验证用户名和密码,根据特定算法生成token,token生成:签名(请求参数排序+用户id+时间戳)
        4)token返回给浏览器
        5)浏览器:获取后端返回的token,保存token请求头中
        6)浏览器:请求其他接口,携带包含token的请求头
        7)提交请求参数,携带token
        8)服务器:收到请求,从请求报文请求头中获取token,解析出用户id,与时间戳,user_agent信息
        9)服务器:通过用户id匹配用户,通过时间戳判断token是否失效,通过user_agent信息判断是否是冒用用户
        10)鉴权通过后,响应数据;鉴权不通过,拦截

三、requests(详见:http://testingpai.com/article/1615615517987)
  3.1、安装

pip install requests

  3.2、使用
    3.2.1、HTTP请求方法:requests都支持
    3.2.2、get请求

      参数传递方式:

        1、放在接口地址后面

import requests
import pprint
url='http://httpbin.org/get?key1=val&key2=val2'
res=requests.get(url=url)
pprint.pprint(res.json())

        2、通过params参数来接收

import requests
import pprint
url = 'http://httpbin.org/get'
data = {'key1':'val','key2':'val2'}
res = requests.get(url=url,params=data)
pprint.pprint(res.json())

    3.2.3、post请求
      1、data参数:默认使用'Content-Type': 'application/x-www-form-urlencoded'类型

import requests
import pprint
url = 'http://httpbin.org/post'
data = {'key1':'val','key2':'val2'}
res = requests.post(url=url,data=data)     #url:接口地址, data=None:请求参数(默认是application/x-wwww-form-urlencode)     
pprint.pprint(res.json())

      2、json参数:默认使用'Content-Type': 'application/json'类型

import requests
import pprint
url = 'http://httpbin.org/post'
data = {'key1':'val','key2':'val2'}
re=requests.post(url=url,json=data)        #url:接口地址,json=None:请求参数(默认是application/json)
pprint.pprint(re.json())

      3、不定长参数:请求头指定了Content-Type类型,不管使用data还是json参数,都会使用headers指定的类型

import requests
import pprint
header = {'Content-Type': 'application/json'}
url = 'http://httpbin.org/post'
data = {'key1':'val','key2':'val2'}
res = requests.post(url=url,data=data,headers=header)      #**kwargs不定长参数,可以自定义参数
pprint.pprint(res.json())

    3.2.4、patch请求:请求数据时只需要请求第一个数据
    3.2.5、put请求:请求数据时需要请求所有数据
  3.3、接口测试要素
    1、url地址
    2、请求参数
    3、请求方法

  3.4、获取请求/响应数据
    1、获取请求头:请求数据.request.headers

print('获取请求头信息:',reponse.request.headers)

    2、获取响应体:请求数据.json()

print('获取响应体信息:',reponse.json())

    3、获取响应头信息:请求数据.headers

print('获取响应头信息:',reponse.headers)

    4、获取cookie信息:请求数据.cookies

print('获取cookie信息:',reponse.cookies)

    5、获取响应状态码:请求数据.status_code

print('获取响应状态码:',reponse.status_code)

  3.5、session鉴权
    1、手动获取:先手动取出响应头中的session_id,再将session_id放到下一个请求接口的请求参数中

import pprint
import requests

login_url = 'https://test.emooc.com:6/public/login'
login_data={'loginAccount':'yangdi',
'password': 'Ynp0QDE0MDQ=',
'areaCode': 10,
'captchaCode': '',
'deviceType': '10',
'isAjax': 'true'
}
res=requests.post(url=login_url,data=login_data)
pprint.pprint(res.json())              #获取响应体
cookie=res.headers['_sessionid4pad_']      #获取响应头,从响应头中取出session_id(根据实际接口的字段取值)

list_url='https://test.emooc.com:6/login/user'
list_data={'isAjax':'true'}
list_res=requests.post(url=list_url,data=list_data,headers={'_sessionid4pad_':cookie})    #将取出的session_id放到下一个接口请求参数中(根据实际接口的字段赋值)
pprint.pprint(list_res.json())

    2、自动获取:用requests的session方法创建一个session对象,session_id会自动保存到session对象中,每次发送请求时带着创建的session对象发送请求

import pprint
import requests
login_url = 'https://test.emooc.com:6/public/login'
login_data={'loginAccount':'yangdi',
'password': 'Ynp0QDE0MDQ=',
'areaCode': 10,
'captchaCode': '',
'deviceType': '10',
'isAjax': 'true'
}
session=requests.session()          #用requests的session方法创建一个session对象,session_id会自动保存到session对象中
res=session.post(url=login_url,data=login_data)        #带着创建的session对象去发送请求
pprint.pprint(res.json())                     #获取响应体

list_url='https://test.emooc.com:6/login/user'
list_data={'isAjax':'true'}
list_res=session.post(url=list_url,data=list_data)      #带着创建的session对象去发送请求
pprint.pprint(list_res.json())                  #获取响应体

  3.5、token鉴权:只能手动获取,先手动获取响应体中的token,再将token放到下一个接口请求的参数中

import requests
import time

login_url = 'https://openapiv5.ketangpai.com/UserApi/login'
login_data = {"email":"1605118090@qq.com",
"password":"Aa123456",
"remember":"0",
"code":"",
"mobile":"",
"type":"login",
"reqtimestamp":int(time.time()*1000)} #时间戳,实时取,因为收到的那个时间戳是13位的,但获取到是10位的,所有要*1000,在int一下取整
reponse=requests.post(url=login_url,json=login_data)
print(reponse.json())

token=reponse.json()['data']['token'] #获取响应体里data里的token
user_url = 'https://openapiv5.ketangpai.com/UserApi/getUserBasinInfo'
user_data = {"reqtimestamp":int(time.time()*1000)} #请求参数
user_reponse=requests.post(url=user_url,json=user_data,headers={'token':token}) #查看token传递方法,所以用'token':token,根据项目实际情况,可能传的不是token
print(user_reponse.json())

  3.6、时间戳的处理方式

import time
print(time.time())      #实时取,获取到的是10位的1656083631.65472

标签:请求,python,pprint,url,json,session,requests,data,鉴权
来源: https://www.cnblogs.com/mango-93/p/16409921.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有