ICode9

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

用Python做接口测试(一)request相关知识

2022-01-19 23:03:56  阅读:237  来源: 互联网

标签:Python 22% request 接口 url json api print requests


1、什么是requests

1.1requests请求介绍

requests代表是请求,在python当中是一个库   让HTTP服务人类 

1.2requests库的安装

pip3 inshtall requests

1.3用Python代码处理get请求

import requests

api=requests.get(
 url='http://**.**.***.***:*****/login/auth/',
 params={"name":"jiachao"})
#协议状态码
print('协议状态码:',api.status_code) #获取请求地址
print(api.url) #响应数据
print('返回字符串:',api.text)
print('返回⼆进制的内容:',api.content)
print('返回的是字典数据类型:',api.json())
#响应头
print('响应头:',api.headers)

在这里面我们需要注意的是,响应数据一般是使用api.text,如果响应数据是JSON格式的 那么使用api.json()

1.4查询电话号码实战

api=requests.get(
 url='http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo',
 params={"mobileCode":"1**********","userID":""})
print(api.url)
print(api.status_code)
print(api.text)
print(api.headers)

需要注意的是 在进行get请求的时候   如果请求数据要填写我的话   我们需要在括号内输入params并且填写字典格式(key&value)

1.5用python代码处理JSON数据格式

import json
import requests
api=requests.post(
 url='http://**.**.***.***:****/login/auth/',
 json={"username":"1**********","password":"a*****8"},
 headers={"content-type":"application/json"})
print(json.dumps(api.json(),indent=True,ensure_ascii=False))

在输出结果的时候 这里面我们对代码进行解析

参数介绍

json.dumps是进行序列化

api.json为以json的方式写入

indent=true  是进行初始化

ensure_ascii=False  是不用阿斯克码编码  (用来处理中文乱码)

1.5.1data和json的区别

什么时候使用json?

当请求参数JSON的时候使用json的参数

当请求参数是json,但是要使用data的参数,那么请求参数要进行序列化的处理

什么时候使用data?

当请求参数是表单的时候使用data

当请求参数是json格式的时候,那么请求参数要进行序列化的处理

1.6用python代码处理表单数据格式

api=requests.post(
 url='http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo',
 data={"mobileCode":"1**********","userID":""},
 headers={"content-type":"application/x-www-form-urlencoded"})
print(api.text)

处理表单格式和处理json请求不同的点就是在我们写conetnt-type的时候  要写入表单数据类型即可

1.7关于复杂表单格式的实战解析

