【问题标题】:php API server does not receive $_POST [duplicate]php API 服务器没有收到 $_POST [重复]
【发布时间】:2021-10-31 18:21:14
【问题描述】:

所以一些背景知识 - 我决定将一个旧的 PHP MVC 项目拆分为一个 React 前端和 php 后端“服务器”。对于开发 - 两者都在本地托管,两者都配置在不同的 apache 根目录上,并在 /etc/hosts 中添加了一些虚拟主机 (api.loc/exp.loc)。 所谓的“API 服务器”使用 MVC 路由,它获取请求 /foo/bar 并启动 FooController->barAction()。

对于 API,我首先通过 fetch API 发送 POST 请求,然后通过 axios,两者都失败了,我发现(使用 xDebug 并打印 $_POST 作为响应),PHP 没有收到 $_POST。无 - 空数组。 我尝试使用 RESTClient 插件为 firefox 触发 POST 请求到“服务器”,我得到了相同的结果。

为了解决这个问题,经过一些研究,我在 index.php 文件中添加了以下标头,但老实说,我并不能 100% 确定它们的确切作用。

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
header('Access-Control-Allow-Headers: Content-Type');
header('Content-Type: application/json');

玩这些几乎没有任何区别。 这就是路由的完成方式(index.php):

$router = new Core\Router();

$url = $_SERVER['REQUEST_URI'];
$router->dispatch($url);

路由器.php

    public function dispatch($url)
    {
        $route = $this->extractRoute($url);
        $controller = 'Application\Controllers\\' . $this->convertToStudlyCaps($route['controller']);
        $action = $this->convertToCamelCase($route['action']);
        $params = $route['params'];
        $params = count($params) > 0 ? $this->processParams($route['params']) : null;
        if (class_exists($controller)) {
            $Controller = new $controller();
            $callableAction = $action.'Action';
            if (is_callable([$Controller, $callableAction])) {
                $Controller->$callableAction($params);
            } else {
                echo json_encode("Invalid method [ {$action} ] specified");
            }
        } else {
            echo json_encode("Invalid controller specified: [ {$controller} ]");
        }
    }

    public function extractRoute($url)
    {
        $urlArray = explode('/', $url);

        $result = [];
        $result['controller'] = (array_key_exists(1, $urlArray) && $urlArray[1] !== '') ? $urlArray[1] : 'Index';
        $result['action'] = (array_key_exists(2, $urlArray) && $urlArray[2] !== '') ? $urlArray[2] : 'index';
        $result['params'] = array_slice($urlArray, 3);

        return $result;
    }

请求到达控制器,但如上所述 - 没有可用的 $_POST。 $_GET 只接收'url' => '{urlpath}',不管我是否使用$_GET。

我已经检查了 php.ini post_max_size = 8M

所以经过一番搜索 - 我找到了一个解决方法,我可以使用 $_POST 数据提取

$data = file_get_contents('php://input');

我真正需要帮助的是了解原因。我不明白为什么没有 $_POST。我显然缺乏对确切问题的了解,如果有人能指出我正确的方向,我将不胜感激。 提前谢谢!

【问题讨论】:

  • 您添加的标头用于 response 问题在于 request 发送与 PHP POST 方法不兼容的 Content-Type 标头,这就是它的原因仅在 php://input 中找到

标签: php api rest


【解决方案1】:

为了填充$_POST,PHP 支持 HTML 表单支持的数据格式。即application/x-www-form-urlencodedmultipart/form-data

【讨论】:

  • 那是我不知道的有趣的事情!刚刚使用application/x-www-form-urlencoded 发送的RESTClient 进行了测试,数据在$_POST 中。看来我需要阅读有关构建 API 的更多信息...感谢您的输入!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多