Python发送HTTP请求教程详解
掌握Python发送HTTP请求的核心在于`requests`库。本文将带你从零开始,通过实例讲解如何使用`requests`发送GET和POST请求,轻松实现与Web服务的交互。首先,通过`pip install requests`安装库。对于GET请求,使用`requests.get(url, params=data)`获取数据,参数通过`params`传递;POST请求则使用`requests.post(url, json=data)`提交JSON数据或`data`参数提交表单。相较于标准库`urllib`,`requests`语法更简洁、功能更强大,支持超时设置、自定义头部、会话管理等高级特性。实际应用中,需关注超时(`timeout`)、重试机制及自定义`headers`(如认证信息)。响应处理应检查`status_code`或使用`raise_for_status()`抛出异常,并用`response.json()`解析JSON数据。理解POST请求在提交敏感数据、创建资源及发送复杂数据类型时的优势,提升程序健壮性。
使用requests库发送HTTP请求是Python中最直接推荐的方式,它简化了GET和POST请求的实现。首先通过pip install requests安装库。发送GET请求时,调用requests.get(url)获取数据,参数可通过params传递;发送POST请求时,使用requests.post(url, json=data)提交JSON数据或data参数提交表单。相比标准库urllib,requests语法更简洁、功能更强大,支持超时设置、自定义头部、会话管理等高级特性。实际开发中需处理超时(timeout)、重试机制及自定义headers(如认证信息)。响应处理应检查status_code或使用raise_for_status()抛出异常,并用response.json()解析JSON数据。错误处理需捕获Timeout、ConnectionError、HTTPError等异常以提升程序健壮性。POST适用于提交敏感或大量数据、创建资源及发送复杂数据类型,因其数据置于请求体中,更安全且无长度限制,符合HTTP语义规范。

