【python】requests 库 源码解读、参数解读

文章目录

  • 一、基础知识
  • 二、Requests库详解
    • 2.1 requests 库源码简要解读
    • 2.2 参数解读
    • 2.3 处理响应
    • 2.4 错误处理

一、基础知识

以前写过2篇文章:

计算机网络基础: 【socket】从计算机网络基础到socket编程——Windows && Linux C语言 + Python实现(TCP+UDP)

http请求类型和状态码:常见网络通信协议(http、https、ws)及安全协议(SSL、TLS、XTLS)

请求方法描述
GET用于从服务器获取数据。
POST用于向服务器提交数据,通常用于创建新资源。
PUT用于向服务器更新或替换指定资源或创建新资源。
DELETE用于请求服务器删除指定资源。
HEAD与 GET 方法类似,但只请求获取响应头信息,不包括实际数据。
PATCH用于部分更新服务器上的资源。
OPTIONS用于获取服务器支持的请求方法列表,通常用于跨域请求预检。
CONNECT用于建立网络连接,通常由代理服务器使用。
TRACE用于在路径上对消息进行跟踪,通常用于诊断和调试。

状态码:200、401、404、404、500、503等是常见的。
在这里插入图片描述

  1. URI(Uniform Resource Identifier)

    • URI 是一个更广泛的概念,用于标识资源。
    • 它包括了 URL 和 URN(Uniform Resource Name)。
    • URI 可以提供资源的位置(URL)或名称(URN)。
  2. URL(Uniform Resource Locator)

    • URL 是 URI 的一个子集,专门用于标识资源的位置。
    • 它提供了资源在互联网上的具体地址,允许用户通过网络访问该资源。
    • URL 通常包括协议(如 http、https)、域名、路径和可能的查询字符串。

二、Requests库详解

Requests是一个简单易用的HTTP库,广泛用于Python中发送HTTP请求。它可以处理GET、POST、PUT、DELETE等请求,支持会话、文件上传、HTTP头设置等功能,适用于各种网络交互场景。

是常用的第三方库,python标准库是urllib

2.1 requests 库源码简要解读

通常我们会这样使用requests库:

import requestsr = requests.get(r'https://www.baidu.com')print(r.status_code)
print(r.text)

直接使用get函数来执行一个GET请求。

get()函数定义在requests库的api.py文件中,这个文件还定义了其他几个常用http请求类型的函数。

get()函数或者post()等函数,并没有直接实现功能,而是调用了request()函数,如:

def get(url, params=None, **kwargs):r"""Sends a GET request.:param url: URL for the new :class:`Request` object.:param params: (optional) Dictionary, list of tuples or bytes to sendin the query string for the :class:`Request`.:param \*\*kwargs: Optional arguments that ``request`` takes.:return: :class:`Response <Response>` object:rtype: requests.Response"""return request("get", url, params=params, **kwargs)

request()函数也没有直接完成具体功能:

def request(method, url, **kwargs):with sessions.Session() as session:return session.request(method=method, url=url, **kwargs)

api.py中的request()函数,创建了sessions.py文件中的Session()类的对象,再调用request()方法(sessions.py中Session类的方法)来完成一个http请求。

这里使用with语句,确保在使用后自动关闭。这样可以保持与服务器的连接,并在会话结束时释放资源。


即我们通常使用的requests.get()、requests.post()等都是封装后的函数,更加简洁、直观。


Session.request()的具体执行逻辑就不展开了,包括参数处理、请求的构建、连接和发送、接收响应、构建响应对象等内容,可以自己阅读sessions.py。你会发现它最终使用了urllib3(一个更高级的库,基于urllib)。

2.2 参数解读

这里就解读一下api.pyrequest()函数的参数,这些参数是各种常见http请求的可选参数。每种具体的请求get、put等,由于功能不同,可能不完全支持所有类型参数。

下表是request()函数的参数,使用封装后的函数如get()、post()的时候,就不必指定method和url,这些函数的名称就是请求的method、第一个参数就是url。

使用get()函数发送GET请求:

response = requests.get('https://blog.csdn.net/community/home-api/v1/get-business-list',params=params,cookies=cookies,headers=headers,
)

使用requst()函数发送GET请求:

