ASP.NET: 不使用 HttpPut 和 HttpDelete 进行更新和删除

ASP.NET: Update and delete without using HttpPut and HttpDelete

我发现很多开源项目不使用HttpPutHttpDelete进行更新和删除。相反,他们在他们的方法之前添加了 HttpPost 端点,并且功能也成功实现了。

我了解到的是,我们使用HttpPutHttpDelete进行更新和删除。我很困惑。

我在下面添加了更新方法和删除方法的示例。

更新:

        [HttpPost]
        public async Task<IActionResult> Edit(int id, NewInvoiceVM invoice)
        {
            var allInvoices = await _service.GetAllAsync();

            var invoicesValidate = allInvoices.ToList().FirstOrDefault(n => n.SupplierName == invoice.SupplierName && n.InvoiceNumber == invoice.InvoiceNumber);
            await _service.UpdateInvoiceAsync(invoice);
            return RedirectToAction(nameof(Index));
        }

删除:

        [HttpPost, ActionName("Delete")]
        public async Task<IActionResult> DeleteConfirmed(int id)
        {
            var invoiceDetails = await _service.GetInvoiceByIdAsync(id);
            if (invoiceDetails == null) return View("NotFound");

            await _service.DeleteAsync(id);
            return RedirectToAction(nameof(Index));
        }

问题:更新和删除方法是否需要HttpPutHttpDelete?如果没有,我们应该什么时候使用它们?

已经有微软如何做到这一点的例子。在大多数情况下,您应该这样做(似乎您使用的是 .Net?)。

https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-6.0&tabs=visual-studio#the-deletetodoitem-method

也许您看到的存储库中的人只是犯了错误。

如果您要实施 API,您有很多方法可以实现。使用 PUT、DELETE、UPDATE 等都是推荐的最佳实践,但没有必要使用它们。

您可以编写一个 API 来侦听删除某些内容的 DELETE 请求,或者您可以编写一个 API 来侦听 POST 请求,并使用另一个参数告诉它是否这是一个删除,或其他东西。两者都工作得很好。

您以某种方式进行操作的原因是,如果您使用了最佳实践推荐,那么当其他人开始使用您的东西时,他们会很直观。这适用于 PUT/POST,因为它适用于所有编码最佳实践。

从历史上看,Web 浏览器没有对 PUTPATCHDELETE 和其他动词的原生支持。他们只支持 GETPOST。 API 实现 PUT 等必须通过发送带有隐藏字段(通常命名为 _method)的 POST 来假装他们发送的不是其他东西POST.

出于这个原因,许多项目认为不值得实施。