在Python中发送HTTP的GET和POST请求,最直接、最推荐的方式是使用requests库。它极大地简化了HTTP请求的复杂性,让开发者能以非常直观的方式与Web服务进行交互,无论是获取数据还是提交表单,都能轻松实现。
解决方案
要发送HTTP的GET和POST请求,核心就是利用requests库。首先,你需要确保已经安装了它(pip install requests)。
发送GET请求:
GET请求主要用于从服务器获取数据。参数会附加在URL后面。
import requests
# 示例:获取一个公共API的数据
url = "https://jsonplaceholder.typicode.com/posts/1"
response = requests.get(url)
# 检查响应状态码
if response.status_code == 200:
print("GET请求成功!")
# 获取响应内容(JSON格式)
print(response.json())
else:
print(f"GET请求失败,状态码:{response.status_code}")
print(response.text)
# 带有查询参数的GET请求
params = {
'userId': 1,
'id': 1
}
url_with_params = "https://jsonplaceholder.typicode.com/posts"
response_params = requests.get(url_with_params, params=params)
if response_params.status_code == 200:
print("\n带有参数的GET请求成功!")
print(response_params.json())
else:
print(f"带有参数的GET请求失败,状态码:{response_params.status_code}")发送POST请求:
POST请求通常用于向服务器提交数据,例如创建新资源或上传文件。数据会放在请求体中。
import requests
import json
# 示例:向公共API提交新数据
url = "https://jsonplaceholder.typicode.com/posts"
# 提交JSON格式的数据
payload_json = {
'title': 'foo',
'body': 'bar',
'userId': 1,
}
# requests库会自动将json参数序列化为JSON字符串并设置Content-Type为application/json
response_post_json = requests.post(url, json=payload_json)
if response_post_json.status_code == 201: # 201 Created 表示资源创建成功
print("\nPOST JSON请求成功!")
print(response_post_json.json())
else:
print(f"POST JSON请求失败,状态码:{response_post_json.status_code}")
print(response_post_json.text)
# 提交表单数据 (application/x-www-form-urlencoded)
payload_form = {
'key1': 'value1',
'key2': 'value2'
}
# requests库会自动将data参数编码为表单数据并设置Content-Type
response_post_form = requests.post(url, data=payload_form)
if response_post_form.status_code == 201:
print("\nPOST 表单请求成功!")
print(response_post_form.json())
else:
print(f"POST 表单请求失败,状态码:{response_post_form.status_code}")
print(response_post_form.text)Python中发送HTTP请求,为什么我们都偏爱requests库?
说实话,每次当我需要用Python与某个Web API交互时,我的第一反应,不,应该说是唯一反应,就是import requests。这几乎成了一种肌肉记忆。为什么会这样?
你可以想想看,Python标准库里其实有urllib模块,它也能发HTTP请求,甚至更底层、更灵活。但用过它的人都知道,那感觉就像是在用原始的砖块和水泥盖房子,每一步都需要你亲力亲为:处理URL编码、管理连接、处理重定向、异常捕获……光是想到这些细节,头就开始疼了。
而requests库呢?它就像是一个现代化的预制件工厂,把那些繁琐、重复的底层操作都封装好了。你只需要告诉它你要什么(GET还是POST),往哪里发,带上什么数据,它就能帮你把剩下的事情都搞定。它的API设计得极其人性化,直观、简洁,几乎一看就懂。比如,处理JSON响应,response.json()一行代码就搞定,哪像urllib里还需要手动解码。
更重要的是,requests还提供了很多高级功能,比如会话管理(Session对象),可以让你在多次请求中保持Cookie和其他状态;文件上传变得异常简单;认证机制也支持得很好。对于一个真实世界的项目来说,这些特性不是可有可无的,它们是提高开发效率、减少bug的关键。所以,与其说我们偏爱requests,不如说它让HTTP请求这件事变得“理所当然”的简单和愉快。它不仅仅是一个库,它更像是一种编程哲学:让复杂的事情变得简单。
处理HTTP请求中的常见挑战:超时、重试与自定义头部
在实际开发中,发送HTTP请求并非总是那么一帆风顺。网络波动、服务器响应慢、API需要特定认证信息等,都是我们常会遇到的“拦路虎”。这时候,光会发请求还不够,你得知道怎么优雅地处理这些挑战。
首先是超时(Timeout)。这真的是一个太容易被忽略,但又极其重要的参数。设想一下,你的程序向一个响应缓慢甚至已经挂掉的API发出了请求,如果没有设置超时,你的程序可能会一直傻傻地等着,直到操作系统层面把连接断开,这可能需要几十秒甚至几分钟,直接导致你的应用卡死。requests库提供了timeout参数,你可以设置一个浮点数,表示等待服务器响应的秒数。比如 requests.get(url, timeout=5),如果5秒内没有响应,就会抛出requests.exceptions.Timeout异常。这就像给你的网络请求设了个“死线”,过时不候,非常实用。
接着是重试(Retries)。网络环境复杂多变,一次请求失败不代表永远失败。有时候只是瞬时网络抖动,或者服务器短暂繁忙。在这种情况下,简单地重试几次往往就能成功。requests库本身并没有内置的重试机制,但这并不意味着我们不能实现。最直接的方式就是写一个简单的for循环,配合try-except块来捕获异常,并在每次重试前加个短暂的time.sleep()。对于更复杂的重试策略,比如指数退避,可以考虑结合requests.Session和urllib3.Retry策略来实现。不过,对于大多数场景,一个简单的循环重试就足够了,而且自己写能更好地控制重试逻辑。
最后是自定义头部(Custom Headers)。HTTP头部是请求和响应的“元数据”,承载着非常重要的信息。例如,很多API会要求你在请求头中携带Authorization令牌进行身份验证;或者你可能需要伪装User-Agent,让服务器认为你的请求来自一个浏览器而不是脚本,以避免被反爬虫机制拦截。在requests中,你可以通过headers参数传入一个字典来轻松实现。比如 headers = {'User-Agent': 'MyCustomApp/1.0', 'Authorization': 'Bearer your_token'},然后 requests.get(url, headers=headers)。掌握了自定义头部,你就能更好地模拟各种客户端行为,与各种API进行顺畅的沟通。这些小技巧,在实际解决问题时,真的能让你事半功倍。
如何安全高效地处理HTTP响应数据与潜在错误?
发送请求只是完成了任务的一半,更关键的是如何理解和处理服务器返回的响应,以及如何优雅地应对可能出现的错误。一个健壮的HTTP客户端,绝不仅仅是把请求发出去那么简单,它还需要像一个细心的侦探,仔细检查收到的每一个线索。
首先,检查HTTP状态码是至关重要的一步。response.status_code会告诉你服务器对你请求的态度:200 OK表示一切正常;201 Created表示资源已成功创建;400 Bad Request意味着你的请求有问题;404 Not Found是老熟人了,资源不存在;500 Internal Server Error则表示服务器端出错了。我见过太多代码,发完请求就直接response.json(),结果一旦遇到非200的状态码,程序就直接崩溃了。一个好的习惯是,在尝试解析响应内容之前,先判断response.status_code是否在预期的成功范围内。requests库提供了一个非常方便的方法:response.raise_for_status()。如果响应状态码是4xx或5xx,它会自动抛出一个requests.exceptions.HTTPError异常,省去了我们手动判断的麻烦。
其次,高效地解析响应数据。根据Content-Type的不同,服务器可能会返回JSON、HTML、XML或纯文本。requests库已经为我们做好了大部分工作:
- 如果响应是JSON格式(
Content-Type通常是application/json),直接使用response.json()方法,它会帮你把JSON字符串解析成Python字典或列表,非常方便。 - 如果响应是纯文本或HTML,
response.text属性会给你解码后的字符串。 - 对于二进制数据,比如图片或文件,可以使用
response.content获取原始字节。
最后,也是最容易被忽视的一点:全面的错误处理。网络请求 inherently 就是不稳定的。除了HTTP状态码错误,还可能遇到各种网络层面的问题,比如连接超时、DNS解析失败、连接中断等。这些都会抛出requests.exceptions模块下的不同异常。为了让你的程序足够健壮,你应该用try-except块来包裹你的请求代码,捕获这些潜在的异常。一个通用的做法是捕获requests.exceptions.RequestException,它是所有requests库相关异常的基类,这样可以一次性处理所有网络请求可能遇到的问题。例如:
try:
response = requests.get("http://bad-url-or-timeout.com", timeout=2)
response.raise_for_status() # 检查HTTP错误
data = response.json()
print(data)
except requests.exceptions.Timeout:
print("请求超时了,服务器响应太慢。")
except requests.exceptions.ConnectionError:
print("连接错误,可能是网络问题或URL不对。")
except requests.exceptions.HTTPError as e:
print(f"HTTP错误:{e.response.status_code} - {e.response.text}")
except requests.exceptions.RequestException as e:
print(f"发生了一个未知的请求错误:{e}")
except ValueError: # 如果response.json()解析失败
print("响应内容不是有效的JSON格式。")
except Exception as e:
print(f"发生了一个意料之外的错误:{e}")这样的错误处理机制,虽然看起来代码量增加了一些,但它能极大地提高程序的稳定性和用户体验。毕竟,一个程序崩溃总比一个能告诉你“哪里出错了”的程序要糟糕得多。
在什么场景下,POST请求比GET请求更适用?
这其实是HTTP协议设计中的一个核心考量:什么时候用GET,什么时候用POST?简单来说,如果你只是想“问”服务器要点东西,不打算改变服务器上的任何状态,那么GET是你的首选。但如果你想“告诉”服务器做点什么,比如创建、更新或删除数据,那么POST就显得更为合适,甚至可以说是必须的。
具体来说,有几个场景POST请求的优势就非常明显:
提交敏感或大量数据: GET请求的参数是直接拼接在URL后面的,这不仅意味着数据会暴露在浏览器历史记录、服务器日志甚至网络嗅探中,而且URL的长度通常也有限制。想象一下,如果你要提交一个包含用户密码的表单,或者一个几百K的文本内容,用GET请求简直是灾难。POST请求将数据放在请求体中,虽然不是绝对安全(仍需HTTPS加密),但至少不会在URL中暴露,也没有严格的长度限制,这让它成为提交大量或敏感数据的理想选择。
创建或更新资源: HTTP协议对GET和POST有一个重要的语义区分:GET请求应该是“幂等”且“安全的”。“安全”意味着它不会对服务器状态产生副作用(比如删除数据库记录);“幂等”意味着重复执行同一个GET请求,服务器状态不会发生改变,返回的结果也应该是一样的。而POST请求则不然,它通常用于非幂等操作,比如向数据库添加一条新记录(每次POST都可能创建新记录),或者上传一个文件。如果你希望你的请求能够改变服务器的状态,那么POST无疑是更符合HTTP规范的选择。
发送复杂数据类型: GET请求主要通过URL查询参数传递简单的键值对。而POST请求的请求体则可以承载更丰富、更复杂的数据格式,比如JSON对象、XML文档,甚至是二进制文件(如图片上传)。
requests库的json和files参数就是为这种场景设计的,它们能让你轻松地发送结构化的数据或文件,这是GET请求望尘莫及的。
所以,我的经验是,当你需要向服务器“推送”信息,或者你的操作会引起服务器端数据变化时,毫不犹豫地选择POST。把它想象成你给服务器寄一封信或一个包裹,内容都在信封里,而不是写在信封外面。这不仅是技术上的选择,更是对HTTP协议语义的尊重和对数据安全的考量。
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Python发送HTTP请求教程详解》文章吧,也可关注golang学习网公众号了解相关技术文章。
翻咔悄悄看消息技巧全解析
- 上一篇
- 翻咔悄悄看消息技巧全解析
- 下一篇
- Word如何画横线填空教程
-
- 文章 · python教程 | 11分钟前 |
- Mako模板使用方法与实例详解
- 292浏览 收藏
-
- 文章 · python教程 | 16分钟前 |
- Pythonpdb调试方法详解
- 109浏览 收藏
-
- 文章 · python教程 | 24分钟前 |
- Pyodide集成BasthonTurtle教程与SVG渲染详解
- 447浏览 收藏
-
- 文章 · python教程 | 31分钟前 |
- Pythontkinter添加控件技巧分享
- 148浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- KBar快捷键注册失败怎么解决
- 392浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python多目录导入技巧与实战解析
- 423浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python局部变量定义与使用技巧
- 182浏览 收藏
-
- 文章 · python教程 | 2小时前 | 类 自定义行为 双下划线 Python魔法方法 特殊方法
- Python常用魔法方法有哪些?
- 300浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3176次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3388次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3417次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4522次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3796次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览

