如何在HTML中发送PUT/DELETE请求?

13

我正在使用PHP制作REST API,我知道可以通过$_SERVER['REQUEST_METHOD']获取请求方法。

但是,在浏览器中如何触发PUT / DELETE请求?

我无法想象更改表单标记的方法属性以指定除GET或POST之外的方法将在所有浏览器上起作用...此外,HTML标准不予承认。

谢谢。


当你说“在PHP中”时,这意味着你想要在服务器端进行请求,这就是我的回答方式。然而,你后来关于浏览器和HTML的陈述暗示你想从客户端进行操作,你能澄清一下吗? - Tim Sylvester
1
其实我根本不应该提到 PHP。 我只是希望我的客户端(无论是浏览器还是其他什么)能够使用 HTML 通过 HTTP 以 PUT 或 DELETE 的方式传输数据,而不仅仅是 GET 和 POST。 - Housni
那会有点改变整个问题..... 所以你的“php标签”是误导性的,很可能会限制你的受众。你可能需要重新发布并更具体地描述你想要实现什么。 - ChronoFish
4个回答

6
通常这是通过一个隐藏的表单字段来完成的,并在应用程序中处理(大多数情况下不是由web服务器处理)。
<input type="hidden" name="_method" value="put" />

因此,在这种情况下,您需要使用一组简单的if-else语句来确定_method变量是否被覆盖(当然是有效的)。我会使用类似以下的代码:

$method = 'get';
if($_SERVER['REQUEST_METHOD'] == 'POST') {
  if(isset($_POST['_method']
     && ($_POST['_method'] == 'PUT' || $_POST['_method'] == 'DELETE')) {
    $method = strtolower($_POST['_method']);
  } else {
    $method = 'post';
  }
}

这是一种简单的方法来确定你的应用程序或框架的请求类型。

这也是我想到的...Rails的方式。但这在很大程度上依赖于约定。如果某人编辑模板时没有添加,REST将无法工作。但这似乎也是我能找到的唯一解决方案。 希望不是这样 :) - Housni
1
不,不要这样!将这种代码放入框架中,并使其对代码可访问:这样视图就不会做任何事情,方法已经确定。 - Robert K

1

fopen 可以处理 HTTP 请求,但我认为它只能处理 GET 请求。如果你使用 fsockopen,你需要自己处理 HTTP 协议,生成头文件等。

你可以使用 HTTPRequest(在 php_http 扩展中)或 PEAR

更新:

如果你真的是想要向你的 PHP 脚本发送 PUT/DELETE 请求,而不是从它们那里接收请求,那么这个问题可能会有所帮助:

大多数 Web 浏览器是否支持 PUT、DELETE、HEAD 等方法?


我实际上正在查看 HTTPRequest。 我正在尝试想象如何实现 PUT。 我会有一个包含数据的 HTML 表单。 在提交时,我不明白如何触发 PUT,以便我的表单处理程序将其处理为 PUT。 您能帮忙解释一下吗? 谢谢。 - Housni
@Housni 假设浏览器支持PUT,这意味着HTML/JS具有指定PUT请求正文内容的能力。目前,在可移植的方式下,您可以做的最好的事情是进行POST。如果您使用method="PUT",我认为浏览器可能会将请求视为POST,并且表单字段将被“multipart/form-data”编码,因此PUT的正文将是“field1=value&field1=value&...”。我相信您可以通过JavaScript XMLHTTPRequest使用任意数据来使用PUT/DELETE,尽管我没有尝试过。 - Tim Sylvester

0

如果你想使用PHP内置函数,但不想使用cURL,那么你基本上只能使用fsockopen()等函数,

或者最好使用围绕这些函数构建的库,比如Snoopy


-1
你可能想要查看WebDav(PHP WebDav幻灯片)。它被构建为PUSH、DELETE等操作... 当然,你所针对的服务器需要接受PUSH和DELETE请求,这意味着Apache正在使用mod_webdav或类似的东西。否则,将需要一个更低级别的解决方案(正如其他人所指出的)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接