rest - 在 ASP.Net Web API 中,如何伪造 PUT 和 DELETE?

标签 rest asp.net-web-api http-delete http-put

我正在试验 ASP.Net Web API,按照惯例,它将 Controller 方法拆分为 Get()、Put、Post 和 Delete 的 Restful 风格。我的问题是如何处理可能来自非 Ajax 浏览器请求的 PUT 和 DELETE 请求。

所以,假设我有一个 id = 123 的 foobar。一个正常的获取请求是

/foobars/123

要删除该项目,Restful 方法是发出:
DELETE /foobars/123

然而,PUTDELETE如果您的请求来自非 Ajax 浏览器请求,则它们不是浏览器标准,并且没有足够的主要浏览器支持来信任。所以一个普遍接受的解决方法是:
POST /foobars/123?_method=DELETE (source: Restful Web Services)

对于新的 ASP.Net Web API,是否有解决此问题的最佳实践/通用方法?我想要的是任何带有 _method=DELETE 的东西路由到 DELETE() Controller 中的方法和 _method=PUT路由到 Controller 的 PUT() 方法。

最佳答案

您可以使用 DelegatingHandler 轻松实现这一点。 .

所以你会编码:

public class HttpMethodHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var queryString = HttpUtility.ParseQueryString(request.RequestUri.Query);
        if(!string.IsNullOrEmpty(queryString["_method"]))
        {
            request.Method = new HttpMethod(queryString["_method"]);
        }
        return base.SendAsync(request, cancellationToken);
    }
}

然后将处理程序添加到管道中。我有一个 blog在那。

关于rest - 在 ASP.Net Web API 中,如何伪造 PUT 和 DELETE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11213905/

相关文章:

javascript - Node/Express - 如何实现 DELETE 和 PUT 请求

c# - 覆盖 .net Web API 中操作映射和参数的基本功能

c# - 如何从 Azure 移动服务获取请求返回所有行?

html - 如何在链接或表单中指定 DELETE 方法?

javascript - React hooks 中的 fetch() 删除方法(使用 context api)

javascript - 将对象从 JavaScript 传递到 Web API 时出现问题

spring - 使用 jersey 2 和 Spring 编写 "clean"集成测试 - REST

java - RESTEasy 客户端。找不到内容类型应用程序/xml 的编写器

java - 我们应该如何设计不同内部微服务之间的通信

html - 将特定于选项卡的数据绑定(bind)到 HTTP GET 请求