使用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的GET和POST请求,核心就是利用
requests
pip install requests
发送GET请求:
GET请求主要用于从服务器获取数据。参数会附加在URL后面。
立即学习“Python免费学习笔记(深入)”;
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与某个Web API交互时,我的第一反应,不,应该说是唯一反应,就是
import requests
你可以想想看,Python标准库里其实有
urllib
而
requests
response.json()
urllib
更重要的是,
requests
Session
requests
在实际开发中,发送HTTP请求并非总是那么一帆风顺。网络波动、服务器响应慢、API需要特定认证信息等,都是我们常会遇到的“拦路虎”。这时候,光会发请求还不够,你得知道怎么优雅地处理这些挑战。
首先是超时(Timeout)。这真的是一个太容易被忽略,但又极其重要的参数。设想一下,你的程序向一个响应缓慢甚至已经挂掉的API发出了请求,如果没有设置超时,你的程序可能会一直傻傻地等着,直到操作系统层面把连接断开,这可能需要几十秒甚至几分钟,直接导致你的应用卡死。
requests
timeout
requests.get(url, timeout=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)
发送请求只是完成了任务的一半,更关键的是如何理解和处理服务器返回的响应,以及如何优雅地应对可能出现的错误。一个健壮的HTTP客户端,绝不仅仅是把请求发出去那么简单,它还需要像一个细心的侦探,仔细检查收到的每一个线索。
首先,检查HTTP状态码是至关重要的一步。
response.status_code
200 OK
201 Created
400 Bad Request
404 Not Found
500 Internal Server Error
response.json()
response.status_code
requests
response.raise_for_status()
requests.exceptions.HTTPError
其次,高效地解析响应数据。根据
Content-Type
requests
Content-Type
application/json
response.json()
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}")这样的错误处理机制,虽然看起来代码量增加了一些,但它能极大地提高程序的稳定性和用户体验。毕竟,一个程序崩溃总比一个能告诉你“哪里出错了”的程序要糟糕得多。
这其实是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
所以,我的经验是,当你需要向服务器“推送”信息,或者你的操作会引起服务器端数据变化时,毫不犹豫地选择POST。把它想象成你给服务器寄一封信或一个包裹,内容都在信封里,而不是写在信封外面。这不仅是技术上的选择,更是对HTTP协议语义的尊重和对数据安全的考量。
以上就是python怎么发送HTTP的GET和POST请求_python发送HTTP请求实战指南的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号