捕获传入的请求数据
Capture incoming request data
我一直在为 routing from thephpleague.
试用当前版本的精彩包
我有一个简单的索引页面来处理路由,它工作得很好。
<?php declare(strict_types=1);
use Laminas\Diactoros\ServerRequestFactory;
use Laminas\HttpHandlerRunner\Emitter\SapiEmitter;
use Laminas\Diactoros\ResponseFactory;
use League\Route\Router;
use League\Route\Strategy\JsonStrategy;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
$strategy = new JsonStrategy(new ResponseFactory());
$router = new Router;
$router->setStrategy($strategy);
$router->post(
'/hello',
function (ServerRequestInterface $request): ResponseInterface
{
var_dump($request->getParsedBody());
}
);
$request = ServerRequestFactory::fromGlobals(
$_SERVER,
$_GET,
$_POST,
$_COOKIE,
$_FILES
);
$response = $router->dispatch($request);
// send the response to the browser
(new SapiEmitter)->emit($response);
我的问题是当我发送一个包含 JSON
数据的 POST
请求时,我无法在我的代码中捕获它,如行 var_dump($request->getParsedBody());
.
目前,我能够捕获随请求发送的数据的唯一方法是 运行 json_decode(file_get_contents('php://input'), true);
.
我需要做什么才能让负载随任何请求一起发送,无论是 GET
、POST
、PUT
、PATCH
还是其他请求?
谢谢。
我终于明白了。经过仔细检查,我认为使用 dependency injection,ServerRequestInterface
映射到 Laminas\Diactoros\ServerRequest
。
所以,为了说明
$router->post(
'/hello',
function (ServerRequestInterface $request): ResponseInterface {
var_dump(
$request->getHeaders(),
$request->getParsedBody(),
$request->getQueryParams(),
$request->getUploadedFiles(),
$request->getBody()->getContents(),
$request // Laminas\Diactoros\ServerRequest
);
}
);
哪里
$request->getHeaders()
给你请求 headers
$request->getParsedBody()
将 return 设置为 header Content-Type: multipart/form-data
时作为数组发送的所有数据(至少就我所试验的而言)
$request->getQueryParams()
将所有查询字符串参数作为数组提供,就像 $_GET
$request->getUploadedFiles()
将所有上传的文件作为 Laminas\Diactoros\UploadedFile
的实例数组
$request->getBody()->getContents()
将 return 设置为 header Content-Type: application/json
时作为字符串的所有数据。然后你可以 运行 json_decode($request->getBody()->getContents(), true)
得到数组的实际内容
我一直在为 routing from thephpleague.
试用当前版本的精彩包我有一个简单的索引页面来处理路由,它工作得很好。
<?php declare(strict_types=1);
use Laminas\Diactoros\ServerRequestFactory;
use Laminas\HttpHandlerRunner\Emitter\SapiEmitter;
use Laminas\Diactoros\ResponseFactory;
use League\Route\Router;
use League\Route\Strategy\JsonStrategy;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
$strategy = new JsonStrategy(new ResponseFactory());
$router = new Router;
$router->setStrategy($strategy);
$router->post(
'/hello',
function (ServerRequestInterface $request): ResponseInterface
{
var_dump($request->getParsedBody());
}
);
$request = ServerRequestFactory::fromGlobals(
$_SERVER,
$_GET,
$_POST,
$_COOKIE,
$_FILES
);
$response = $router->dispatch($request);
// send the response to the browser
(new SapiEmitter)->emit($response);
我的问题是当我发送一个包含 JSON
数据的 POST
请求时,我无法在我的代码中捕获它,如行 var_dump($request->getParsedBody());
.
目前,我能够捕获随请求发送的数据的唯一方法是 运行 json_decode(file_get_contents('php://input'), true);
.
我需要做什么才能让负载随任何请求一起发送,无论是 GET
、POST
、PUT
、PATCH
还是其他请求?
谢谢。
我终于明白了。经过仔细检查,我认为使用 dependency injection,ServerRequestInterface
映射到 Laminas\Diactoros\ServerRequest
。
所以,为了说明
$router->post(
'/hello',
function (ServerRequestInterface $request): ResponseInterface {
var_dump(
$request->getHeaders(),
$request->getParsedBody(),
$request->getQueryParams(),
$request->getUploadedFiles(),
$request->getBody()->getContents(),
$request // Laminas\Diactoros\ServerRequest
);
}
);
哪里
$request->getHeaders()
给你请求 headers$request->getParsedBody()
将 return 设置为 headerContent-Type: multipart/form-data
时作为数组发送的所有数据(至少就我所试验的而言)$request->getQueryParams()
将所有查询字符串参数作为数组提供,就像$_GET
$request->getUploadedFiles()
将所有上传的文件作为Laminas\Diactoros\UploadedFile
的实例数组
$request->getBody()->getContents()
将 return 设置为 headerContent-Type: application/json
时作为字符串的所有数据。然后你可以 运行json_decode($request->getBody()->getContents(), true)
得到数组的实际内容