php://输入更改URL不包括index.php时丢失数据

时间:2018-09-13 19:45:37

标签: php laravel api-design

因此,我正在构建一个自定义API端点,我需要将该端点从Laravel发送数据。我将需要大量的URL,并希望做到这一点尽可能干净,同时仍然必须从头开始而没有框架。

我正在尝试创建以下端点

/ api / categories / create /

现在,我可以将Guzzle发布到/api/categories/create/index.php并使用file_get_contents('php://input')获取内容了。而且我知道,当我删除index.php时,它仍会发布到正确的位置,因为我可以将“ Hello”发送回去,并且确实收到了它。

有点困惑,为什么file_get_contents('php://input')可以获取我正在发送的数据,但是只有当我在URL末尾显式指定index.php时。

这是我的要求,尽管我认为错误不是来自此...

$client = new Client([
    'base_uri' => 'http://example.test/'
]);

$course = [
    'title'       => $request->title,
    'description' => $request->description,
    'site'        => $request->site
];

$response = $client->post('api/categories/create', [
    'json' => ['course' => $course]
]);

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您需要添加一个.htaccess文件,该文件将index.php定义为单点访问。

重写模式应为(类似于)controller/method/id,例如:

<IfModule mod_rewrite.c>

    RewriteEngine On
    RewriteBase /

    # remove trailing slash
    RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/(.*)/(\d+)$ /index.php?controller=$1&method=$2&id=$3 [L,NC,QSA]

</IfModule>

随后是其他模式,这些模式在没有id且也没有method的情况下进行了重写(默认为索引)。

api/categories/create将需要类似的模式〜^(.*)/(.*)/(.*)$ /index.php?controller=$1&subject=$2&method=$3 [L,NC,QSA]。也可以像OR一样用逻辑^(.*)/(.*)/(create|read|update|destroy)(/|)$定义可能的值。