api=requests.post(
 url='https://www.lagou.com/jobs/v2/positionAjax.json',
 data= {"data":"7Xx8%2BncjEMSVaVAgnRvUNTUE96%2BZQ2vPzFNSpQ88YRMH6wPSJ8i6Cprv9zK8LdkaMCryRC4KsX
IeYziVgSmqOpzWRJLTICaDRADfVKega8j0HtL4PbSKAbU2Bu%2BELgYZ9P0eVN9ha0eAJYfBfoMUbuAmQzuFErA
7fLqd2E56hwfw5%2BNRba2bvdD0Dh3cTl%2FIM4NkMRF%2FGcXEvDJWAVWGYKUh%2FSEpM0WJNhhSM0dXB6%2BR
51Ln0ngfo2LEYJKwjMJh"},
 headers={
 "content-type":"application/x-www-form-urlencoded; charset=UTF-8",
 "user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
 "cookie":"根据network获取",
 "referer":"根据network获取"})
print(api.status_code)
print(json.dumps(api.json(),indent=True,ensure_ascii=False))

以上个人已编写好的代码

1.7.1代码解析

本次测试案例为拉勾网 

在上述代码中 我们可以看到  相比于以往的表单格式 比较复杂 其实总结起来无非是几点

1、url地址:

2、请求数据 :  因为这次我们这次通过network 获取到了请求数据  直接复制粘贴就可以

3、请求头 :在唱过的操作中 其实用到的请求头  在业界最常用的 必须要带的四个请求头分别为 conetnt-type ,user-agent ,cookie,referer   依次进行添加即可

然后我们输出该请求url的协议状态码 和响应数据

1.8用python处理动态参数

因为我们在处理session的请求的时候 会存在动态参数

设想一个场景,我们输入用户名和密码提供给服务端,此时服务端回返回给我们一个随机的sessionID   那么应该按照如下方式处理

def login():
 api=requests.post(
 url='http://**.**.***.***:****/login/auth/',
 json={"username":"13********","password":"*****8"},
 headers={"content-type":"application/json"})
 return api.json()['token']
def index():
 api=requests.get(
 url='http://47.95.142.233:8000/interface/index',
 headers={"Authorization":"JWT {token}".format(token=login())})
 print(api.text)
 assert api.json()['count']['api']==4

1.8.1代码解析

1、我们定义两个函数  分别为login 和index  其中login为登录的网页  index为登录成功后返回的网页

2、在我们输入相应的用户名和密码  通过return.api.json["token"]来将token返回给login函数 以被调用

3、在我们写index的函数时候  在请求头需要写入 "Authorization":"JWT {token}".format(token=login())来进行调用全局变量token的值  才能获得 登录成功后返回的响应数据

.4、在结尾我们根据python源生的断言 assert r.json()["count"]["api"]==4来验证返回的数据是否正确  如正确  则可以证明我们获得了返回的响应数据  

1.9用python代码来处理cookie请求

在请求头里面需要带上服务端的响应头中来返回的set-cookie的值 用到的关键词为cookies

1.9.1实战案例代码

import requests

def login():
    api=requests.post(url="https://home.51cto.com/index?reback=https%3A%2F%2Fedu.51cto.com%2Fcenter%2Fuser%2Findex%2Flogin-success%3Fsign%3D0b8cAQcICQgAUwNSB1cKAwIKXFJUV1UAC1NTAlBcQRVIFwseGF1dTR5WAgFDXRxSDF8XV1IPFwNBHVRfEUZGBBcRQlRFF15dRE5AFkJWSxwAXU1GRARTBAtR%26client%3Dweb&iframe=0&is_go_to_user_set_mobile=1",
                      data={"_csrf":"b0tpNzY0NVIeAyNZG05dZCooP297eEMUBihcTw59QgUkezpPBV9GNQ==",
                            "LoginForm[username]":"1******",
                            "LoginForm[password]":"a******",
                            "show_qr":"0"},
                      headers={"content-Type":"application/x-www-form-urlencoded",
                               "cookie":"acw_tc=2760826216425816925208847e7858ddd405cdc867fa071cec17c576a4cb7a; PHPSESSID=1tm0ep6qmvavbtvc02edps63u3; _csrf=8bd4e0bb9d580c84ad72c0878787c487e915a6afdf434b9ab2121637ac6f6025a%3A2%3A%7Bi%3A0%3Bs%3A5%3A%22_csrf%22%3Bi%3A1%3Bs%3A32%3A%22qHJn-zh6EcVXMLvFic5x8IwWK0Sx3ksg%22%3B%7D; _uab_collina=164258160896132940103325; _ourplusFirstTime=122-1-19-16-40-8; _ourplusReturnCount=1; _ourplusReturnTime=122-1-19-16-40-8; www51cto=C9BA92B0E626A5F0007CD254829BC978aiYz; sajssdk_2015_cross_new_user=1; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2217e717e4aec9-03a8b5f43617fb-f791b31-1440000-17e717e4aed998%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%2217e717e4aec9-03a8b5f43617fb-f791b31-1440000-17e717e4aed998%22%7D; login_from=edu.51cto.com; reg_from=edu.51cto.com; Hm_lvt_844390da7774b6a92b34d40f8e16f5ac=1642581609; Hm_lpvt_844390da7774b6a92b34d40f8e16f5ac=1642581609",
                               "referer":"https://home.51cto.com/index?reback=https%3A%2F%2Fedu.51cto.com%2Fcenter%2Fuser%2Findex%2Flogin-success%3Fsign%3D0b8cAQcICQgAUwNSB1cKAwIKXFJUV1UAC1NTAlBcQRVIFwseGF1dTR5WAgFDXRxSDF8XV1IPFwNBHVRfEUZGBBcRQlRFF15dRE5AFkJWSxwAXU1GRARTBAtR%26client%3Dweb&iframe=0&is_go_to_user_set_mobile=1",
                               "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
                               "accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"})
    print(api.text)
    print(api.status_code)
    print(api.cookies)
    return api.cookies

def profile():
    api=requests.get(url="https://edu.51cto.com/center/user/info/get-user-info",
                     cookies=login())
    print(api.status_code)
    print(api.text)

profile()

因代码比较繁琐  所以如下图所示来展示逻辑关系

 

 1.10Python处理接口测试的timeout参数含义

因为有的时候服务器响应数据很慢,有时候很快,所以这个时候需要添加timeout

还有一种就是网络请求出现requests.exceptions.ConnectTimeout的错误时候,就可以添加timeout了

1.10.1代码详情演示

import requests
from requests.auth import HTTPBasicAuth


api=requests.get(url="http://***.***.***.*/v1/api/books",
                 auth=HTTPBasicAuth(username="ad***n",password="a****n"),
                 timeout=180)
print(api.status_code)
print(json.dumps(api.json(),indent=True,ensure_ascii=False))

其实timeout对于我们之前学的UI自动化测试来说  可以和隐形等待来画===

即为限制等待的最大时长,如果超过这个时间(秒)还没有获取到响应数据  则弹出timeout进行报错

 1.11Python处理接口测试的auth参数含义

当如果我们进行测试的时候  提示协议状态码为403 这个时候 就是证明的有权限但是禁止访问,可以理解成我们需要用户名和密码登录成功后才能进行访问

这个时候就要用到requests库里面的 HTTPBasicAuth方法了

具体使用方法如下

import requests
from requests.auth import HTTPBasicAuth
api=requests.get(
 url='http://1**.**.***.***:****/v1/api/books',
 auth=HTTPBasicAuth(username="admin",password='admin'))
print(api.status_code)
print(api.json())

我们通过auth参数 来进行定义用户名和密码 使得可以获得权限来进行访问内容

1.12Pyhon处理接口测试的verify参数含义

在现实的工作场景

当我们的代码没有任何问题,但是请求就是返回ssl以及403的问题,那么久意味着需要设置verify的参数    

如返回错误:requests.exceptions.SSLError  这个时候我们就需要带上verify参数

具体使用方法如下

api=requests.get(
 url='https://***.**.***.***:****/v1/api/books',
 auth=HTTPBasicAuth(username="admin",password='admin'),
 timeout=180,verify=False)
print(api.status_code)
print(api.json())

我们需要在添加参数verify=False即可

标签:Python,22%,request,接口,url,json,api,print,requests
来源: https://www.cnblogs.com/jiachao/p/15824542.html

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

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

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

ICode9版权所有