pdeans/http

支持PSR-17 HTTP工厂的PSR-7 cURL HTTP客户端。

v2.0.3 2024-05-24 16:15 UTC

This package is auto-updated.

Last update: 2024-09-24 16:56:58 UTC


README

轻量级 PSR-7 HTTP消息接口 cURL客户端,支持 PSR-17 HTTP工厂接口

安装

通过 Composer 安装。

composer require pdeans/http

使用方法

cURL客户端基于 Laminas Diactoros PSR-7和PSR-17实现。

配置客户端

客户端接受一个可选的关联数组作为第一个参数,用于配置cURL选项。请注意,以下cURL选项不能设置,以符合PSR-7标准。相反,这些选项应作为请求选项的一部分提供。

  • CURLOPT_CUSTOMREQUEST
  • CURLOPT_FOLLOWLOCATION
  • CURLOPT_HEADER
  • CURLOPT_HTTP_VERSION
  • CURLOPT_HTTPHEADER
  • CURLOPT_NOBODY
  • CURLOPT_POSTFIELDS
  • CURLOPT_RETURNTRANSFER
  • CURLOPT_URL
  • CURLOPT_USERPWD

以下是如何创建和配置客户端的示例

use pdeans\Http\Client;

$client = new Client();

// With options
$client = new Client([
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_SSL_VERIFYHOST => true,
]);

HTTP请求

客户端包含辅助方法,以提供方便地发出支持的HTTP请求方法。

GETHEADTRACE 方法接受以下参数

  • 目标URL的字符串表示 实现 PSR-7 Psr\Http\Message\UriInterface 的类实例。
  • 包含头信息的关联数组 [headerName => headerValue]

POSTPUTPATCHOPTIONSDELETE 方法接受上述两个参数,以及可选的第三个参数用于请求正文

  • 请求正文数据的字符串 实现 PSR-7 Psr\Http\Message\StreamInterface 的类实例 资源。

请求使用方法

// GET request with header
$response = $client->get('https://example.com/1', ['custom-header' => 'header/value']);

// GET request without header
$response = $client->get('https://example.com/2');

// HEAD request
$response = $client->head('https://example.com/2');

// TRACE request
$response = $client->trace('https://example.com/2');

$headers = [
    'Content-Type'  => 'application/json',
    'Accept'        => 'application/json',
    'Authorization' => 'Basic ' . base64_encode('username:password'),
];

$data = json_encode(['json' => 'json data']);

// POST request with headers and request body
$response = $client->post('https://example.com/4', $headers, $data);

// PUT request
$response = $client->put('https://example.com/4', $headers, $data);

// PATCH request
$response = $client->patch('https://example.com/4', $headers, $data);

// OPTIONS request
$response = $client->options('https://example.com/4', $headers, $data);

// DELETE request
$response = $client->delete('https://example.com/4', $headers, $data);

如果需要更多对请求的控制,可以绕过辅助方法,直接调用 sendRequest 方法。此方法接受一个实现 PSR-7 Psr\Http\Message\RequestInterface 的类实例。

使用 RequestFactory 类实例的示例 GET 请求

use pdeans\Http\Factories\RequestFactory;

$request = (new RequestFactory())->createRequest('GET', 'https://example.com/1');

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

使用 Request 类实例的示例 POST 请求

use pdeans\Http\Request;

$request = new Request(
    uri: 'https://example.com',
    method: 'POST',
    headers: ['Content-Type' => 'application/json'],
    body: $client->getStream(json_encode(['json' => 'json data']))
);

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

HTTP响应

每个HTTP请求返回一个 pdeans\Http\Response 类实例,这是PSR-7 Psr\Http\Message\ResponseInterface 的实现。

响应使用方法

// Issue request
$response = $client->get('https://example.com/1', ['custom-header' => 'header/value']);

// Response body output
echo (string) $response->getBody();

// Response headers output
var_dump($response->getHeaders());
var_dump($response->getHeader('custom-header'));
var_dump($response->hasHeader('custom-header'));
echo $response->getHeaderLine('custom-header');

// Response status code output
echo $response->getStatusCode();

// Response reason phrase output
echo $response->getReasonPhrase();

PSR-17 工厂

以下HTTP工厂类可用,并且每个都实现了其关联的PSR-17工厂接口

  • pdeans\Http\Factories\RequestFactory 实现 Psr\Http\Message\RequestFactoryInterface
  • pdeans\Http\Factories\ResponseFactory 实现 Psr\Http\Message\ResponseFactoryInterface
  • pdeans\Http\Factories\ServerRequestFactory 实现 Psr\Http\Message\ServerRequestFactoryInterface
  • pdeans\Http\Factories\StreamFactory 实现 Psr\Http\Message\StreamFactoryInterface
  • pdeans\Http\Factories\UploadedFileFactory 实现 Psr\Http\Message\UploadedFileFactoryInterface
  • pdeans\Http\Factories\UriFactory 实现 Psr\Http\Message\UriFactoryInterface

工厂使用方法

use pdeans\Http\Factories\RequestFactory;
use pdeans\Http\Factories\ResponseFactory;
use pdeans\Http\Factories\ServerRequestFactory;
use pdeans\Http\Factories\StreamFactory;
use pdeans\Http\Factories\UploadedFileFactory;
use pdeans\Http\Factories\UriFactory;

// Psr\Http\Message\RequestFactoryInterface
$requestFactory = new RequestFactory();

// Psr\Http\Message\RequestInterface
$request = $requestFactory->createRequest('GET', 'https://example.com/1');

// Psr\Http\Message\ResponseFactoryInterface
$responseFactory = new ResponseFactory();

// Psr\Http\Message\ResponseInterface
$response = $responseFactory->createResponse();

// Psr\Http\Message\ServerRequestFactoryInterface
$serverRequestFactory = new ServerRequestFactory();

// Psr\Http\Message\ServerRequestInterface
$serverRequest = $serverRequestFactory->createServerRequest('GET', 'https://example.com/2');

// Psr\Http\Message\StreamFactoryInterface
$streamFactory = new StreamFactory();

// Psr\Http\Message\StreamInterface
$stream = $streamFactory->createStream();
$fileStream = $streamFactory->createStreamFromFile('dir/api.json');
$resourceStream = $streamFactory->createStreamFromResource(fopen('php://temp', 'r+'));

// Psr\Http\Message\UploadedFileFactoryInterface
$uploadedFileFactory = new UploadedFileFactory();

// Psr\Http\Message\UploadedFileInterface
$uploadedFile = $uploadedFileFactory->createUploadedFile($fileStream);

// Psr\Http\Message\UriFactoryInterface
$uriFactory = new UriFactory();

// Psr\Http\Message\UriInterface
$uri = $uriFactory->createUri();

进一步阅读

由于这个库是在现有库和标准之上构建的层,建议您阅读这些库和标准的文档,以更好地理解各个组件的工作方式。