dejan7 / httpquest
PHP 多重填充用于 HTTP 请求解析
Requires
- php: >=5.6.0
Requires (Dev)
- phpunit/phpunit: 5.5.*
This package is not auto-updated.
Last update: 2024-09-14 19:53:03 UTC
README
HTTPQuest
HTTPQuest 是一个轻量级的 PHP 多重填充,可以解析任何 HTTP 动词的请求数据。
##问题:PHP 默认仅解析 GET 和 POST 请求的数据,并将它们放入已知的 $_GET
、$_POST
和 $_FILES
变量。此外,它仅针对 multipart/form-data
和 application/x-www-form-urlencoded
编码类型(Content-type HTTP 头)进行解析。
因此,如果您尝试使用纯 PHP(不使用框架)构建一个使用其他 HTTP 动词(如 PUT 或 PATCH)的 REST API,这将变得非常痛苦。此包试图通过为您执行无聊的解析来解决这个问题,并将请求数据提供给任何类型的请求。
##安装方法: composer require dejan7/httpquest:0.3.0
##使用方法:实例化该类,并在应用程序的早期某个位置调用 decode
方法(例如,在启动过程中)。
$HTTPQuest = new \HTTPQuest\HTTPQuest();
$HTTPQuest->decode($_POST, $_FILES);
就这样,您的解析数据现在将存储在传递给 decode
方法的变量中(在这种情况下为 $_POST
和 $_FILES
)。
PHP 默认以下情况会将内容放入 $_POST
和 $_FILES
- POST:内容类型
application/x-www-form-urlencoded
multipart/form-data
HTTPQuest 增强了这一点,您可以将它配置为解析任何方法/内容类型的组合。默认选项设置为以下内容
- POST:内容类型
application/json
- PUT:内容类型
application/x-www-form-urlencoded
multipart/form-data
application/json
- PATCH:内容类型
application/x-www-form-urlencoded
multipart/form-data
application/json
但是,您可以通过向构造函数传递 HTTPQuestOptions
实例来更改默认设置,如下所示
include __DIR__ . "/../vendor/autoload.php";
use HTTPQuest\HTTPQuestOptions;
use HTTPQuest\Requests;
use HTTPQuest\ContentTypes;
$opts = new HTTPQuestOptions();
$opts->forMethod(Requests::GET)
->parse(ContentTypes::X_WWW_FORM_URLENCODED);
$opts->forMethod(Requests::PATCH)
->parse(ContentTypes::FORMDATA)
->parse(ContentTypes::JSON);
$HTTPQuest = new \HTTPQuest\HTTPQuest(
$_SERVER,
"php://input",
$opts
);
等等!你在告诉我它甚至可以解析 GET 请求的请求体吗? 那是正确的。现在您是否将利用这些场景——我将选择权留给您。您可以在 StackOverflow 上阅读一些讨论,并自己决定 http://stackoverflow.com/questions/978061/http-get-with-request-body http://stackoverflow.com/questions/299628/is-an-entity-body-allowed-for-an-http-delete-request
##文件 HTTPQuest 还解析来自请求数据的文件,并尽可能模仿 PHP 的默认行为,使用 $_FILES
。然而,唯一的缺点是您不能在除 POST 请求以外的请求上使用 move_uploaded_file
PHP 函数。在其他请求上,move_uploaded_file
会认为文件没有使用 PHP 上传,并且不会执行。解决方案是使用 copy
,如下所示
$HTTPQuest = new \HTTPQuest\HTTPQuest();
$HTTPQuest->decode($_POST, $_FILES);
copy($_FILES["myfile"]["tmp_name"], "/some/dir" . $_FILES["myfile"]["name"]);
##致谢 Russel 为 sndsgd/http,HTTPQuest 使用了他 multipart/form-data 解码逻辑。
##许可证 这是一个开源软件,许可协议为 MIT 协议。