Reputation: 29
I'm testing Slim Framework 4 and I can't seem to be able to retrieve any data when I'm submiting a JSON via POST, using the getParsedBody method, it always results in NULL. Here is my endpoint:
<?php
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
$app->post('/prueba', function (Request $request, Response $response, $args) {
$data = $request->getParsedBody();
$response->getBody()->write(json_encode($data));
return $response->withHeader('Content-Type', 'application/json')
->withStatus(200);
});
Following some docs I've added the BodyParsing Middleware:
<?php
use Dotenv\Dotenv;
use Slim\Views\Twig;
use Slim\Factory\AppFactory;
use Slim\Views\TwigExtension;
use Slim\Psr7\Factory\UriFactory;
use Dotenv\Exception\InvalidPathException;
require_once __DIR__ . '/../vendor/autoload.php';
try {
(new Dotenv(__DIR__ . '/../'))->load();
} catch (InvalidPathException $e) {
//
}
$container = new DI\Container();
AppFactory::setContainer($container);
$app = AppFactory::create();
$app->addBodyParsingMiddleware();
$app->addRoutingMiddleware();
$app->addErrorMiddleware(true, true, true);
$container->set('settings', function () {
return [
'app' => [
'name' => getenv('APP_NAME')
],
'db' => [
'driver' => getenv('DB_DRIVER'),
'host' => getenv('DB_HOST'),
'database' => getenv('DB_NAME'),
'username' => getenv('DB_USER'),
'password' => getenv('DB_PASS'),
'charset' => getenv('DB_CHARSET'),
'collation' => getenv('DB_COLLATION'),
'prefix' => ''
]
];
});
$capsule = new \Illuminate\Database\Capsule\Manager();
$capsule->addConnection($container->get('settings')['db']);
$capsule->setAsGlobal();
$capsule->bootEloquent();
$container->set('view', function ($container) use ($app) {
$twig = new Twig(__DIR__ . '/../resources/views', [
'cache' => false
]);
$twig->addExtension(
new TwigExtension(
$app->getRouteCollector()->getRouteParser(),
(new UriFactory)->createFromGlobals($_SERVER),
'/'
)
);
return $twig;
});
require_once __DIR__ . '/../routes/api.php';
This is the request I'm sending:
curl --location --request POST 'http://localhost:80/prueba' \
--header 'Content-type: application/json' \
--data-raw '{"name": "Rob", "country": "UK"}'
I've debuged a little and verified that the middleware is processing the request but up until now I can't get it to return anything else than null. Also looked over and there doesn't seem to be any reported issue with a definitive solutions.
Upvotes: 1
Views: 955
Reputation: 29
Nevermind, It was a problem caused by a deficient skeleton, using the oficial skeleton from slim everything was solved
Upvotes: 0