尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

requests库详解

requests库详解 一、接口文档https://api.apiopen.top/swagger/index.html#/http://httpbin.org/二、接口测试和接口自动化测试场景目前主流的接口测试工具( 中小型公司、项目 )PostmanNewmanGitJenkinsJmeterAntGitJenkins目前主流的接口自动化测试技术( 大型的公司、项目)pythonrequestspytestallurejenkins三、requests库简介requests是用来发送http请求以及接收http响应的python第三方库主要用于接口自动化测试#安装pip install requests四、requests库常用的方法1.requests.get()获取HTML网页的主要方法对应HTTP的GET语法get(url, paramsNone, **kwargs) #url是接口地址params用于传参2.requests.post()向HTML网页提交POST请求的对应HTTP的POST语法post(url, dataNone, jsonNone, filesNone **kwargs) #url是接口地址data用于传参json也用于传参,files用于上传文件data和json传参选哪个主要是通过请求头中的Content-Type来区分Content-Type作用是服务器要求传入的报文的内容类型四大要素请求方式(method)请求路径(url)请求头(headers)请求正文(params、data、json)2.1.在postman中四种传参方式对应的Content-Type的值如下form-data对应的Content-Type : multipart/form-data; boundarycalculated when request is sent #文件上传 x-www-from-urlencoded对应的Content-Type : application/x-www-form-urlencoded #表单提交 raw分为以下几种 text对应的Content-Type : text./plain javscript对应的Content-Type : application/javascript json对应的Content-Type : application/json html对应的Content-Type : text/html xml对应的Content-Type : application/xml binary对应的Content-Type : application/binaryPostman官网下载地址 https://www.postman.com/downloads/MAC版本 https://dl.pstmn.io/download/latest/osxwindows 64版本 https://dl.pstmn.io/download/latest/win64windows X86版本 https://dl.pstmn.io/download/latest/win32linux版本 https://dl.pstmn.io/download/latest/linux642.2.在requests中data和json传参跟Content-Type的关系如下#data 服务器要求Content-Type:application/x-www-form-urlencoded则需要data传参:报文是dict类型 服务器要求Content-Type:text./plain则需要data传参:报文是str类型 #json 服务器要求Content-Type:application/json则需要json传参:报文可以是dict类型 #files 服务器要求Content-Type:multipart/form-data则需要files传参#可以用看接口文档或者用Fidder抓包看Content-Type是什么决定用data还是json因此:data可以传纯键值对的dict(非嵌套的dict)也可以传str格式如果是嵌套字典那么就需要使用ison.dumps()把嵌套字典转化成ison字符串传参json可以传任何形式的dict( 包括嵌的dict)#json.loads() 把json字符串转化成dict格式#json.dumps() 把dict格式转化成ison字符串3.requests.head()获取HTML网页头信息的方法对应HTTP的HEAD4.requests.put()向HTML网页提交局部修改请求对应HTTP的PUT5.requests.patch()向HTML网页提交局部修改请求对应HTTP的PATCH6.requests.delete()向HTML网页提交删除请求对应HTTP的DELETE7.requests.request()可以发送所有类型的请求getpostputdelete追朔本源不管是getpostput还是delete都是调用的requests.request方法而requests.reques方法调的是session.request方法语法request(method, url, **kwargs) #参数说明 method 请求方式 url 请求路径 paramsNone get方式传参 dataNone post方式传参 jsonNone post方式传参 headersNone 请求头 cookiesNone 请求cookie filesNone 文件上传五、requests模块response返回对象res.json() 获得返回的字典格式的数据res.text 获得返回的字符串格式的数据res.content 获得返回的bytes字节类型的数据res.status_code 返回状态码res.reason 返回状态信息res.cookies 返回cookie信息res.headers 返回响应头res.request.xxx 返回请求的数据如:请求头请求参数等六、response返回对象状态码1xx100-101信息提示2xx200-206成功类信息3xx300-305重定向类即跳转301是永久跳转302是临时跳转4xx400-415错误类信息客户端错误如请求一个不存在的资源就是客户端的错误5xx500-505错误信息服务端错误#常用的状态码200成功请求的所有数据通过响应报文entity-body部分发送ok301请求的URL指向的资源已经被删除但在响应报文中通过首部location指明了资源现在所处的新位置永久重定向Moved Permanently302与301相似但在响应报文中通过location指明资源现在所处的临时新位置临时重定向Found304客户端发出了条件式请求但服务器上的资源未曾发生改变则通过响应此响应状态码通知客户端Not Modified401需要输入账号和密码认证方能访问资源Unauthorized403请求被禁止Forbidden404服务器无法找到客户端请求的资源Not Found500服务器内部错误Internal Server Error502代理服务器从后端服务器收到了一条伪响应Bad Gateway七、代码实战import requests class TestRequest(): access_token #全局变量类变量通过类名调用 # 获取token def test_post(self): urlhttps://api.apiopen.top/api/login headers{ accept: application/json, Content-Type: application/json } body{ account: 1195528321qq.com, password: 000000 } resrequests.request(methodpost,urlurl,headersheaders,jsonbody) print(res.json()[result][token]) TestRequest.access_tokenres.json()[result][token] #将获取的token的值赋给全局变量access_token # 查看用户信息 def test_get(self): urlhttps://api.apiopen.top/api/getUserInfo headers{ accept: application/json, token:TestRequest.access_token #这里调用test_post方法写入到全局变量access_token中的token值 } resrequests.request(methodget,urlurl,headersheaders) print(res.json()) # 文件上传 def test_file(self): urlhttp://httpbin.org/post headers{ accept: application/json, Content-Type: multipart/form-data } files { file: open(C:\\Users\lasou\Desktop\\11.jpg, rb) #rb转换为只读的二进制流 } resrequests.request(methodpost,urlurl,headersheaders,filesfiles) print(res.status_code) if __name____main__: pTestRequest() p.test_post() p.test_get() p.test_file()执行结果eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjg5NCwiaWQiOjg5NCwiY3JlYXRlZEF0IjoiMjAyMy0wOC0wMyAwMToxMTowOSIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMDMgMDE6MTE6MDkiLCJkZWxldGVkQXQiOm51bGwsImFjY291bnQiOiIxMTk1NTI4MzIxQHFxLmNvbSIsImxldmVsIjowLCJleHAiOjE2OTc3MTc1OTEsImlzcyI6ImFwaV9vcGVuIiwibmJmIjoxNjk3MTExNzkxfQ.rjtQE090nQnlq1hUE3QUbgEwJd3PZGSPBCzaAZoP85o {code: 200, message: 成功!, result: {updatedAt: 2023-09-25 20:49:44, name: vorn, head_url: , blurb: , birthday: 2014-01-18}} 200八、cookie问题问题描述问题分析如果请求方式(method)请求路径(url)请求头(headers)请求正文(params、data、json)检查后都没有问题可以认为这个请求是需要有cookie还有一种方法可以看是否需要cookie即从浏览器打开看是否需要cookie问题解决-方案一提取cookie到全局变量然后将全局变量中的cookie赋值给其他函数1定义cookie全局变量2提取cookie到全局变量3将cookie传给有需要的接口中4执行结果问题解决-方案二较为常用使用session建立一个会话将所有接口都当成一个会话中的几个部分在同一个会话中这几个接口使用的就会是同一个cookie演示代码import requests class TestRequest(): access_token #全局变量类变量通过类名调用 sessrequests.session() #定义全局变量sessrequests.session(),将所有的requests都替换为requests.session()就相当于都在一个会话中了 # 获取token def test_post(self): urlhttps://api.apiopen.top/api/login headers{ accept: application/json, Content-Type: application/json } body{ account: 1195528321qq.com, password: 000000 } resTestRequest.sess.request(methodpost,urlurl,headersheaders,jsonbody) #将所有的requests都替换为requests.session()就相当于都在一个会话中了 print(res.json()[result][token]) TestRequest.access_tokenres.json()[result][token] #将获取的token的值赋给全局变量access_token # 查看用户信息 def test_get(self): urlhttps://api.apiopen.top/api/getUserInfo headers{ accept: application/json, token:TestRequest.access_token #这里调用test_post方法写入到全局变量access_token中的token值 } resTestRequest.sess.request(methodget,urlurl,headersheaders) #将所有的requests都替换为requests.session()就相当于都在一个会话中了 print(res.json()) # 文件上传 def test_file(self): urlhttp://httpbin.org/post headers{ accept: application/json, Content-Type: multipart/form-data } files { file: open(C:\\Users\lasou\Desktop\\11.jpg, rb) #rb转换为只读的二进制流 } resTestRequest.sess.request(methodpost,urlurl,headersheaders,filesfiles) #将所有的requests都替换为requests.session()就相当于都在一个会话中了 print(res.status_code) if __name____main__: pTestRequest() p.test_post() p.test_get() p.test_file()执行结果eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjg5NCwiaWQiOjg5NCwiY3JlYXRlZEF0IjoiMjAyMy0wOC0wMyAwMToxMTowOSIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMDMgMDE6MTE6MDkiLCJkZWxldGVkQXQiOm51bGwsImFjY291bnQiOiIxMTk1NTI4MzIxQHFxLmNvbSIsImxldmVsIjowLCJleHAiOjE2OTc3MTg0OTEsImlzcyI6ImFwaV9vcGVuIiwibmJmIjoxNjk3MTEyNjkxfQ.0Wp93hzulR3x8kvKOk-ifD7yBp411pLN6HgitmGtRJU {code: 200, message: 成功!, result: {updatedAt: 2023-09-25 20:49:44, name: vorn, head_url: , blurb: , birthday: 2014-01-18}} 200九、总结1.发送get请求2.发送post请求以及post请求2中传参方式差异差异主要来自他们的请求头Content-Type相关3.文件上传怎么做4.cookie的鉴权怎么处理包括带请求头的接口怎么做(如果接口带请求头就类似请求正文那样添加即可如下图)包括接口关联怎么处理例如文章中的token关联全局变量使用
返回列表