binsoul/net-http-request

扩展 ServerRequest 类和请求工厂

dev-master / 1.0.x-dev 2016-04-26 21:24 UTC

This package is auto-updated.

Last update: 2024-09-14 21:44:43 UTC


README

Latest Version on Packagist Software License Total Downloads

此包提供了一个 Request 类,它扩展了 PSR-7 ServerRequest 类,并增加了头部和角色对象,简化了对属性、查询和表单提交参数的访问。

包含的 RequestFactory 类可以从 PHP 超全局变量或给定数据自动构建请求。它使用在 binsoul/net-http-message-bridge 中定义的工厂接口来构建 URI 和流。通常由负载均衡器或代理设置的头部用于构建请求。

安装

通过 composer

$ composer require binsoul/net-http-request

用法

从 PHP 超全局变量构建请求

<?php

use BinSoul\Bridge\Http\Message\DefaultStreamFactory;
use BinSoul\Bridge\Http\Message\DefaultUriFactory;
use BinSoul\Net\Http\Request\RequestFactory;

require 'vendor/autoload.php';

$factory = new RequestFactory(new DefaultUriFactory(), new DefaultStreamFactory());
$request = $factory->buildFromEnvironment();

从提供的数据构建请求

<?php

use BinSoul\Bridge\Http\Message\DefaultStreamFactory;
use BinSoul\Bridge\Http\Message\DefaultUriFactory;
use BinSoul\Bridge\Http\Message\Stream as HttpStream;
use BinSoul\IO\Stream\Type\MemoryStream;
use BinSoul\Net\Http\Request\RequestFactory;

require 'vendor/autoload.php';

$stream = new HttpStream(new MemoryStream(), 'r+');
$stream->write('Hello world!');

$factory = new RequestFactory(new DefaultUriFactory(), new DefaultStreamFactory());
$request = $factory->buildFromData($stream, $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES);

echo (string) $request->getBody(); // Hello world!

使用来自 league/uri 的 URI 实现

<?php

use BinSoul\Bridge\Http\Message\DefaultStreamFactory;
use BinSoul\Bridge\Http\Message\UriFactory;
use BinSoul\Net\Http\Request\RequestFactory;
use League\Uri\Schemes\Http as HttpUri;

require 'vendor/autoload.php';

class LeagueUriFactory implements UriFactory
{
    public function build($uri)
    {
        return HttpUri::createFromString($uri);
    }
}

$factory = new RequestFactory(new LeagueUriFactory(), new DefaultStreamFactory());
$request = $factory->buildFromEnvironment();

示例

输出一个包含当前请求信息的 HTML 页面

<?php

use BinSoul\Bridge\Http\Message\DefaultStreamFactory;
use BinSoul\Bridge\Http\Message\DefaultUriFactory;
use BinSoul\Net\Http\Request\RequestFactory;

require 'vendor/autoload.php';

$factory = new RequestFactory(new DefaultUriFactory(), new DefaultStreamFactory());
$request = $factory->buildFromEnvironment();

// Roles
$client = $request->getClient();
$server = $request->getServer();

// Headers
$userAgent = $request->getUserAgent();
$cacheControl = $request->getCacheControl();
$acceptMediaType = $request->getAcceptMediaType();
$acceptEncoding = $request->getAcceptEncoding();
$acceptLanguage = $request->getAcceptLanguage();
$acceptCharset = $request->getAcceptCharset();

// make var_export HTML friendly
function dump($value) {
    return htmlentities(preg_replace("/\s+=>\s+/m", ' => ', var_export($value, true)));
}

?>

