dejan7/httpquest

此包最新版本(0.3.0)没有提供许可证信息。

PHP 多重填充用于 HTTP 请求解析

0.3.0 2016-09-20 13:55 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:53:03 UTC


README

Build Status Coverage Status

HTTPQuest

HTTPQuest 是一个轻量级的 PHP 多重填充,可以解析任何 HTTP 动词的请求数据。

##问题:PHP 默认仅解析 GET 和 POST 请求的数据,并将它们放入已知的 $_GET$_POST$_FILES 变量。此外,它仅针对 multipart/form-dataapplication/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"]);

##致谢 Russelsndsgd/http,HTTPQuest 使用了他 multipart/form-data 解码逻辑。

##许可证 这是一个开源软件,许可协议为 MIT 协议