Не удается получить данные JSON POST, отправленные через Slim

Я использую Postman (в Chrome) для тестирования вызовов Slim, но не могу понять, как получить какие-либо опубликованные данные JSON.

Я отправляю необработанный JSON:

{"name":"John Smith", "age":"30", "gender":"male"}

С Content-Type: application/json в заголовке

через POST на:

http://domain/api/v1/users/post/test/

Каждая попытка получить данные JSON дает фатальную ошибку (см. комментарии к коду ниже)

<?php
require 'vendor/autoload.php';
$app = new \Slim\Slim();
$app->add(new \Slim\Middleware\ContentTypes());


$app->group('/api/v1', function () use ($app) {

    $app->group('/users/post', function () use ($app) {

        $app->post('/test/', function () {

                print_r($app->request->headers); //no errors, but no output?

                echo "Hello!"; // outputs just fine

        $data = $app->request()->params('name'); //Fatal error: Call to a member function request() on a non-object
                $data = $app->request->getBody(); //Fatal error: Call to a member function getBody() on a non-object
                $data = $app->request->post('name'); //Fatal error: Call to a member function post() on a non-object
                $data = $app->request()->post(); //Fatal error: Call to a member function request() on a non-object

                print_r($data);
                echo $data;

        });

    });

});

$app->run();
?>

Что мне не хватает?

Спасибо!


person Ahhk    schedule 02.12.2013    source источник
comment
Попробуйте var_dump($app), где появляется первая неустранимая ошибка. Возможно, попробуйте использовать $this вместо $app.   -  person jshawl    schedule 02.12.2013
comment
var_dump($app) возвращает NULL   -  person Ahhk    schedule 02.12.2013
comment
$this-›request()-›getBody(); = Фатальная ошибка: использование $this вне контекста объекта   -  person Ahhk    schedule 02.12.2013


Ответы (4)


Обязательно добавьте $app к последнему вложенному маршруту, например:

// Pass through $app
$app->post('/test/', function () use ($app) {

Вы делаете это везде, так что я предполагаю, что вы просто проглядели это.

person Jeremy Kendall    schedule 02.12.2013
comment
Спасибо, но документы Slim используются только ($app) в группах, а не в фактических маршрутах: docs .slimframework.com/#Группы маршрутов - person Ahhk; 02.12.2013
comment
Это потому, что примеры не используют $app в этих маршрутах. Вы каррируете только то, что вам действительно нужно. Здесь мы говорим о требованиях к языку PHP, а не о требованиях Slim: замыкания также могут наследовать переменные из родительской области. Любые такие переменные должны быть переданы в языковую конструкцию использования. us1.php.net/manual/en/functions.anonymous.php - person Jeremy Kendall; 02.12.2013
comment
Оно работает! Спасибо! Но, господи. Это, вероятно, 10-я проблема, с которой я столкнулся, потому что в документах есть неточный код/информация. - person Ahhk; 02.12.2013
comment
@Ahhk: Плохая документация может быть очень неприятной, но в этом случае автор предполагал некоторое знание анонимных функций PHP. В других 9 случаях было бы здорово, если бы у вас было время и желание, если бы вы открыли проблему с репозиторием документации: github.com/codeguy/Slim-Documentation/issues - person Jeremy Kendall; 02.12.2013
comment
Я новичок в Slim/REST, поэтому я просто использовал примеры и особо их не анализировал. Другой пример: документация показывает код для добавления промежуточного ПО как $app-›add(new Slim_Middleware_ContentTypes()). Это не работает. Должно быть так, как у меня выше (после долгих поисков и выдергивания волос). :) - person Ahhk; 02.12.2013
comment
Где вы это видите в документах, @Ahhk? Я не могу найти это нигде. - person Jeremy Kendall; 02.12.2013
comment
Кстати, нужно ли добавлять использование ($app) на любые маршруты, которым я передаю данные JSON? В противном случае, если все данные определены в маршруте... тогда мне это не нужно. Верно? - person Ahhk; 02.12.2013
comment
1. Будьте осторожны с использованием постов двухлетней давности в качестве документации. Проверяйте все по docs.slimframework.com. 2. Вам нужно use ($app) везде, где вам нужен доступ к $app в анонимной функции. Если вам нужно позвонить $app->something, то вам нужно добавить use ($app). - person Jeremy Kendall; 02.12.2013
comment
Переменная @Ahhk scope - это то, что вы должны понять здесь. $app не имеет ничего общего с передачей JSON и т. д., это просто переменная, к которой вы хотите получить доступ внутри функции, а функции не могут получить доступ к переменным за пределами своей области, если они не переданы через ключевые слова use() или global . - person Charlie Schliesser; 24.01.2014

вы должны получить тело из запроса:

$приложение->запрос->getBody();

http://docs.slimframework.com/request/body/

person Antonio Romero Oca    schedule 07.05.2015

В Slim 3 я использовал значение body в данных POST curl, и это не сработало, чтобы исправить это, я использовал это, тело является объектом, а не строкой:

$app->post('/proxy', function($request, $response) {
    $data = $request->getBody()->getContents();
    $response->getBody()->write(post('http://example.com', $data));
});

Дополнительные методы для тела можно найти в документах.

person jcubic    schedule 09.11.2017

Попробуй это:

$app->post('/test/', function () use ($app){
        instead of print_r($app->request->headers);
        $ar=$app->request->getbody(); 

       to get an array so try following..
        $arry=json_decode($ar,true);

    });
person M pal    schedule 16.06.2016