为什么浏览器不支持PUT和DELETE请求,何时支持?

pix*_*rth 34 rest put

我最近看到许多框架决定"伪造"PUT和DELETE请求.就像Ruby on Rails一样.他们似乎在等待浏览器赶上来.他们在等待是徒劳的吗?

这甚至可以在任何地方实施吗?

Nic*_*nks 62

浏览器不支持PUTDELETE,但它的HTML是没有.

例如,浏览器将PUT通过Javascript(AJAX)发起请求,但不通过HTML <form>提交.

这是因为HTML 4.01和最终的W3C HTML 5.0规范都说它们的form元素应该允许的唯一HTTP方法是GET和POST.

在HTML 5的开发过程中对此进行了大量讨论,并且有一次他们被添加到HTML 5中,只是被删除了.从HTML 5规范中删除其他方法的原因是因为HTML 4级浏览器永远不会支持它们(在制作它们时不是HTML的一部分); 没有JavaScript垫片就没有办法允许他们这样做; 因此,您也可以使用AJAX.

网页尝试使用与形式method="PUT"method="DELETE"回落到默认的方法,GET目前所有的浏览器.这打破了Web应用程序尝试在HTML表单中使用适当的方法进行预期操作,并最终导致更糟糕的结果 -  GET用于删除内容!(你好爬虫.哦,哎呀!有我的数据库)

更改HTML <form>元素的默认方法POST会有所帮助(IMO默认应该一直是POST,自从1993年Moasic*首次出现以来),但更改默认值至少需要十年时间才能通过已安装的基础进行渗透.所以用两个词来说:'因为遗产'.:-(

为了支持当前的浏览器,作者必须使用覆盖来伪造它.我建议作者通过在HTML中加入广泛使用的a,b _method参数<input type=hidden name=_method value=DELETE>; 切换表单方法POST(因为请求是不安全的); 然后_method在服务器端添加识别,然后应该做任何必要的变更请求并转发它,好像它是一个真正的DELETE请求.

另请注意,由于Web浏览器是最终的HATEOAS客户端,因此需要将新状态转移给它们以进行DELETE请求.现有的API通常会返回204 No Content此类请求.您应该发送带有链接的超媒体响应,以便用户可以改进其浏览器状态.

另请参阅这些相似/相同问题的答案:


*Marc Andreessen创建的Mosiac也引入了<img src=…>标签的复合错误- 应该是<image source=…>fallback</image>.