如何使用requests库发送http请求

2023-09-22 14:14:15

一、requests库

​什么是Requests ?Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库。它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜HTTP测试需求。

​ 安装:cmd命令行执行pip install requests

二、HTTP 请求方法

HTTP 协议 (Hyper Text Transfer Protocol),一个基于TCP/IP通信协议来传递数据,包括html文件、图像、结果等,即是一个客户端和服务器端请求和应答的标准。根据HTTP 标准,HTTP 请求可以使用多种请求方法。

  • HTTP 0.9:只有基本的文本GET请求,没有固定的版本号,不支持请求头。
  • HTTP 1.0:完善的请求/响应模型,并将协议补充完整,定义了三种请求方法:GET,POST和HEAD方法。
  • HTTP 1.1:在1.0的基础上进行更新,新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。
  • HTTP 2.0(未普及):请求/响应首部的定义基本没有改变,只是所有首部键必须全部小写,而且请求行要独立为:method、:scheme、:host、:path这些键值对。

​ HTTP请求常用的Get和Post两种方法:

  • GET是从服务器上获取数据,POST是向服务器传送数据
  • GET请求参数都显示在浏览器网址上,HTTP服务器根据该请求所包含URL中的参数来产生响应内容,也就是说GET请求的参数是URL的一部分。比如百度requests模块:http://www.baidu.com/s?wd=requests模块
  • POST请求参数是在请求体当中,消息长度没有限制且以隐式的方式进行传送,通常用来向HTTP服务器提交量比较大的数据(比如请求中包含许多参数或者文件上传操作等),请求的参数包含在“Content-Type”消息头里,指明该消息体的媒体类型和编码

三、发送GET请求

​ 关键代码:requests.get(url)

​ 参数说明:若需要传请求参数,可直接在 url 后面添加,也可以在调用get()方法时通过关键字params传入,需要注意的是params需要传入dict(字典)类型。

 下面以请求百度为例,发送get请求:

import requests

# 通过url直接加上请求参数,与通过params传参效果是一样的
response = requests.get(url='http://www.baidu.com/s?wd=requests模块')
# 通过params传参
response2 = requests.get(url='http://www.baidu.com/s', params={"wd": "requests模块"})
print(response.status_code)		# 打印状态码
# print(response.text)		# 获取响应内容

​ 运行结果:

C:\software\python\python.exe D:/learn/test.py
200

Process finished with exit code 0

四、发送POST请求

​ 关键代码:requests.post(url, data)

​ 参数说明:可传dict类型也可传json类型,dict类型使用关键字data传参,json类型则为使用关键字json传参。若无需传参可不传。

register_url = "http://127.0.0.1:666/index/register"

# 添加请求头,需要就传
header = {
    "Content-Type": "application/json"
}

# json类型的参数
json = {
    "mobile_phone": "15612345678",
    "pwd": "Test1234",
    "type": 0
}
# 发送post请求
response = requests.post(url=register_url, json=json, headers=header)
print(response.json())

# 打印结果:{'code': 200, 'msg': 'success', 'password': '321', 'username': '123'}

​ 上面举例为json类型的传参,json和dict类型的数据结构表面上看有点相似,那怎么判断什么时候用json什么时候用dict呢?只要查看请求头,需要哪种就传哪种,表单类型的参数,即"Content-Type: application/x-www-form-urlencoded"就使用关键字data去传dcit类型的参数,像上面举例的"Content-Type": "application/json"json类型的参数一定要使用关键字json去传递。

五、获取响应数据

​ 常见的属性:

  • response.status_code:获取响应状态码
  • response.cookies:获取cookies
  • response.headers:获取头部信息
  • response.url:获取url
  • response.text:自动识别文本中的编码格式进行解码,但有时候不准确,会出现乱码
  • response.content.decode('utf-8'):response.content,获取字节流的数据,进行decode解码,默认是utf8
  • response.json():json方法可以将json字符串转换成对应的python类型的数据,接口返回的数据99%都是json类型的
import requests

response = requests.get(url='http://www.baidu.com/s?wd=requests模块')
# response = requests.get(url='http://www.baidu.com/s', params={"wd": "requests模块"})

print("这是status_code:{}\n".format(response.status_code))

print("这是cookies:.{}\n".format(response.cookies))

print("这是headers:.{}\n".format(response.headers))

print("这是url:.{}\n".format(response.url))

# print("这是响应页面文本信息:.{}\n".format(response.text))   # 因为返回数据太长,不作运行
# print("这是获取的字节流数据decode解码:.{}\n".format(response.content.decode()))

​ 运行结果:

C:\software\python\python.exe D:/learn/test.py
这是status_code:200

这是cookies:.<RequestsCookieJar[<Cookie BAIDUID=6EC84DD4DE623D1500B3D0E771D1D3FA:FG=1 for .baidu.com/>, <Cookie BIDUPSID=6EC84DD4DE623D15C087081CA8B7A6D9 for .baidu.com/>, <Cookie H_PS_PSSID=32292_1441_32355_32328_31253_32348_32046_32394_32429_32115_32437 for .baidu.com/>, <Cookie PSINO=6 for .baidu.com/>, <Cookie PSTM=1596554477 for .baidu.com/>, <Cookie delPer=0 for .baidu.com/>, <Cookie BDSVRTM=11 for www.baidu.com/>, <Cookie BD_CK_SAM=1 for www.baidu.com/>]>

