【问题标题】:Should I store _method=PUT/DELETE in the post or in the url我应该在帖子或网址中存储 _method=PUT/DELETE
【发布时间】:2010-10-14 11:21:00
【问题描述】:

我正在使用 ASP.NET MVC 来构建一个 RESTful Web 应用程序,我计划通过 POST 来传输 PUT 和 DELETE 请求,因为这似乎是最实用的解决方法。

我想知道的是,我是否应该像这样通过 url 传输信息:

<form method='post' action='resource?_method=DELETE'>
    <!-- fields -->
</form>

或者我应该像这样通过发布的表单数据进行隧道传输:

<form method='post' action='resource'>
    <input type='hidden' name='_method' value='DELETE' />
    <!-- fields -->
</form>

各有什么优缺点?

编辑: 我问这个问题的原因之一是我在某处读到,将这样的信息放在 url 中是一件好事,因为发布数据通常会丢失,但 url 会到处存在(在日志文件等) - 不幸的是,它使 url 看起来很丑

【问题讨论】:

    标签: c# asp.net-mvc http rest


    【解决方案1】:

    更多的是个人喜好。 RESTful Web Services,OReilly,在某种程度上可以互换地描述两者。

    话虽如此,出于程序员的意图,我更喜欢第一种方法。在休息时,当我在看代码时,我在脑海中阅读

    动词http://someuri.com/someresource/id

    动词和资源紧密相连。

    对于 PUT 和 DELETE,您必须使用您所展示的解决方法。在第一个示例中,资源和动词仍然紧靠在同一行。

    然而,在您的第二个示例中,资源被分成两行。动词与资源 ID 位于同一行,但远离资源名称。这是非常非常次要的,但对我来说,这使得第二个示例的可读性降低。

    【讨论】:

    • 这也是我得出的结论,所以我将其标记为已接受的答案。从 HTTP 的角度来看,数据包的第一行应该有动词和要访问的资源。将其放在 url 中比将其隐藏在帖子信息中更接近这个理想。无论如何,用户不会真正看到 url,因为成功的 PUT 可以被重定向到 GET 相关资源。
    • 我不建议将动词放入URL,因为它是用于资源识别而不是操作识别。从我的角度来看,隐藏输入或方法覆盖标头是更好的解决方案。也许另一种可能的解决方案是通过纯 HTML 将 MIME 类型参数添加到表单的 enctype 中。
    【解决方案2】:

    我没有,但你不应该使用:

    <form method="put" action="resource">
        <!-- fields -->
    </form>
    

    和/或

    <form method="delete" action="resource">
        <!-- fields -->
    </form>
    

    ...?

    【讨论】:

    • 我很乐意,但大多数 Web 浏览器(实际上是 HTML/XHTML 规范)都不支持此功能
    • 我明白了。就我个人而言,我会将其放在帖子中,因为这是请求的所有其他信息所在的位置。您在哪里读到它在 URL 中更好?
    • 我不记得了,但最好记录下 url 之类的内容。如果我检查我的请求日志,我可以看到 'POST /resource?_method=DELETE' 而不仅仅是 'POST /resource'
    • GET 请求不应该修改数据。您永远不应该将 _method 放在查询参数中,因为它允许 URL 将 GET 请求更改为不同的请求动词。假设我向您的用户发送了一封电子邮件,其中包含“单击此处获取免费小狗”的链接,但该链接实际上以路径“/message/delete/1?_method=DELETE”进入了您的网站。当某些用户不可避免地点击它时,您认为会发生什么?
    【解决方案3】:

    你看过this的问题吗?据我了解,x-http-method-override 标头是解决此问题的首选方案。

    【讨论】:

    • x-http-method-override 是否可以在禁用了 javascript 的浏览器中使用?
    • 我不知道没有启用 javascript 的方法。
    【解决方案4】:

    它们是等价的。

    虽然如果被按我更愿意自己在帖子中发送,但这是主观的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2013-01-19
      • 2016-09-12
      • 1970-01-01
      相关资源
      最近更新 更多