PHP 解析 PUT 请求

PHP parse PUT request

我花了几个小时试图让 PHP 将 PUT 请求解析为 key/value 对。

请求来自 Ember 数据,类型为 form-data,我无法更改(据我所知,Ember 数据不允许这样做).我不想安装 PHP 扩展(限制我的托管选项)或使用 PHP 框架。

因此,使用 Postman,请求如下所示:

------WebKitFormBoundarytb5fqcjpCsLTsDjp
Content-Disposition: form-data; name="phone_number"

1234567
------WebKitFormBoundarytb5fqcjpCsLTsDjp
Content-Disposition: form-data; name="legal_name"

Drew Baker
------WebKitFormBoundarytb5fqcjpCsLTsDjp
Content-Disposition: form-data; name="first_name"

Drew
------WebKitFormBoundarytb5fqcjpCsLTsDjp
Content-Disposition: form-data; name="last_name"

Baker
------WebKitFormBoundarytb5fqcjpCsLTsDjp--

我不知道其他浏览器会是什么样子。我假设它看起来会有所不同。

目前我能做的最好的是:

$input = file_get_contents('php://input');
$patten = '';
preg_match_all($patten, $input, $matches);

我想不出一个更接近的模式。但我认为理想情况下它会像这样搜索:

name=" 然后 ---

之间的所有内容

如果你们认为 form-data 在其他浏览器上的结构不同,也许可以使用更好的模式。

在我 $matches 回来后,我计划遍历它们并将所有内容合并到具有所有正确 key/value 对的 $_REQUEST 超全局中,如下所示:

$put_vars = array(
   'phone_number'   => '1234567',
   'legal_name'     => 'Drew Baker',
   'first_name'     => 'Drew',
   'last_name'      => 'Baker'
);
$_REQUEST = array_merge($_REQUEST, $put_vars);

我的计划是将其作为高级函数添加到我的代码中,类似于 parse_put_vars_into_request。但理想情况下,它也适用于 DELETE 和其他 HTTP 方法。

我知道正则表达式不是解决这个问题的理想方法,但考虑到它需要与 form-data 一起使用,这是我能想到的最好的方法。

谢谢!

正如@zedfoxus 指出的那样,这就是答案:http://www.chlab.ch/blog/archives/php/manually-parse-raw-http-data-php

但@steveax 建议只制作自定义 Ember 数据适配器以避免完全使用 PUT:http://emberjs.com/api/data/classes/DS.Adapter.html#method_updateRecord

两个都是很好的答案。我想我会尝试服务器端解决方案,因为我喜欢 GET/POST/PUT/DELETE.

的 RESTful 性质