binsoul / net-http-request
扩展 ServerRequest 类和请求工厂
dev-master / 1.0.x-dev
2016-04-26 21:24 UTC
Requires
- php: ^7.0
- binsoul/common: ~1.0@dev
- binsoul/io-stream: ~1.0@dev
- binsoul/net: ~1.0@dev
- binsoul/net-http-message-bridge: ~1.0@dev
- binsoul/net-http-message-message: ~1.0@dev
Requires (Dev)
- fabpot/php-cs-fixer: ^1.0
- phpunit/phpunit: ^5.0
Suggests
- mobiledetect/mobiledetectlib: For better device type detection (including tablets)
This package is auto-updated.
Last update: 2024-09-14 21:44:43 UTC
README
此包提供了一个 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)。请参阅 许可证文件 了解更多信息。