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

2022-06-13 00:00:00 php slim

我将Slim v4用于一个小的Arduino组件API。当我在我的控制器上执行POST调用时,我得到一个空的请求正文,没有我发送给它的参数。

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

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');
});

您还可以在My GitHub中查看完整代码: https://github.com/JasterTDC/ardu-component/tree/feature/register-temp-humidity

提前谢谢!


解决方案

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

BodyParsingMiddleware为超薄4添加了yesterday。

使用它的最简单方法是在创建$app实例后添加$app->addBodyParsingMiddleware();。类似这样的工作方式:

use PsrHttpMessageResponseInterface;
use PsrHttpMessageServerRequestInterface;
use SlimFactoryAppFactory;
use SlimMiddlewareBodyParsingMiddleware;
use SlimPsr7Response;

$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之后的下一个次要版本。

相关文章