php - 捕获传入的请求数据

标签 php routes request thephpleague

我一直在尝试当前版本的精彩软件包 routing来自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);

我的问题是当我发送 POST 时请求 JSON数据,我无法在代码中捕获它,如行 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
        );
    }
);

哪里

  1. $request->getHeaders() 为您提供请求 header
  2. $request->getParsedBody() 将在设置 header Content-Type: multipart/form-data 时以数组形式返回所有发送的数据(至少就我的实验而言)
  3. $request->getQueryParams() 将所有查询字符串参数作为数组给出,就像 $_GET
  4. $request->getUploadedFiles() 将所有上传的文件作为 Laminas\Diactoros\UploadedFile 实例数组给出
  5. $request->getBody()->getContents() 当设置 header Content-Type: application/json 时,将以字符串形式返回所有数据。然后,您可以运行 json_decode($request->getBody()->getContents(), true) 来获取数组的实际内容

关于php - 捕获传入的请求数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66778721/

相关文章:

Ember.js - 如何在组件 View 中渲染默认导出

php - 为什么 Symfony 2.8 服务中的请求对象是空的?

node.js - 无法使用 Node 请求模块在 Linux 上读取 LinkedIn 内容

php - JSON解析android中共享首选项期间出错

php - Codeigniter数据库配置

php - 在 CPanel 上安装 PDO_MYSQL PHP 扩展?

php - 如何使用 Yii 创建带有确认对话框的链接?

routes - 如何在 ASP.NET Core Web API 中重载具有相同数量参数的 Controller 方法?

java - 判断三个点是否在同一条街道上

request - 如何知道 Kohana 请求是否是内部请求?