Php 为什么我的$请求[';请求';]变量未定义(当访问API的端点时)
我按照教程使用PHP创建了一个RESTful API 我正在localhost上运行该项目,但是在尝试查看教程(api/v1/example)中建议的端点时,出现以下错误: (注意:请参见下面的api.php文件。) 这个请求索引应该在htaccess文件中设置,所以我认为这就是问题所在。(如果这件事很简单,我很抱歉,但我一直在努力寻找自己,但没有运气。)你能帮忙吗 在本教程中,我们创建:Php 为什么我的$请求[';请求';]变量未定义(当访问API的端点时),php,.htaccess,rest,Php,.htaccess,Rest,我按照教程使用PHP创建了一个RESTful API 我正在localhost上运行该项目,但是在尝试查看教程(api/v1/example)中建议的端点时,出现以下错误: (注意:请参见下面的api.php文件。) 这个请求索引应该在htaccess文件中设置,所以我认为这就是问题所在。(如果这件事很简单,我很抱歉,但我一直在努力寻找自己,但没有运气。)你能帮忙吗 在本教程中,我们创建: htaccess文件,用于配置web服务器应如何处理对项目目录中文件的请求 一个抽象类,用于处理URI的解
重新启动发动机
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写规则api/v1/(*)$api/v1/api.php?请求=$1[QSA,NC,L]
抽象类
混凝土类
api.php
$\u REQUEST
是客户端发送的请求变量数组。密钥请求
不保证存在于该数组中。正在尝试使用调试器或var\u dump
显示数组的内容
如果您用发送的请求更新您的问题,可能有人会进一步指导您。$\u request
是客户端发送的请求变量数组。密钥请求
不保证存在于该数组中。正在尝试使用调试器或var\u dump
显示数组的内容
如果您用发送请求更新您的问题,可能有人会进一步指导您。阅读.htaccess文件时,您需要一个更像这样的层次结构:
API
├── api
│ └── v1
│ └── api.php
└── .htaccess
其中API当前是文档根目录的子文件夹(将来可能会将API设置为文档根目录或相应地移动文件)
API/.htaccess
的内容:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule api/v1/(.*)$ api/v1/api.php?request=$1 [QSA,NC,L]
API/API/v1/API.php的内容(检查重写是否有效):
应重写为api.php文件(通过重写规则),并且api.php应输出:
array(1) { ["request"]=> string(3) "foo" }
读取.htaccess文件时,您需要一个更像这样的层次结构:
API
├── api
│ └── v1
│ └── api.php
└── .htaccess
其中API当前是文档根目录的子文件夹(将来可能会将API设置为文档根目录或相应地移动文件)
API/.htaccess
的内容:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule api/v1/(.*)$ api/v1/api.php?request=$1 [QSA,NC,L]
API/API/v1/API.php的内容(检查重写是否有效):
应重写为api.php文件(通过重写规则),并且api.php应输出:
array(1) { ["request"]=> string(3) "foo" }
您是否在发送请求时发送请求变量?如果您访问api/v1/foo
它是否有效?@Progrock我刚刚尝试过。它给出了相同的错误。您的文件路径与.htaccess重写规则路径不同。您的文件层次结构是什么?您的.htaccess文件放在哪里?@Progrock我有一个名为API的项目文件夹,我的所有文件都在根级别(.htaccess、API.php、API.class.php和MyAPI.class.php)。然后我访问这个端点:你在发送请求时发送请求变量吗?如果你访问api/v1/foo
它能工作吗?@Progrock我刚刚试过了。它给出了相同的错误。您的文件路径与.htaccess重写规则路径不同。您的文件层次结构是什么?您的.htaccess文件放在哪里?@Progrock我有一个名为API的项目文件夹,我的所有文件都在根级别(.htaccess、API.php、API.class.php和MyAPI.class.php)。然后我访问了这个端点:谢谢。我对这个过程的理解是,请求变量是在htaccess文件中设置的:(RewriteRule api/v1/(.*)$api/v1/api.php?request=$1[QSA,NC,L]),应该包含完整的URL,然后将在抽象api.class的构造函数中解析,正如您在构造函数的这一行中所看到的:$this->args=explode('/',rtrim)($request,“/”);…我们的想法是从URI字符串中检索端点。我输出了$_request变量,但它是空的……您认为是我的htaccess没有正确执行重写吗?谢谢。我对该过程的理解是,请求变量设置在htaccess文件中:(RewriteRule api/v1/(*)$api/v1/api.php?request=$1[QSA,NC,L]),应该包含完整的URL,然后将在抽象api.class的构造函数中解析,正如您在构造函数的这一行中看到的:$this->args=explode('/',rtrim($request,'/'))…想法是从URI字符串中检索端点。我输出了$_请求变量,它是空的…您认为是我的htaccess没有正确执行重写吗?谢谢。从您的回答中得到启发,我没有更改文件结构。我只是更改了.htaccess文件,如下所示:RewriteEngine OnRewriteRule(.*)$api.php?request=$1[QSA,NC,L]现在可以工作了(在访问或时设置请求变量)。如您所见,我还取出了两行RewriteCond,因为它们不允许RewriteRule继续。感谢您的帮助。是的,您可以这样做。我会保留另外两行,这对我来说很好。谢谢。受您回答的启发,我没有更改文件结构。我只是更改了.htaccess文件,如下所示:RewriteRule(.*)$api.php?request=$1[QSA,NC,L]上的RewriteEngine正在运行(在访问或时设置请求变量).正如你所看到的,我还取出了两行RewriteCond,因为它们不允许RewriteRule继续。谢谢你的帮助。是的,你可以这样做。我会保留另外两行,这对我来说很好。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule api/v1/(.*)$ api/v1/api.php?request=$1 [QSA,NC,L]
<?php
var_dump($_REQUEST);
example.com/API/api/v1/foo
array(1) { ["request"]=> string(3) "foo" }