环顾四周,我无法命名使用除 GET 和 POST 请求之外的任何内容的单个 Web 应用程序(不是 Web 服务)。这有什么具体原因吗?某些浏览器(或服务器)是否不支持任何其他类型的请求?还是仅仅出于历史原因?我想利用 PUT 和 DELETE 请求让我在服务器端的生活更轻松一些,但我不愿意,因为没有其他人这样做。
7 回答
实际上,相当多的人使用 PUT 和 DELETE,主要用于非浏览器 API。一些示例是 Atom 发布协议和 Google 数据 API:
除此之外,您看不到 PUT/DELETE 的常用用法,因为大多数浏览器不支持通过 Forms 进行 PUT 和 DELETE。HTML5 似乎正在解决这个问题:
它适用于浏览器应用程序的方式是:人们在设计 RESTful 应用程序时考虑到 PUT 和 DELETE,然后通过来自浏览器的 POST “隧道”这些请求。例如,请参阅这个关于 Ruby on Rails 如何使用隐藏字段完成此任务的 SO 问题:
因此,您不会在自己设计应用程序时考虑到更大的 HTTP 动词集。
编辑:顺便说一句,如果您对基于浏览器的表单帖子中为什么缺少 PUT/DELETE 感到好奇,那么事实证明没有真正好的技术原因。在 rest-discuss 邮件列表上阅读这个线程,尤其是 Roy Fielding 的评论,在某些情况下很有趣:
编辑:关于 AJAX 库是否支持所有方法有一些评论。它确实归结为 XMLHttpRequest 的实际浏览器实现。我想有人可能会觉得这个链接很方便,它会测试您的浏览器以查看 HttpRequest 对象与各种 HTTP 选项的兼容性。
不幸的是,我不知道收集这些结果的参考资料。
很简单,HTML 4.01form
元素在其属性中只允许值 " POST
" 和 " "GET
method
一些具有严格安全策略的代理服务器可能会丢弃它们。无论如何,我正在使用 PUT 和 DELETE。
我读过一些浏览器不正确支持其他 HTTP 方法,但我不能说出任何细节。
尤其是 Rails,即使浏览器不支持这些方法,也会使用方法参数来显式设置您的表单。如果您要这样做,这似乎是一个合理的预防措施。
我说使用 HTTP 的所有功能,该死的浏览器,哈哈。也许它会激发对 HTTP 协议的更完整和正确的使用。网络上发生的不仅仅是 POST 和 GET。关于时间浏览器实现反映了这一点。
这取决于您的浏览器和 Ajax 库。例如,jQuery支持所有 HTTP 方法,即使浏览器可能不支持。例如,参见关于“type”属性的jQuery“ajax”文档。
Restlet Java 框架允许您通过HTML POST 操作来隧道化 PUT 和 DELETE 请求。为此,您只需在 URI 的查询字符串中添加 method=put 或 method=delete,例如:
http://www.example.com/user=xyz?method=delete ...
这与 Ruby on Rails 的方法相同(如上面@ars 所述)。
就个人而言,我真的没有看到在 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 请求方法的不同用例和约定。