Я часами пытался заставить 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
это лучшее, что я мог придумать.
Спасибо!
Как отметил @zedfoxus, это ответ: http://www.chlab.ch/blog/archives/php/manually-parse-raw-http-data-php
Но @steveax предложил просто создать специальный адаптер Ember Data, чтобы вообще не использовать PUT: http://emberjs.com/api/data/classes/DS.Adapter.html#method_updateRecord
Оба — отличные ответы. Я думаю, что я попробую решение на стороне сервера, потому что мне нравится RESTful природа GET / POST / PUT / DELETE.
Других решений пока нет …