根据内容类型自动解析 HTTP 请求

面向 PHP 5 版本 1.6.0 的 Slim 框架(当前位于开发分支)引入了新的中间件,它将根据 HTTP 请求正文的内容类型自动解析该正文。此中间件将解析 JSON、XML 或 CSV 内容类型的 HTTP 请求。如要启用此中间件,请执行以下操作

$app = new Slim();
$app->add(new Slim_Middleware_ContentTypes());

将 Slim_Middleware_ContentTypes 中间件添加到 Slim 应用程序后,请求对象的正文属性将得到适当解析。不过,您始终可以在 Slim 应用程序的环境数组中使用键 slim.input_original 获取原始未解析的请求正文。

JSON 请求

此中间件将把 JSON 请求正文解析成一个关联数组。想象一下,您向以下 POST 路由发送了一个 HTTP 请求。请求正文是 {"name":"John","email":"[email protected]"}

$app->post('/book', function () use ($app) {
    $body = $app->request()->getBody();
}

在此示例中,$body 变量将等于 array('name' => 'John', 'email' => '[email protected]')

XML 请求

此中间件将把 XML 请求正文解析成一个 SimpleXMLElement 实例(如果 SimpleXML 扩展可用);否则,正文将保持为一个字符串。想象一下,您向以上 POST 路由发送了一个 HTTP 请求。HTTP 请求正文是

<book>
    <id>1</id>
    <title>Sahara</title>
    <author>Clive Cussler</author>
</book>

$body 变量将是 SimpleXMLElement 的一个实例;您可以用 $body->id$body->title$body->author 获取 POST 方式提交的书本属性。

CSV 请求

此中间件将把 CSV 请求正文解析成一个数组或多个数组。想象一下,您向以上 POST 路由发送了一个 HTTP 请求。HTTP 请求正文是

$body 变量将是这样的一个数组

array(
    array('Doe','John','[email protected]'),
    array('Doe','Jane','[email protected]')
);

自定义内容类型

如果您要解析的 HTTP 请求正文不是 JSON、XML 或 CSV,您可以使用中间件的可选第二个参数向此中间件提供自己的解析函数。您需要知道传入 HTTP 请求的内容类型,并且您需要准备一个可调用的项来解析请求正文。用于解析 HTTP 请求正文的可调用项应接受一个字符串参数并返回适当的 PHP 数据结构。

想象一下,我们希望上述 POST 路由接受一个具有 HTML 正文的 HTTP 请求。我们这样指示 Slim_Middleware_ContentTypes 中间件解析这些请求

function parseHtml( $rawBody ) {
    $dom = new DOMDocument();
    $dom->loadHTML($rawBody);
    return $dom;
};
$app = new Slim();
$app->add(new Slim_Middleware_ContentTypes(array(
    'text/html' => 'parseHtml'
)));

假如我们继续使用上面定义的 POST 路由,$body 变量将成为表示 HTTP 请求 body 中提供的 HTML 的 DOMDocument 实例。您定义的自定义解析函数将与默认解析函数(通过内容类型进行键控)合并。在此示例中,Slim_Middleware_ContentTypes 中间件现在将解析具有 JSON、XML、CSV 或 HTML 内容类型的 HTTP 请求。

如果您想要覆盖 JSON 请求的默认解析函数,为内容类型 application/json 定义一个新的解析器;那么将使用您自己的解析器,而不是默认解析器。