我花了好几个小时试图让PHP将PUT请求解析为键/值对。
请求来自Ember Data,类型为form-data
,我无法改变(据我所知,Ember Data不允许这样做)。我不想安装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
之后,我计划循环遍历它们并将所有内容合并到具有所有正确键/值对的$ _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
一起使用,它是我能想到的最好的。
谢谢!
答案 0 :(得分:-1)
正如@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特性。