koded/http

Koded HTTP 组件。实现了 PSR-7、PSR-17 和 PSR-18

3.1.1 2022-01-25 11:14 UTC

This package is auto-updated.

Last update: 2024-09-17 11:30:05 UTC


README

Latest Stable Version Build Status Code Coverage Scrutinizer Code Quality Packagist Downloads Minimum PHP Version Software license

Koded HTTP 库实现了 PSR-7 (HTTP 消息), PSR-17 (HTTP 工厂) 和 PSR-18 (HTTP 客户端)。

为了使项目中的方法更有用,请求和响应实例扩展了 额外接口

ServerRequest

class ServerRequest extends ClientRequest implements Request {}

此对象表示 传入的服务器端 HTTP 请求。

ClientRequest

class ClientRequest implements RequestInterface, JsonSerializable {}

此对象是 传出的客户端 HTTP 请求的表示。

ServerResponse

class ServerResponse implements Response, JsonSerializable {}

此对象表示 传出的服务器端 响应。

UploadedFile

此值对象表示通过 HTTP 请求上传的文件。

HTTP 工厂

PSR-17 (HTTP 工厂) 的实现。

<?php

use Koded\Http\HttpFactory;

$httpFactory = new HttpFactory;

$clientRequest = $httpFactory->createRequest('GET', '/');
$serverRequest = $httpFactory->createServerRequest('GET', '/');

$response = $httpFactory->createResponse(201);

$stream = $httpFactory->createStream('Hello there');
$stream = $httpFactory->createStreamFromFile('file.name', '+w');
$stream = $httpFactory->createStreamFromResource($resource);

$uri = $httpFactory->createUri('/');

$uploadedFile = $httpFactory->createUploadedFile($stream);

HTTP 客户端

有 2 个 ClientRequest 接口的实现

  • PHP 流
  • curl

要创建 HTTP 客户端的实例,请使用 Koded\Http\Client\ClientFactory

<?php

use Koded\Http\Client\ClientFactory;

$http = new ClientFactory(ClientFactory::CURL); // or ClientFactory::PHP

$http->get('/', $headers);
$http->post('/', $body, $headers);
$http->put('/', $body, $headers);
$http->patch('/', $body, $headers);
$http->delete('/', $headers);
$http->head('/', $headers);

$headers 是可选的。

HTTP 客户端 (PSR-18)

PSR-18 (HTTP 客户端) 的实现。

<?php

use Koded\Http\Client\ClientFactory;
use Koded\Http\ClientRequest;

$request = new ClientRequest('POST', 'https://...', ['foo' => 'bar']);
$response = (new ClientFactory)->sendRequest($request);

额外接口

Additional interfaces

  • Koded\Http\Request
  • Koded\Http\Response

这两个接口在您的项目中可能很有用,因为它们为请求/响应对象的状态提供了额外的功能。

请求

  • getPath(): string
  • getBaseUri(): string
  • withAttributes(array $attributes): Request
  • isSecure(): bool
  • isSafeMethod(): bool
  • isXHR(): bool

响应

  • getContentType(): string

ExtendedMessageInterface

请求和响应都扩展了这个接口,因此提供了额外的功能

  • withHeaders(array $headers): static
  • replaceHeaders(array $headers): static
  • getFlattenedHeaders(): array
  • getCanonicalizedHeaders(array $names = []): string

HttpInputValidator

这里的想法是有一个基本的机制来验证传入的请求数据。验证是通过调用 Request::validate(HttpInputValidator $validator) 方法在 HttpInputValidator 实例中完成的。

HttpInputValidator::validate() 应返回 array,在以下情况下

  • 空数组,验证成功
  • 一个哈希表 (['key' => 'value', ...]),包含有关验证失败的信息

错误处理由应用程序完成。一个简单的例子

class FormValidator implements HttpInputValidator {

    public function validate(Data $input): array {
        if (empty($input->get('username'))) {
            return ['message' => 'Username is required'];
        }
       return []; 
    }
}

// Somewhere in your app, use the `Request` object to run validation

if ($response = $request->validate(new FormValidator)) {
    // {"message":"Username is required","status":400}
    return $response;
}

错误响应将始终在错误消息中设置状态码 (status 值)。
如果验证中没有提供状态码,则默认为 400 Bad Request

许可证

代码是在 3 条款 BSD 许可证 的条款下分发的。