【问题标题】:How do I send a PUT/DELETE request in HTML?如何在 HTML 中发送 PUT/DELETE 请求?
【发布时间】:2021-03-01 20:42:48
【问题描述】:

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

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

我无法想象更改表单标记的方法属性以指定除 GET 或 POST 之外的方法将适用于所有浏览器......而且 HTML 标准无法识别它。

谢谢。

【问题讨论】:

  • 当您说“在 PHP 中”时,这意味着您想要在服务器端执行请求,这就是我的回答。您后来关于浏览器和 HTML 的陈述暗示您想从客户端执行此操作,但是……您能澄清一下吗?
  • 其实我根本不应该提到 PHP。我只希望我的客户端,无论是网络浏览器还是你有什么,使用 HTML 通过 HTTP 作为 PUT 或 DELETE 传输数据,而不仅仅是 GET 和 POST。
  • 那种改变了整个问题.....所以你的“php标签”会误导并可能会限制你的听众。您可能想重新发布并更详细地描述您要完成的工作。

标签: html forms rest


【解决方案1】:

这通常由隐藏的表单字段完成,并在应用程序中处理(不是网络服务器,总的来说)。

<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 将不起作用。但这似乎也是我能找到的唯一解决方案。说不是这样:)
  • 不,不!把这种代码放到framework中,让代码可以访问:这样view就什么都不做,方法已经确定了。
【解决方案2】:

fopen 会做 HTTP,但我相信它只会做 GET 请求。如果使用fsockopen,则需要自己处理HTTP协议,生成标头等。

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

更新:

如果您真的在谈论向您的 PHP 脚本发出 PUT/DELETE 请求,而不是 来自它们,那么这个问题可能会引起您的兴趣:

Are the PUT, DELETE, HEAD, etc methods available in most web browsers?

【讨论】:

  • 我实际上是在看 HTTPRequest。我试图想象我将如何实现 PUT。我会有一个 HTML 表单,其中的数据已经存在于字段中。提交时,我不明白如何触发 PUT,以便我的表单处理程序将其作为 PUT 处理。你能解释一下吗?谢谢。
  • @Housni 假设浏览器支持 PUT 意味着它有能力让 HTML/JS 准确指定 PUT 请求正文中的内容。目前,您能以便携方式做的最好的事情就是进行 POST。如果您使用method="PUT",我怀疑浏览器可能会将请求完全视为 POST,这意味着表单字段将被“multipart/form-data”编码,因此 PUT 的正文将是“field1=value&field1=value&。 ……”。我相信您可以通过 JavaScript XMLHTTPRequest 对任意数据使用 PUT/DELETE,尽管我没有尝试过。
【解决方案3】:

如果你想使用 PHP 的内置函数,而不是 cURL,你几乎会被 fsockopen() 等卡住,

或者充其量是围绕这些函数构建的库,例如 Snoopy

【讨论】:

    【解决方案4】:

    您可能想看看 WebDav (PHP WebDav slide show)。它是为 PUSH、DELETE 等而构建的……当然,您所针对的服务器需要接受 PUSH 和 DELETE,这意味着 Apache 正在使用 mod_webdav 或类似的东西。否则将需要较低级别的解决方案(正如其他人所指出的那样)

    【讨论】:

      猜你喜欢
      • 2011-01-10
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 2013-06-09
      • 2018-04-09
      相关资源
      最近更新 更多