四种请求方式的区别

get

从服务器端获取数据,请求body在地址栏上

用于获取资源,是幂等的,无副作用

 

post

向服务器端提交数据,请求数据在报文body里

发送一个修改数据的请求,需求数据要从新创建

用于创建,更新,删除资源,查询资源都可以,是不幂等的

 

put

向服务器端提交数据,请求数据在报文body里

发送一个修改数据的请求,需求数据更新(全部更新)

用于添加/更新资源

 

patch

向服务器端提交数据,请求数据在报文body里

发送一个修改数据的请求,需求数据更新(部分更新)

用于更新资源,且是局部更新,比如:user对象,你只更改了name属性,那么他的其他属性值是不会变的,如果你用post,那么其他属性值会被设置为null(全局更新)

 

delete

向服务器端提交数据,请求数据在报文body里

发送一个删除数据的请求

用于删除资源

 

幂等性

HTTP GET方法用于获取资源,不应有副作用,所以是幂等的。比如: GET http://www .bank.com/account/123456,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是一次和N次具有相同的副作用,而不是每次GET的结果相同。GET  http://www.news.com/latestnews这个HTTP请求可能会每次得到不同的结果,但它本身并没有产生任何副作用,因而是满足幂等性的。

HTTP DELETE方法用于删除资源,有副作用,但它应该满足幂等性。比如: DELETE http://www.forum.com/article/4231,调用- -次和N次对系统产生的副作用是相同的,即删掉id为4231的帖子;因此,调用者可以多次调用或刷新页面而不必担心弓|起错误。

重点来了:比较容易混淆的是HTTP的 POST和PUT。POST和PUT的区别容易被简单地误认为"POST表示创建资源,PUT表示更新资源”;而实际上,二者均可用于创建资源,更为本质的差别是在幂等性方面。在HTTP规范中对POST和PUT是这样定义的:
POST所对应的URI并非创建的资源本身,而是资源的接收者。比如: POST http://www.forum.com/articles的语义是在

http://www.forum.com/articles下创建一篇帖子, HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI; 所以,POST方法不具备幂等性。而PUT所对应的URI是要创建或更新的资源本身。比如: PUThttp://www.forum/articles/4231的语义是创建或更新ID为4231的帖子。对同一URI进行多次PUT的副作用和一次PUT是相同的;因比,PUT方法具有幕等性。

在介绍了几种操作的语义和幂等性之后,我们来看看如何通过Web API的形式实现前面所提到的取款功能。很简单,POST /tickets来实现create_ ticket;用PUT /accounts/account id/ticket id&amount=xxx来实现idempotent _withdraw。值得注意的是严格来讲amount参数不应该作为URI的一部分,正的URI应该是/accounts/account_ id/ticket id,而amount应该放在请求的body中。 这种模式可以应用于很多场合,比如:论坛网站中防止意外的重复发帖。

### HTTP 请求方法 POST 的详细说明 #### 基本概念 POST 是一种用于向指定资源提交数据的方法,目的是让服务器对其进行处理并返回结果。它通常用来创建新的资源或将数据传递到服务器[^1]。 #### 数据格式 在使用 POST 方法时,可以通过请求体(Body)发送多种类型的数据。常见的数据格式包括 `application/x-www-form-urlencoded` `application/json`。其中,JSON 格式的使用越来越广泛,因为它结构清晰且易于解析。 #### 请求头配置 为了确保服务器能够正确识别处理请求体中的数据,在发送 POST 请求时需要设置合适的 Content-Type 头部字段。例如,当发送 JSON 格式的数据时,应将头部设为 `Content-Type: application/json`。 以下是 Python 中利用 `requests` 库实现 POST 请求的一个示例: ```python import requests import json url = 'https://example.com/api' data = {'key': 'value'} headers = {'Content-Type': 'application/json'} response = requests.post(url, data=json.dumps(data), headers=headers) print(response.status_code) print(response.json()) ``` #### 实际开发注意事项 - **安全性**:相比 GET 方法,POST 更适合传输敏感信息,因为这些信息不会显示在 URL 中[^5]。 - **幂等性**:GET 请求具有幂等性,即多次相同的 GET 请求效果相同;而 POST 不具备此特性,重复的 POST 请求可能会导致副作用,如多次创建记录[^3]。 - **大小限制**:虽然理论上没有严格的大小限制,但实际上受服务器配置影响,POST 可以携带较大的负载,甚至支持二进制文件上传[^4]。 --- ### POST 与其他方法的区别 | 特性 | POST | GET | |-----------------|-------------------------------|-------------------------------| | 主要用途 | 提交数据 | 获取数据 | | 参数位置 | 请求体 | URL 查询字符串 | | 安全性 | 较高 | 较低 (参数暴露于 URL) | | 幂等性 | 非幂等 | 幂等 | | 缓存机制 | 不可缓存 | 可缓存 | | 支持的数据量 | 理论上无上限 | 有限 (取决于浏览器/服务器) | GET 请求适用于简单的查询操作,其参数直接附加在 URL 上,方便快捷但不够安全[^2]。相比之下,POST 则更适合复杂的场景,尤其是涉及大量或敏感数据的情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值