Не удается получить тело из запроса PUT с помощью Slim Framework

Я пытаюсь получить параметры из запроса PUT, используя структуру Slim. Когда параметры синтаксического анализа формируют тело POST, я могу просто использовать $request->post('param') для получения значения в параметре. Однако, когда я использую $request->put('param'), я всегда получаю null.

Мое тело PUT формируется следующим образом: param=value&otherparam=othervalue&foo=bar...

P.S.: я уже просмотрел этот вопрос, но в ответе не использовался метод put() .


person MechMK1    schedule 17.01.2014    source источник
comment
Пожалуйста, добавьте свой маршрут PUT и объясните, как вы делаете запрос PUT. Если это через форму, пожалуйста, поделитесь формой.   -  person Jeremy Kendall    schedule 18.01.2014
comment
Мой маршрут — /api/post/:id (например, /post/id/2). Я отправляю запрос через Fiddler в настоящее время, а затем через приложение для Android.   -  person MechMK1    schedule 18.01.2014


Ответы (1)


Вы получаете null обратно от $request->put('param'), потому что пытаетесь вызвать его по маршруту POST. Вам нужно будет создать отдельный маршрут PUT (или использовать map и via), прежде чем вы сможете получить параметр PUT.

Кроме того, я не рекомендую добавлять в маршрут команду HTTP. Это приводит к некоторой действительно запутанной архитектуре.

Добавление дополнительного маршрута:

$app->post('/api/something/:id', function () {});
$app->put('/api/something/:id', function () {});

Использование Пользовательских методов HTTP (map и via)

$app->map('/api/something/:id', function () {})->via('POST', 'PUT');

См. PUT документацию по маршрутизации и уделите особое внимание разделу "Переопределение метода".

ОБНОВЛЕНИЕ: рабочий пример

Вот пример запроса PUT, который я сделал на скорую руку:

$app->put('/test/:id', function ($id) use ($app) {
    $name = $app->request->put('name');
    echo sprintf('PUT request for resource id %d, name "%s"', (int) $id, $name);
});

Я вызываю его с помощью cURL из командной строки следующим образом:

curl -X PUT -d name=arthur http://slim-tutorial.dev/test/2

Результат:

PUT request for resource id 2, name "arthur"%

Если у вас есть работающее приложение Slim, а описанное выше не работает для вас, вероятно, проблема находится где-то за пределами Slim, возможно, в том, как вы тестируете, или в опечатке в вашем маршруте или параметрах теста.

person Jeremy Kendall    schedule 18.01.2014
comment
«Пост» в маршруте совпадает с HTTP-глаголом. На самом деле это «сообщение» на доске объявлений. - person MechMK1; 19.01.2014
comment
На самом деле, я вызываю правильный маршрут с помощью PUT, и я проверил свой код до этого момента. $request->is_Put() вернул true, поэтому моя единственная проблема - получить параметр из тела - person MechMK1; 19.01.2014
comment
А, пост на доске объявлений. Понятно! Итак, вы получаете PUT, но не получаете никаких параметров. См. мой обновленный пример выше и попробуйте протестировать его с помощью curl, как это сделал я. - person Jeremy Kendall; 19.01.2014
comment
Круто, это сработало. Должна быть ошибка в Fiddler, так как curl работает нормально - person MechMK1; 20.01.2014