使用 Slim v4.1 请求参数为空

Request parameters are empty using Slim v4.1

我正在使用 Slim v4 来制作一些小的 arduino 组件 API。当我对我的控制器进行 POST 调用时,我得到一个空的请求正文,没有我发送给它的参数。

在下面的代码中,在 $parameters 变量中我有一个 NULL。

public function __invoke(
    ServerRequestInterface $request,
    ResponseInterface $response
) : ResponseInterface {
    $ret = [
        'success'   => false
    ];

    $parameters = (array) $request->getParsedBody();
}

我正在使用 postman 执行 CURL 请求,但是当我在 bash 中使用 curl 时也会出现此错误。

下面的代码是我注册新的 API 电话的方式。

$application = AppFactory::create();

$application->group('/ambient', function(RouteCollectorProxy $routeCollector) {
    $routeCollector
        ->post('/register', RegisterAmbientController::class)
        ->setName('register-ambient');
});

你也可以在我的github中看到完整的代码: https://github.com/JasterTDC/ardu-component/tree/feature/register-temp-humidity

提前致谢!

Slim 4 不会自动解析正文,除非它是基于表单的 POST 请求。如果您的有效负载是 JSON 或 XML 在 POST 或 PUT 中,那么您将需要一些主体解析中间件。

BodyParsingMiddleware 添加了 Slim 4 yesterday

最简单的使用方法是在创建 $app 实例后添加 $app->addBodyParsingMiddleware();。像这样的东西有效:

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Slim\Factory\AppFactory;
use Slim\Middleware\BodyParsingMiddleware;
use Slim\Psr7\Response;

$app = AppFactory::create();
$app->addBodyParsingMiddleware();

$app->post('/data', function (ServerRequestInterface $request): ResponseInterface {
    $data = $request->getParsedBody();

    $response = new Response();
    $response->getBody()->write(
        print_r($data, true)
    );
    return $response;
});

$app->run();

但是请注意,您需要在 composer.json 中使用 dev-4.x 或等待 4.1 之后的下一个次要版本。