lena萌宝宝

导航

接口测试3-参数关联接口(从上一个接口中获取数据,访问幼儿园服务器接口无session)

 

 

一。视频举例:模拟输入用户名密码登录网站接口(有session)

1.通过fiddler抓包找到传递参数,其中usersession值每次都不一样,原因是:当我们访问网页时调用接口时,服务器会响应一个数据,接下来登录时,会从上一个接口的相应数据里面把值取出来作为登录的参数传递过去,所以单独请求无法成功。

如果这个接口中包含上一个接口的响应数据,我们就需要做一个参数的关联

这个数据是每次打开网站的时候都会发一个值过来。

所以下面的请求是错误的

 

 

-------题外话

Token

  1. 用户通过用户名和密码发送请求

  2. 程序校验

  3. 程序返回一个Token给客户端

  4. 客户端存储Token,并且每次发送请求携带Token

  5. 服务端验证Token,并返回数据

 cookie

当用户第一次访问并登录一个网站的时候,cookie的设置以及发送会经历以下4个步骤:

  1. 客户端发送一个请求到服务器;

  2. 服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部;

  3. 客户端保存cookie,之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部;

  4. 服务器返回响应数据。

session的使用方式是客户端cookie里存id,服务端session存用户数据,客户端访问服务端的时候,根据id找用户数据

而token一般翻译成令牌,一般是用于验证表明身份的数据或是别的口令数据,可以用url传参,也可以用post提交,也可以夹在http的header中

 

session_id和token的作用比较相似,但说session一般既包括客户端中的session_id,也包括服务端内存或数据库中保存的session数据,另外session一般只标识会话,用户身份的信息是间接保存在session数据中的,登录之前也有session,登出甚至换身份登录之后session_id可以保持不变,而token一般跟用户身份有一一对应关系,登出之后token就失效,再有就是token从设计上必须通过get参数或者post参数提交,一般是不允许保存在cookies当中的,容易产生csrf漏洞

 

  • cookie和session的区别:cookie存储在客户端,session存储在服务器
  • token的运作:用户使用用户名密码登录,服务端生成token,客户端每次请求都带上token,服务器再验证该token。自包含的。后端不需要记录什么东西,每次一个无状态请求,每次解密验证,每次当场得出合法 /非法的结论
  • session:一段随机字符串,需要到后端去检索 id 的有效性。万一服务器重启导致内存里的 session 没了呢?
方案 A :我发给你一张身份证,但只是一张写着身份证号码的纸片。你每次来办事,我去后台查一下你的 id 是不是有效。
方案 B :我发给你一张加密的身份证,以后你只要出示这张卡片,我就知道你一定是自己人。
就这么个差别。
 

2.改写,加入参数关联,比较重要

-------------------------------------------

# 导包
import requests
import re
#第一个接口地址
url2 = "http://192.168.103.106:1080/webtours/nav.pl?in=home"
s = requests.session()# 为了保持和下一个接口建立相同的连接通道
res = s.get(url2)#拿s这个变量去发送上一个接口地址
# print(res.text)#得到响应文本内容
usersession = re.findall(r'name=userSession value=(.+?)>',res.text)#要在上一个文本内容里去匹配这条数据把数据取出来。这里通过re.findall正则的方式去匹配,匹配成功后将.+?放到usersession这个变量中,这个变量是个列表
print(usersession)
# para2 ={"in":"home"}
# 第二个接口地址 登录接口
url ="http://192.168.103.106:1080/webtours/login.pl"
para ={"userSession":usersession[0],"username":"jojo","password":"bean","login.x":"54","login.y":"11","login":"Login","JSFormSubmit":"off"}#从上一个接口的响应数据中取出,放在这里,取第一个【0】,其他数据不变
r = s.post(url,data=para)
# 发送post请求
# r = requests.post(url,data=para)#拿一个变量接受响应结果,打印出来
print(r.text)
----------------------------------

 

二。本地访问幼儿园服务器接口测试:(没有session)

 

1.需求:本机电脑访问https://children.avatarmind.com/avatar/login输入用户名密码登录接口测试

 

2.抓包:

 

(如果要抓取手机端APP访问服务器的包需要笔记本设置代理,并且和手机在一个网段,在笔记本上安装抓包工具获取接口数据)

 

安装fiddler,后进行过滤,垃圾信息太多,只需要指定服务器的数据,设置如下:

 

 

 

 

 3.开始调试代码

(1)第一次我编写代码后python执行后报错SSL:

 

 

requests.exceptions.SSLError: HTTPSConnectionPool(host='children.avatarmind.com', port=443): Max retries exceeded with url: /avatar/login (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)'),))

 

 

 

 

----解决方法:

【解决方案】

有些网页,一开始用脚本语言(python)去访问的时候会遇到这样问题。
一般这样的网站用浏览器去访问的时候,会弹出这样的警告“您的链接不是私密链接”。

简单解释

这里是由于这个网页的证书没有被官方CA机构信任,所以这里会出现证书验证的错误。
这样的url典型有https://www.12306.cn

如下使用代码的时候,就会出现这样的问题。

import requests
r = requests.get('https://www.12306.cn')
print(r.status_code)
所以最终改成:

-----------------------------------------

import requests
import logging
logging.captureWarnings(True)
url = "https://children.avatarmind.com/avatar/login" #先查看fiddler中webforms中有参数值的,找到对应的请求后,然后点击左侧的列表右击“copy”“just url”
para = {"username":"115","password":"123456","verifyCode":"9683"}
r = requests.post(url,data=para,verify=False)
print(r)
-----------------------------------------


 

posted on 2020-06-17 17:31  宝宝萌  阅读(493)  评论(0编辑  收藏  举报