pdeans / http
支持PSR-17 HTTP工厂的PSR-7 cURL HTTP客户端。
v2.0.3
2024-05-24 16:15 UTC
Requires
- php: ^8.1
- ext-curl: *
- laminas/laminas-diactoros: ^3.0
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请求方法。
GET
、HEAD
和 TRACE
方法接受以下参数
- 目标URL的字符串表示 或 实现 PSR-7
Psr\Http\Message\UriInterface
的类实例。 - 包含头信息的关联数组
[headerName => headerValue]
。
POST
、PUT
、PATCH
、OPTIONS
和 DELETE
方法接受上述两个参数,以及可选的第三个参数用于请求正文
- 请求正文数据的字符串 或 实现 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();
进一步阅读
由于这个库是在现有库和标准之上构建的层,建议您阅读这些库和标准的文档,以更好地理解各个组件的工作方式。