slick/http

Slick/Http是一个用于Web应用基础的实用库。它实现了PSR-7消息接口,并具有中间件服务器、会话处理和HTTP客户端。

v3.0.3 2022-04-04 17:07 UTC

README

Latest Version on Packagist Software License Quality Score Total Downloads

slick/http提供了PSR-7(HTTP消息接口)和PSR-18(HTTP客户端接口)的完整实现,使开发者能够以标准化的方式无缝地与HTTP消息和客户端协同工作。通过遵循这些PSR标准,该库确保与其他遵循相同规范的库和框架的互操作性,促进代码在项目中的重用和一致性。此外,该库还包括一个作为中间件运行器的HTTP服务器,允许您将一组中间件对象传递给服务器,它们将按顺序调用以生成当前服务器请求的响应。这种中间件方法提供了一种灵活、模块化的处理HTTP请求的方式,增强了PHP应用程序的可伸缩性和可维护性。

此包符合PSR-2代码标准和PSR-4自动加载标准。它还采用语义版本2.0.0规范。

安装

通过Composer

$ composer require slick/http

使用方法

服务器请求消息

这是一种方便的方法,可以获取包含客户端发送到服务器的所有必要信息的HTTP请求消息。

获取这个消息非常简单

use Slick\Http\Message\Server\Request;

$request = new Request();

$request封装了所有从CGI和/或PHP环境到达应用程序的数据,包括

  • 在$_SERVER中表示的值。
  • 提供的任何cookie(通常通过$_COOKIE)
  • 查询字符串参数(通常通过$_GET,或通过parse_str()解析)
  • 如果有,上传的文件(由$_FILES表示)
  • 反序列化的主体参数(通常来自$_POST)

考虑以下消息

POST /path?_goto=home HTTP/1.1
Host: www.example.org
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Lenght: 5
Authorization: Bearer PAOIPOI-ASD9POKQWEL-KQWELKAD==

foo=bar&bar=baz

现在让我们使用$request对象检索其信息

echo $request->getHeaderLine('Authorization');  // will print "Bearer PAOIPOI-ASD9POKQWEL-KQWELKAD=="

print_r($request->getParsedBody());
# Array (
#   [foo] => bar,
#   [bar] => baz
#)

print_r($request->getQueryParam());
# Array (
#   [_goto] => home
#)

HTTP服务器

HTTP服务器是一个中间件运行器。您可以向服务器传递一组中间件对象,它们将按顺序调用以生成当前服务器请求的响应。

让我们创建一个简单的Web应用程序,该应用程序将打印出名为'name'的查询参数的问候语。首先,让我们创建我们的中间件类

use Psr\Http\Server\MiddlewareInterface;
use Interop\Http\Server\RequestHandlerInterface;

class Greeting implements MiddlewareInterface
{
  
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler)
    {
        $params = $request->getQueryParams();
        $request = (isset($params['name'])
            ? $request->withAttribute('greeting', "Hello, {$params['name']}!")
            : $request;
        
        $response = $handler->handle($request);
        return $response;
    }
}

此中间件检索带有名称的查询参数并将一个属性添加到传递给下一个中间件的请求对象中。让我们创建我们的打印机

use Psr\Http\Server\MiddlewareInterface;
use Interop\Http\Server\RequestHandlerInterface;

class Printer implements MiddlewateInterface
{
  
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler)
    {
      $greeting = $request->getAttribute('greeting', false);
      $text = $greeting ?: 'Hi!';
      
      $response = $handler->handle($request);
      
      $response->getBody()->write($text);
      
      return $response;
    }
}

现在让我们创建我们的主要服务器应用程序

use Slick\Http\Server\MiddlewareStack;
use Slick\Http\Message\Response;
use Slick\Http\Message\Server\Request;

$stack = (new MiddlewareStack())
    ->push(new Greeting())
    ->push(new Printer())
    ->push(function () { return new Response(200); }); // Order matters!

$response = $stack->process(new Request);

// Emit headers iteratively:
foreach ($response->getHeaders() as $name => $values) {
    header(sprintf('%s: %s', $name, implode(', ', $value)), false);
}

// Print out the message body
echo $response->getBody();

HTTP客户端

在当今时代,使用HTTP请求(作为客户端)是最常见的任务之一。几乎每个应用程序都需要从Web服务或API检索数据,因此HTTP客户端是必不可少的。

Slick\Http\Client\CurlHttpClient实现了PSR-18 HTTP客户端

public function sendRequest(RequestInterface $request): ResponseInterface;

它依赖于PHP的cURL扩展来连接和执行HTTP请求。让我们看看一个例子

use Psr\Http\Message\ResponseInterface;
use Slick\Http\Client\CurlHttpClient;
use Slick\Http\Message\Request;
use Slick\Http\Message\Uri;

$request = new Request('GET', new Uri('https://example.com'));
$client = new CurlHttpClient();

$response = $client->sendRequest($request);

$data = json_decode($response->getBody()->getContents());

会话

Slick\Http\Session具有非常简单且易于实现的实现。默认情况下,它将使用PHP会话处理,并提供了一个简单的工厂,您可以使用它来创建会话

use Slick\Http\Session;

$session = Session::create();
写入会话数据
$session->set('foo', 'bar');
读取会话数据
$session->read('foo', null); // if foo is not found the default (null) will be returned.
删除会话数据
$session->erase('foo');

如果您需要加密数据或更改保存处理程序以将数据保存到数据库中,可以简单地通过实现Slick\Http\Session\SessionDriverInterface来创建自己的会话驱动程序。它还附带了一个具有所有基本操作的Slick\Http\Session\Driver\AbstractDriver类。

请参阅文档站点以获取完整参考。

变更日志

请参阅CHANGELOG以获取有关最近更改的更多信息。

测试

$ composer test

贡献

请参阅CONTRIBUTINGCODE_OF_CONDUCT以获取详细信息。

安全

如果您发现任何与安全相关的问题,请通过电子邮件[email protected]报告,而不是使用问题跟踪器。

致谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件