response = requests.request(method='get',url='https://blog.csdn.net/community/home-api/v1/get-business-list',params=params,cookies=cookies,headers=headers,
)
参数类型描述
method字符串新的Request对象的方法:GETOPTIONSHEADPOSTPUTPATCHDELETE
url字符串新的Request对象的URL。
params可选,字典/元组/字节要发送的查询字符串,可以是字典、元组列表或字节。
data可选,字典/元组/字节/文件要发送在请求体中的数据,可以是字典、元组列表、字节或类文件对象。
json可选,Python对象要发送在请求体中的可JSON序列化的Python对象。
headers可选,字典与请求一起发送的HTTP头部字典。
cookies可选,字典或CookieJar与请求一起发送的cookie字典或CookieJar对象。
files可选,字典用于多部分编码上传的文件字典,格式为'name': file-like-objects{'name': file-tuple}
auth可选,元组启用基本/摘要/自定义HTTP认证的认证元组。
timeout可选,浮点数或元组服务器发送数据之前等待的秒数,浮点数或(connect timeout, read timeout)元组。
allow_redirects可选,布尔值启用/禁用GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD重定向,默认值为True
proxies可选,字典协议到代理URL的映射字典。
verify可选,布尔值或字符串控制是否验证服务器的TLS证书,布尔值为True,字符串为CA包的路径。默认值为True
stream可选,布尔值如果为False,则响应内容将立即下载。
cert可选,字符串或元组如果是字符串,表示ssl客户端证书文件的路径(.pem)。如果是元组,则为('cert', 'key')对。
returnResponse对象返回Response对象。
rtyperequests.Response返回类型。

常用的参数有:

  • method;
  • url;
  • headers;
  • cookies;
  • params;
  • data。

2.3 处理响应

(1)响应状态码
可以通过status_code获取响应状态码,以判断请求是否成功。

if response.status_code == 200:print('请求成功!')
else:print(f'请求失败,状态码:{response.status_code}')

(2)响应内容

响应内容可以是文本、JSON、字节等格式。

# 获取文本
text_content = response.text# 获取JSON
json_content = response.json()# 获取原始字节
binary_content = response.content

这些内容,通常还会进一步提取所需对象。

2.4 错误处理

requests库提供异常处理,可以通过捕获requests.exceptions中的异常进行处理。

try:response = requests.get('https://api.example.com/data')response.raise_for_status()  # 如果响应状态码是错误,抛出异常
except requests.exceptions.HTTPError as err:print(f'HTTP错误:{err}')
except requests.exceptions.RequestException as err:print(f'请求错误:{err}')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/430512.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序----希尔排序

