pin_drop当前位置:知识文库 ❯ 图文

PUT与PATCH请求详解 - Python资源更新方法对比教程

一、PUT与PATCH概述

requests.put()requests.patch() 都用于更新服务器上的资源,但语义不同。PUT是全量更新,客户端需要提供资源的完整数据来替换原有资源;PATCH是部分更新,客户端只需提供需要修改的字段。

理解PUT和PATCH的区别对于正确设计和使用RESTful API至关重要。在REST架构中,这两种方法对应着不同的资源操作语义,选择正确的方法可以让API更加规范和易于理解。


二、语法与参数说明

代码示例

requests.put(url, data=None, json=None, **kwargs)
requests.patch(url, data=None, json=None, **kwargs)
参数 类型 默认值 说明
url str 必填 请求的目标URL地址
data dict/bytes None 请求体数据
json dict None JSON格式的请求体数据
headers dict None 请求头字典
auth tuple/AuthBase None 认证信息
timeout float/tuple None 请求超时时间(秒)
allow_redirects bool True 是否允许重定向
verify bool/str True 是否验证SSL证书

返回值:均返回一个 requests.Response 对象。


三、使用PUT全量更新资源

PUT请求用于全量替换资源。当你使用PUT时,意味着你要用提交的数据完全替换服务器上的原有资源。因此,必须提供资源的全部字段,未提供的字段可能会被服务器置为空值:

代码示例

import requests

# PUT请求:全量替换用户信息
user_data = {
    'name': '张三',
    'age': 28,
    'email': 'zhangsan@example.com',
    'phone': '13800138000',
    'city': '上海'
}

response = requests.put('https://httpbin.org/put', json=user_data)
result = response.json()

print(f"状态码: {response.status_code}")
print(f"请求方法: {result['method']}")
print(f"提交数据: {result['json']}")

输出:

代码示例

状态码: 200
请求方法: PUT
提交数据: {'name': '张三', 'age': 28, 'email': 'zhangsan@example.com', 'phone': '13800138000', 'city': '上海'}

四、使用PATCH部分更新资源

PATCH请求用于部分更新资源。你只需要提供想要修改的字段,服务器会将这些字段合并到现有资源中,其他字段保持不变:

代码示例

import requests

# PATCH请求:只更新邮箱和城市
patch_data = {
    'email': 'newemail@example.com',
    'city': '北京'
}

response = requests.patch('https://httpbin.org/patch', json=patch_data)
result = response.json()

print(f"状态码: {response.status_code}")
print(f"请求方法: {result['method']}")
print(f"更新数据: {result['json']}")

输出:

代码示例

状态码: 200
请求方法: PATCH
更新数据: {'email': 'newemail@example.com', 'city': '北京'}

五、PUT与PATCH对比使用

通过一个模拟用户信息更新的场景,直观感受PUT和PATCH的差异:

代码示例

import requests

# 模拟用户信息更新场景
original_user = {
    'id': 1,
    'name': '李四',
    'age': 25,
    'email': 'lisi@example.com',
    'role': 'user'
}

# 场景1:PUT - 全量替换(必须提供所有字段)
put_data = {
    'id': 1,
    'name': '李四',
    'age': 26,  # 只改了年龄
    'email': 'lisi@example.com',
    'role': 'user'
}
put_response = requests.put('https://httpbin.org/put', json=put_data)
print(f"PUT提交字段数: {len(put_response.json()['json'])}")

# 场景2:PATCH - 部分更新(只提供修改的字段)
patch_data = {
    'age': 26  # 只改了年龄
}
patch_response = requests.patch('https://httpbin.org/patch', json=patch_data)
print(f"PATCH提交字段数: {len(patch_response.json()['json'])}")

输出:

代码示例

PUT提交字段数: 5
PATCH提交字段数: 1

从输出可以看出,即使只修改一个字段,PUT也需要提交全部5个字段,而PATCH只需提交1个修改的字段。这使得PATCH在带宽消耗和网络效率上更有优势。

小贴士

幂等性:PUT是幂等操作,多次PUT同样的数据结果一致(相当于重复替换为相同内容)。PATCH不保证幂等性,比如PATCH操作是"将年龄加1",执行多次结果会不同。


六、实际应用场景

  • 用户资料全量编辑:用户资料编辑页面,使用PUT提交完整的用户信息表单进行全量更新

  • 修改密码或邮箱:修改用户密码或邮箱时,使用PATCH只提交需要修改的字段,无需传递完整用户信息

  • 配置管理系统:使用PATCH动态更新部分配置项而不影响其他配置,适用于大规模配置管理

  • 文档版本更新:使用PUT更新文档的完整版本,确保文档内容被完全替换


七、注意事项

幂等性:PUT是幂等操作,多次执行结果一致(重复替换为相同内容);PATCH不保证幂等性,取决于具体的更新逻辑

PUT需提供全部字段:使用PUT时必须提供资源的全部字段,未提供的字段可能被服务器置为空值,导致数据丢失

服务器支持:部分服务器可能不支持PATCH方法,使用前需确认API文档,特别是较老的Web服务器


八、PUT与PATCH对比

特性 PUT PATCH
语义 全量替换资源 部分更新资源
幂等性 幂等 不保证幂等
数据量 需提供完整数据 只提供修改字段
安全性 可能覆盖未提供字段 只影响指定字段
带宽消耗 较大 较小
服务器支持 广泛支持 部分服务器不支持

九、课后练习

练习1

使用requests.put()向 https://httpbin.org/put 发送完整的用户信息(姓名、年龄、邮箱),打印服务器收到的数据

练习2

使用requests.patch()只更新用户的邮箱字段,对比与PUT请求提交数据量的差异

练习3

编写一个函数update_user(),接受user_id和更新数据字典,根据是否提供完整数据自动选择PUT或PATCH方法

常见问题

PUT和PATCH什么时候该用哪个?

如果你需要完全替换一个资源(如提交完整表单),使用PUT;如果你只需要修改资源的部分字段(如只更新邮箱),使用PATCH。实际开发中PATCH更常用,因为大多数场景只需修改少量字段。

PUT请求如果只发送部分字段会发生什么?

取决于服务器的实现。标准的RESTful API会将未提供的字段置为null或空值,导致数据丢失。因此使用PUT时必须确保提供资源的所有字段。

为什么PATCH不保证幂等?

PATCH的幂等性取决于操作语义。如果PATCH是"将字段设为某个值",则是幂等的;但如果PATCH是"将字段值加1"或"追加到列表",多次执行会产生不同结果。因此HTTP规范不保证PATCH的幂等性。

所有服务器都支持PATCH方法吗?

不是。PATCH是在RFC 5789中定义的HTTP方法,比PUT和POST引入得晚。较老的Web服务器或某些框架可能不支持PATCH。使用前应查阅API文档,或通过OPTIONS请求检查服务器支持的方法。

标签: requests.put requests.patch 资源更新 RESTful API 幂等性 PUT与PATCH

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: requests.post()详解 - Python发送POST请求完整教程 下一篇: requests.delete()详解 - Python发送DELETE请求完整教程

poll相关推荐