【问题标题】:Is there any reason not to use HTTP PUT and DELETE in a web application?是否有任何理由不在 Web 应用程序中使用 HTTP PUT 和 DELETE?
【发布时间】:2009-07-09 04:51:28
【问题描述】:

环顾四周,我无法命名使用除 GET 和 POST 请求之外的任何内容的单个 Web 应用程序(不是 Web 服务)。这有什么具体原因吗?某些浏览器(或服务器)是否不支持任何其他类型的请求?还是仅仅出于历史原因?我想利用 PUT 和 DELETE 请求让我在服务器端的生活更轻松一些,但我不愿意,因为没有其他人这样做。

【问题讨论】:

    标签: http rest httprequest


    【解决方案1】:

    实际上,相当多的人使用 PUT 和 DELETE,主要用于非浏览器 API。一些示例是 Atom 发布协议和 Google 数据 API:

    除此之外,您看不到 PUT/DELETE 的常用用法,因为大多数浏览器不支持通过表单进行 PUT 和 DELETE。 HTML5 似乎正在解决这个问题:

    它适用于浏览器应用程序的方式是:人们在设计 RESTful 应用程序时考虑到 PUT 和 DELETE,然后通过来自浏览器的 POST “隧道”这些请求。例如,请参阅这个关于 Ruby on Rails 如何使用隐藏字段完成此任务的 SO 问题:

    因此,您不会在自己设计应用程序时考虑到更大的 HTTP 动词集。

    编辑:顺便说一句,如果您对基于浏览器的表单帖子中缺少 PUT/DELETE 的原因感到好奇,那么事实证明没有真正好的技术原因。在 rest-discuss 邮件列表中阅读此线程,尤其是 Roy Fielding 的 cmets,在某些情况下很有趣:

    编辑:关于 AJAX 库是否支持所有方法有一些 cmets。它确实归结为 XMLHttpRequest 的实际浏览器实现。我想有人可能会觉得这个链接很方便,它会测试您的浏览器以查看 HttpRequest 对象与各种 HTTP 选项的兼容性。

    很遗憾,我不知道收集这些结果的参考资料。

    【讨论】:

    【解决方案2】:

    很简单,HTML 4.01 form element 在其method 属性中只允许值“POST”和“GET

    【讨论】:

    • 嗯,这很有道理……但这不适用于 Ajax 请求,对吧?我可以使用任何我想要的方法?
    • 如果浏览器是根据 HTML 4.01 规范构建的,它不会理解除规范之外的任何内容。这就是你可以假设浏览器可以做的所有事情
    • 浏览器通常不仅仅是基于 HTML 规范构建的 - JavaScript 不是 HTML 4.01 的一部分。
    • @Wahnfrieden - 嗯,这是真的。换句话说,HTML document 必须符合 HTML 规范。该规范允许
    【解决方案3】:

    一些具有严格安全策略的代理服务器可能会丢弃它们。无论如何我都在使用 PUT 和 DELETE。

    【讨论】:

      【解决方案4】:

      我读到一些浏览器不正确支持其他 HTTP 方法,但我不能说出任何细节。

      Rails 尤其会使用方法参数打包您的表单,以显式设置它,即使浏览器不支持这些方法也是如此。如果您要这样做,这似乎是一个合理的预防措施。

      【讨论】:

        【解决方案5】:

        我说使用 HTTP 的所有功能,该死的浏览器,哈哈。也许它会激发对 HTTP 协议的更完整和正确的使用。网络上发生的不仅仅是 POST 和 GET。关于时间浏览器实现反映了这一点。

        【讨论】:

        • 哈哈,我希望。不幸的是,除了激怒我的用户之外,我认为让我的 Web 应用程序不起作用不会做任何事情。 :)
        • 嗯...是的,我想你说得有道理。哦,好吧,这是个好主意。
        【解决方案6】:

        这取决于您的浏览器和 Ajax 库。例如jQuery 支持所有 HTTP 方法,即使浏览器可能不支持。例如,参见“type”属性上的jQuery "ajax" documentation

        Restlet Java 框架允许您通过 HTML POST 操作来隧道化 PUT 和 DELETE 请求。为此,您只需在 URI 的查询字符串中添加 method=put 或 method=delete,例如:

        http://www.example.com/user=xyz?method=delete ...
        

        这与 Ruby on Rails 的方法相同(如上面@ars 所述)。

        【讨论】:

        • 来自 jQuery 文档:“这里也可以使用其他 HTTP 请求方法,例如 PUT 和 DELETE,但并非所有浏览器都支持它们。”所以你错了。
        【解决方案7】:

        就个人而言,我真的看不出在 Web 应用程序中使用 PUT 或 DELETE 有什么用处。应用程序执行的所有操作都是读取或写入,也就是输入输出。为什么需要在 HTTP 请求的 header 中区分操作的性质? 我可以使用表单 /object/object_id 的相同 url 进行 ajax 调用 并执行多个操作,例如删除、更新、获取值或创建。 只看网址,我不知道它是哪一个。 通过仅使用 GET 和 POST,我的网址将是:

        /object/id/删除

        /object/id/创建

        /object/id/更新

        /object/id --> 隐含的 GET

        等等

        根据我有限的经验,在许多情况下,这比隐藏的标头请求类型要干净得多。 我并不是说永远不要使用 PUT 或 DELETE,只是说,只有在绝对需要时才使用它们。

        请参阅 Leonard Richardson 的“RESTful Web API”,详细了解有关 RESTful Web api 中 HTTP 请求方法的不同用例和约定。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-15
          • 2021-04-08
          • 2020-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多