<!DOCTYPE html>
<html>
<head>
    <style type="text/css">
        h1 { font-size: 150%; margin: 1em 0 0.25em 0; border-bottom: 1px solid #888;}
        td { vertical-align: top; padding: 2px 6px; }
        td:first-child {white-space: nowrap;}
    </style>
</head>
<body>
<h1>Request</h1>
<table>
    <tr>
        <td>protocol:</td>
        <td>HTTP/<?= $request->getProtocolVersion() ?></td>
    </tr>
    <tr>
        <td>method:</td>
        <td><?= $request->getMethod() ?></td>
    </tr>
    <tr>
        <td>URI:</td>
        <td><?= $request->getUri() ?></td>
    </tr>
    <tr>
        <td>query:</td>
        <td>
            <pre><?= dump($request->getQueryParams()) ?></pre>
        </td>
    </tr>
    <tr>
        <td>post:</td>
        <td>
            <pre><?= dump($request->getParsedBody()) ?></pre>
        </td>
    </tr>
    <tr>
        <td>files:</td>
        <td>
            <pre><?= dump($request->getUploadedFiles()) ?></pre>
        </td>
    </tr>
    <tr>
        <td>headers:</td>
        <td>
            <pre><?= dump($request->getHeaders()) ?></pre>
        </td>
    </tr>
    <tr>
        <td>Is SSL?</td>
        <td><?= $request->isSSL() ? 'yes' : 'no' ?></td>
    </tr>
    <tr>
        <td>Is DNT?</td>
        <td><?= $request->isDoNotTrack() ? 'yes' : 'no' ?></td>
    </tr>
    <tr>
        <td>Is Javascript?</td>
        <td><?= $request->isJavascript() ? 'yes' : 'no' ?></td>
    </tr>
</table>

<h1>Server</h1>
<table>
    <tr>
        <td>IP:</td>
        <td><?= $server->getIP() ?></td>
    </tr>
    <tr>
        <td>port:</td>
        <td><?= $server->getPort() ?></td>
    </tr>
</table>

<h1>Client</h1>
<table>
    <tr>
        <td>IP:</td>
        <td><?= $client->getIP() ?></td>
    </tr>
    <tr>
        <td>port:</td>
        <td><?= $client->getPort() ?></td>
    </tr>
    <tr>
        <td>Is headless?</td>
        <td><?= $client->isHeadless() ? 'yes' : 'no' ?></td>
    </tr>
</table>

<h1>User-Agent</h1>
<table>
    <tr>
        <td>browser:</td>
        <td><?= $userAgent->getBrowser() ?></td>
    </tr>
    <tr>
        <td>platform:</td>
        <td><?= $userAgent->getPlatform() ?></td>
    </tr>
    <tr>
        <td>device:</td>
        <td><?= $userAgent->getDeviceType() ?></td>
    </tr>
    <tr>
        <td>Is bot?</td>
        <td><?= $userAgent->isBot() ? 'yes' : 'no' ?></td>
    </tr>
</table>

<h1>Cache-Control</h1>
<table>
    <tr>
        <td>Has max-age?</td>
        <td><?= $cacheControl->hasMaxAge() ? 'yes' : 'no' ?></td>
    </tr>
    <tr>
        <td>max-age:</td>
        <td><?= $cacheControl->getMaxAge() ?></td>
    </tr>
    <tr>
        <td>Is refresh?</td>
        <td><?= $cacheControl->isRefresh() ? 'yes' : 'no' ?></td>
    </tr>
    <tr>
        <td>Is reload?</td>
        <td><?= $cacheControl->isReload() ? 'yes' : 'no' ?></td>
    </tr>
</table>

<h1>Accept</h1>
<ol>
    <?php foreach ($acceptMediaType->getMediaTypes() as $mediaType): ?>
        <li><?= $mediaType ?></li>
    <?php endforeach; ?>
</ol>

<h1>Accept-Encoding</h1>
<ol>
    <?php foreach ($acceptEncoding->getEncodings() as $encoding) : ?>
        <li><?= $encoding ?></li>
    <?php endforeach; ?>
</ol>

<h1>Accept-Language</h1>
<ol>
    <?php foreach ($acceptLanguage->getLanguages() as $language): ?>
        <li><?= $language ?></li>
    <?php endforeach; ?>
</ol>

<h1>Accept-Charset</h1>
<ol>
    <?php foreach ($acceptCharset->getCharsets() as $charset): ?>
        <li><?= $charset ?></li>
    <?php endforeach; ?>
</ol>
</body>
</html>

测试

$ composer test

许可证

MIT 许可证 (MIT)。请参阅 许可证文件 了解更多信息。