PHP解析PUT请求

时间:2015-05-31 04:47:57

标签: php regex ember-data put http-request

我花了好几个小时试图让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一起使用,它是我能想到的最好的。

谢谢!

1 个答案:

答案 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特性。