void ShellSort(int* a, int n) {int gap n;while (gap > 1){// 1保证最后一个gap一定是1// gap > 1时是预排序// gap 1时是插入排序gap gap / 3 1;for (size_t i 0; i < n - gap; i){int end i;int tmp a[end gap];while (end > 0){if (tmp < a[end]){…

英伟达NVIDIA数字IC后端笔试真题(ASIC Physical Design Engineer)

今天小编给大家分享下英伟达NVIDIA近两年数字IC后端笔试真题&#xff08;ASIC Physical Design&#xff09; 请使用OR门和INV反相器来搭建下面所示F逻辑表达式的电路图。 数字IC后端设计如何从零基础快速入门&#xff1f;(内附数字IC后端学习视频&#xff09; 2024届IC秋招兆…

WEB领域是不是黄了还是没黄

进入2024年后&#xff0c;WEB领域大批老表失业&#xff0c;一片哀嚎&#xff0c;个个饿的鬼叫狼嚎&#xff0c;为啥呢&#xff0c;下面是我个人的见解和看法。 中国程序员在应用层的集中 市场需求&#xff1a;中国的互联网行业在过去几年中经历了爆炸性增长&#xff0c;尤其是…

RAG技术全面解析:Langchain4j如何实现智能问答的跨越式进化?

LLM 的知识仅限于其训练数据。如希望使 LLM 了解特定领域的知识或专有数据&#xff0c;可&#xff1a; 使用本节介绍的 RAG使用你的数据对 LLM 进行微调结合使用 RAG 和微调 1 啥是 RAG&#xff1f; RAG 是一种在将提示词发送给 LLM 之前&#xff0c;从你的数据中找到并注入…

Linux-DHCP服务器搭建

环境 服务端&#xff1a;192.168.85.136 客户端&#xff1a;192.168.85.138 1. DHCP工作原理 DHCP动态分配IP地址。 2. DHCP服务器安装 2.1前提准备 # systemctl disable --now firewalld // 关闭firewalld自启动 # setenforce 0 # vim /etc/selinux/config SELINU…

828华为云征文|华为云Flexus云服务器X实例 基于CentOS系统镜像快速部署Laravel开源论坛

最近公司可热闹了&#xff01;大家都在为搭建博客论坛系统忙得不可开交&#xff0c;尤其是在选服务器这件事儿上&#xff0c;那叫一个纠结。 同事 A 说&#xff1a;“咱得选个厉害的服务器&#xff0c;不然这论坛以后卡得跟蜗牛爬似的可咋办&#xff1f;” 同事 B 回应道&#…

【AcWing】【C++】模板之区间和与区间合并

最近在对程序设计算法进行复习&#xff0c;终于复习完了AcWing基础算法课的第一章&#xff0c;在此对第一章最后两个模板区间和与区间合并进行记录与分享。 区间和 题目描述与输入输出样例 题目来自于AcWing 802. 区间和。 思路 从题目描述来说&#xff0c;第一眼看来这是…

Fyne ( go跨平台GUI )中文文档-入门(一)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI )…

镭射限高防外破预警装置-线路防外破可视化监控,安全尽在掌握中

镭射限高防外破预警装置-线路防外破可视化监控&#xff0c;安全尽在掌握中 在城市化浪潮的汹涌推进中&#xff0c;电力如同现代社会的生命之脉&#xff0c;其安全稳定运行直接关系到每一个人的生活质量和社会的整体发展。然而&#xff0c;随着建设的加速&#xff0c;电力设施通…

部署wordpress项目

一、先部署mariadb 二、在远程登录工具上进行登录测试&#xff0c;端口号为30117&#xff0c;用户为 root&#xff0c;密码为123 三、使用测试工具&#xff1a; [rootk8s-master aaa]# kubectl exec -it pods/cluster-test0-58689d5d5d-7c49r -- bash 四、部署wordpress [root…

论文阅读 | 基于流模型和可逆噪声层的鲁棒水印框架(AAAI 2023)

Flow-based Robust Watermarking with Invertible Noise Layer for Black-box DistortionsAAAI, 2023&#xff0c;新加坡国立大学&中国科学技术大学本论文提出一种基于流的鲁棒数字水印框架&#xff0c;该框架采用了可逆噪声层来抵御黑盒失真。 一、问题 基于深度神经网络…

【AI算法岗面试八股面经【超全整理】——NLP】

AI算法岗面试八股面经【超全整理】 概率论【AI算法岗面试八股面经【超全整理】——概率论】信息论【AI算法岗面试八股面经【超全整理】——信息论】机器学习【AI算法岗面试八股面经【超全整理】——机器学习】深度学习【AI算法岗面试八股面经【超全整理】——深度学习】NLP【A…

教师管理系统小程序+ssm论文源码调试讲解

第二章 开发工具及关键技术介绍 2.1 JAVA技术 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterrise JavaBeans&#xff09;的全面支持&#xff0c;java servlet AI&#xff0c;JS&#xff08;java server ages&…

Unity 热更新(HybridCLR+Addressable)-创建Addressable资源

三、创建Addressable资源 创建三个文件夹&#xff0c;放Addressable资源&#xff0c;里面对应放程序集&#xff0c;预制体以及场景 拖拽到Addressable Groups对应组中 其中文件名太长&#xff0c;带着路径&#xff0c;可以简化名字 创建一个脚本&#xff0c;对于这个脚本进行一…

vue3自定义hooks

引言 Vue3引入了组合式API&#xff0c;使得代码逻辑更自由、灵活。其中自定义Hooks能让我们将客服用的逻辑抽离成一个独立的函数&#xff0c;以实现在多个组件中复用的目的。可以简单理解成封装成一个模块&#xff0c;以方便其他地方调用。 实现 自定义hooks useDog impor…

杰发科技——Eclipse环境安装

文件已传到网盘&#xff1a; 1. 安装文件准备 2. 安装Make 默认路径&#xff1a;C:\Program Files (x86)\GnuWin32\bin\ 不复制的话会报错 Error: Program "make" not found in PATH 3. 安装工具链 默认路径&#xff1a;C:\Program Files (x86)\Arm GNU Toolchain…

闯关leetcode——69. Sqrt(x)

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/sqrtx/description/ 内容 Given a non-negative integer x, return the square root of x rounded down to the nearest integer. The returned integer should be non-negative as well. You mu…

计算机毕业设计之:基于微信小程序的中药材科普系统(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

模拟实现(优先级队列)priority_queue:优先级队列、仿函数、 反向迭代器等的介绍

文章目录 前言一、优先级队列二、仿函数三、 反向迭代器总结 前言 模拟实现&#xff08;优先级队列&#xff09;priority_queue&#xff1a;优先级队列、仿函数、 反向迭代器等的介绍 一、优先级队列 优先级队列本质是一个堆&#xff0c;使用vector容器进一步改进进行实现&am…

vue使用PDF.JS踩的坑--部署到服务器上显示pdf.mjs viewer.mjs找不到资源

之前项目使用的pdf.js 是2.15.349版本&#xff0c;最近换了一个4.6.82的版本&#xff0c;在本地上浏览文件运行的好好的&#xff0c;但是发布到服务器&#xff08;IIS&#xff09;上打不开文件&#xff0c;控制台提示找不到pdf.mjs viewer.mjs。 之前使用的2.15.349pdf和viewer…