这是headers:.{'Bdpagetype': '3', 'Bdqid': '0xf2cd9ccf00070e08', 'Cache-Control': 'private', 'Ckpacknum': '2', 'Ckrndstr': 'f00070e08', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html;charset=utf-8', 'Date': 'Tue, 04 Aug 2020 15:21:17 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM ", CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=6EC84DD4DE623D15C087081CA8B7A6D9:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, BIDUPSID=6EC84DD4DE623D15C087081CA8B7A6D9; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, PSTM=1596554477; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, BAIDUID=6EC84DD4DE623D1500B3D0E771D1D3FA:FG=1; max-age=31536000; expires=Wed, 04-Aug-21 15:21:17 GMT; domain=.baidu.com; path=/; version=1; comment=bd, delPer=0; path=/; domain=.baidu.com, BD_CK_SAM=1;path=/, PSINO=6; domain=.baidu.com; path=/, BDSVRTM=11; path=/, H_PS_PSSID=32292_1441_32355_32328_31253_32348_32046_32394_32429_32115_32437; path=/; domain=.baidu.com', 'Traceid': '1596554477018818305017495812540276870664', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked'}

这是url:.http://www.baidu.com/s?wd=requests%E6%A8%A1%E5%9D%97


Process finished with exit code 0

六、高级操作

​ 在上面我们基本了解了requests库的基本用法,如GET、POST请求以及response的属性,接下来我们再看下requests库的一些高级用法,如下载/上传文件、Cookies设置、代理设置等。

6.1文件下载

​ 与发送请求区别无二,只是保存时需要处理一下,如下载图片,把获取图片的二进制数据然后用二进制写入文件即可。

import requests
 
response = requests.get('https://github.com/favicon.ico')
 
# 获取二进制数据,然后写入文件
with open('favicon.ico','wb')as f:
    f.write(response.content)
    f.close

6.2文件上传

​ 关键代码:requests.post(utl, files=files)

import requests
 
file = {'file':open('favicon.ico','rb')}	# 将之前抓取的github图标以二进制格式读取

response = requests.post('http://httpbin.org/post', files = file)

print(response.text)

6.3SSL证书验证

​ 为什么会有SSL证书验证,SSL是什么?

​ SSL协议是网络层和传输层的协议。SSL(Secure Sockets Layer 安全套接层)协议,及其继任者TLS(Transport Layer Security传输层安全)协议,是为网络通信提供安全及数据完整性的一种安全协议。

​ HTTPS是兼容HTTP的,可以把HTTPS理解为'HTTP over TSL',即HTTPS是HTTP协议和TSL协议的组合。HTTPS在传输数据时,同样会先建立TCP连接,建立起TCP连接后,会建立TSL连接。请求可以为

 

HTTPS请求验证SSL证书,就像我们使用的浏览器一样,SSL验证默认是开启的,如果证书验证失败,请求会抛出一个SSLError,如下图:

​ 碰到请求SSL验证的,我们是可以直接跳过不验证的,通过设置verify=False就可关闭错误提示,跳过SSL验证,这里只是忽略了SSL验证,并不是没有了SSL验证,它仍然会存在一个警告信息InsecureRequestWarning。

import requests
#通过一下两行代码即可把警报消除,即使verify=False,报警还是存在的
from requests.packages import urllib3
 
urllib3.disable_warnings()
 
response = requests.get('https://www.12306.cn',verify = False)
print(response.status_code)

6.4保持会话

​ 在requests中,如果直接使用get()或post()等方法是可以做到模拟网页的接口请求,但是每次发起请求结束后它就结束了,并不会保存相关的验证信息,如cookies/token;比如第一次使用post()请求登录了某个网站,第二次想获取成功登录后的用户个人信息,再一次发起post()请求时它会要求你需求先登录,明明第一次请求时已经登录了,为什么第二次还提示要先登录呢?实际上两次请求相当于使用了两个浏览器去访问,是两个完全不相关的会话,因此第二次请求是拿不到用户信息的。

​ requests中的session对象能够让我们跨http请求保持某些参数,即让同一个session对象发送的请求头携带某个指定的参数。当然,最常见的应用是它可以让cookie保持在后续的一串请求中。

# 创建一个session对象,使它能够自动记录上一次请求中的cookie信息
se = requests.session()

# 登录接口
login_url = "http://www.test.com/api/member/login"
login_data = {
    "mobilephone": "15612355678",
    "pwd": "Test1234"
}
res = se.post(url=login_url, data=login_data)

# 登录后查询用户最近的订单记录
order_record_url = "http://www.test.com/api/member/order"
record_data = {
    "beginTime": "2022-07-01",
    "endTime": "2022-07-10"
}
res2 = se.post(url=order_record_url, data=record_data)
print(res2.json())

6.5requests封装

​ 凡是需要重复使用的,我们都可以对它进行二次封装,写成我们自己的版本,还可以在封装过程中加入我们想要的内容,使用的时候直接调用即可。

import requests


class SendSessionRequest:
    """使用session鉴权的接口,记录cookies/token"""

    def __init__(self):
        self.session = requests.session()

    def requests(self, url, method, params=None, data=None, json=None, headers=None):
        method = method.lower()
        if method == "post":
            return self.session.post(url=url, json=json, data=data, headers=headers)
        elif method == "patch":
            return self.session.patch(url=url, json=json, data=data, headers=headers)
        elif method == "get":
            return self.session.get(url=url, params=params)

最后:下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!【100%无套路免费领取】

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

  全套资料获取方式:点击下方小卡片自行领取即可

更多推荐

Vue3:组件的生命周期函数

这一篇博客是结合官网完档和书籍后整理的,会很简单,可能对很对朋友都没有任何的帮助,这只是我对自己的学习vue这个技术栈的笔记。onMounted注册一个会调用函数,在组件挂载完成后执行。那么vue组件在什么情况下,算是已经挂载了呢?所有同步的子组件都已经被挂载;自身的DOM树已经创建完成并且插入父容器中。这个时候,组件

Python 数据可视化:Seaborn 库的使用

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。🍎个人主页:小嗷犬的个人主页🍊个人网站:小嗷犬的技术小站🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。本文目录Seaborn简介Seaborn安装Seaborn使用Seaborn样例数据集Seaborn样式设置Seab

遥感数据与作物模型同化技术应用

基于过程的作物生长模拟模型DSSAT是现代农业系统研究的有力工具,可以定量描述作物生长发育和产量形成过程及其与气候因子、土壤环境、品种类型和技术措施之间的关系,为不同条件下作物生长发育及产量预测、栽培管理、环境评价以及未来气候变化评估等提供了定量化工具。但是,当作物生长模型从单点研究发展到区域尺度应用时,由于空间尺度增

C++核心编程——P36-友元

友元客厅就是Public,你的卧室就是Private客厅所有人都可以进去,但是你的卧室只有和你亲密的人可以进。在程序中,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元技术。友元的目的就是让一个函数或者类访问另一个类中的私有元素。友元的关键字——friend友元的三种实现全局函数做友元类做友元成员函数

进入docker容器内部使用命令行工具

进入Docker容器内部后,你可以使用以下命令行工具和方式来进行交互和操作容器内部的环境:bash/shell:大多数基于Linux的Docker容器提供了bash或shell作为默认的命令行工具。可以使用以下命令进入容器的shell环境:dockerexec-it<container_name_or_id>bash或

Mybatis&MybatisPlus 操作 jsonb 格式数据

最近有用到postgresql,里面的一个特色数据类型便是jsonb,和json差不多,但是查询比较快,关于概念,这里就提一句,不赘述。我们先来看下用mybatisplus,首先是查询数据。依赖:<dependency><groupId>com.baomidou</groupId><artifactId>mybatis

java版Spring Cloud+Mybatis+Oauth2+分布式+微服务+实现工程管理系统

鸿鹄工程项目管理系统SpringCloud+SpringBoot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统1.项目背景一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管理的提升提出了更高的要求。二、企业通过

Spring Boot + Vue3前后端分离实战wiki知识库系统<十三>--单点登录开发二

接着https://www.cnblogs.com/webor2006/p/17608839.html继续往下。登录功能开发:接下来则来开发用户的登录功能,先准备后端的接口。后端增加登录接口:1、UserLoginReq:先来准备用户登录的请求实体:packagecom.cexo.wiki.req;importjava

新一代爬虫工具 katana 配置及使用

新一代爬虫工具katana配置及使用。功能:快速且完全可配置的网络爬行标准和无外设模式支持JavaScript解析/爬网可定制的自动表单填写范围控制-预配置字段/正则表达式可自定义的输出-预配置字段输入-标准输入、URL和列表输出-标准输出、文件和JSON0x01工具安装Katana需要Go1.18才能成功安装。要安装

21天学会C++:Day14----模板

·CSDN的uu们,大家好。这里是C++入门的第十四讲。·座右铭:前路坎坷,披荆斩棘,扶摇直上。·博客主页:@姬如祎·收录专栏:C++专题目录1.知识引入2.模板的使用2.1函数模板2.2类模板3.模板声明和定义分离3.1同一文件中的声明与定义分离3.2分文件的声明与定义分离4.非类型模板参数5.模版的特化5.1模板的

服务器租用多少钱一年?

租用服务器的费用是企业非常关心的问题,一般来说这个价格是由多种因素决定的,包括服务器商、服务器自身的配置、带宽、地域、服务时长等都有关系,大概在几百、几千到几万元不等,今天就来讲一讲这些影响服务器租用价格的因素吧!正规的服务器供应商,这个每个供应商根据成本的不同价格会有所差异但是变化不会很大,因为机房以及技术人员员工的

热文推荐