regex — PHP-анализ PUT-запроса

Я часами пытался заставить 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

Решение

Как отметил @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.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]