devuri / http
制作HTTP请求的简单灵活实用工具。
Requires
- php: ^7.4 || ^8.0
- devuri/dot-access: ^0.3
Requires (Dev)
- 10up/phpcs-composer: dev-master
- phpstan/phpstan: ^1.8
- phpstan/phpstan-strict-rules: ^1.3
- phpunit/phpunit: ^9.5
- symfony/var-dumper: ^5.4
- vimeo/psalm: ^4.24 || ^5.0
This package is auto-updated.
Last update: 2024-09-17 23:02:26 UTC
README
HttpClient
是一个为PHP应用程序内方便地制作HTTP请求而设计的PHP组件。它提供了一个简单灵活的工具,用于制作HTTP请求。这是与PHP应用程序中RESTful API交互的基本直接方式。
特性
- 灵活的HTTP请求:支持GET和POST请求。
- 可定制的用户代理:可以轻松配置预置列表中的用户代理或设置自定义的。
- API密钥支持:集成对API密钥认证的支持。
- 设置引用:可以设置HTTP引用头。
- 超时配置:为HTTP请求设置自定义超时。
- 异常处理:在HTTP请求期间捕获并处理异常,提供回退和错误信息。
要求
- PHP 7.4或更高版本。
- Composer用于依赖管理。
安装
要安装HttpClient
,您需要在您的计算机上安装Composer。在您的项目目录中运行以下命令
composer require devuri/http
使用方法
基本使用
<?php require_once 'vendor/autoload.php'; use Urisoft\HttpClient; // Initialize HttpClient with the base URL of the API $client = new HttpClient('https://api.example.com'); // Perform a GET request $response = $client->get('/data'); print_r($response); // Perform a POST request $postData = ['key' => 'value']; $response = $client->post('/submit', $postData); print_r($response);
设置自定义用户代理
$client->set_user_agent('Mozilla/5.0 (compatible; CustomBot/1.0)');
设置引用
$client->set_referrer('https://referrer.example.com');
配置
HttpClient
构造函数接受一个选项数组进行配置
user_agent
: 设置默认用户代理(键名:'moz'
、'chrome'
、'safari'
或任何自定义字符串)。api_key
: 设置需要认证的请求的API密钥。timeout
: 设置HTTP请求的超时时间。
设置自定义配置的示例
$options = [ 'user_agent' => 'safari', 'api_key' => 'your_api_key_here', 'timeout' => 30, // in seconds ]; $client = new HttpClient('https://api.example.com', $options);
示例
以下是一些具体的示例,展示了如何使用HttpClient
类执行各种常见任务,例如从API获取数据、发送数据、设置自定义头,以及处理响应。
从API获取数据
使用GET请求获取数据
<?php require_once 'vendor/autoload.php'; use Urisoft\HttpClient; // Initialize the client with the base URL $client = new HttpClient('https://jsonplaceholder.typicode.com'); // Fetch posts from an API $response = $client->get('/posts'); print_r($response);
此示例从占位符API获取帖子列表并打印结果。
使用POST请求发送数据
使用POST请求将数据发送到API
$client = new HttpClient('https://jsonplaceholder.typicode.com'); // Data to be sent $data = ['title' => 'foo', 'body' => 'bar', 'userId' => 1]; // Send data $response = $client->post('/posts', $data); print_r($response);
此代码将数据发送到在占位符API上创建新帖,并输出API的响应。
设置自定义头
为请求设置自定义头
$client = new HttpClient('https://api.example.com'); // Custom headers $headers = [ 'Content-Type: application/json', 'Custom-Header: value' ]; // Perform a GET request with custom headers $response = $client->get('/endpoint', $headers); print_r($response);
此示例展示了如何在GET请求中包含自定义头,这对于需要特定头的API很有用。
处理响应和错误
$client = new HttpClient('https://api.example.com'); try { $response = $client->get('/data'); if ($response['status'] !== 200) { throw new Exception('Failed to fetch data: ' . $response['message']); } echo "Data fetched successfully:\n"; print_r($response); } catch (Exception $e) { echo "Error: " . $e->getMessage(); }
此示例演示了如何优雅地处理应用程序中的响应和错误。它检查状态码,如果请求未成功则抛出异常,从而实现健壮的错误处理。
组合参数和选项
您还可以组合各种参数和选项,如设置引用、用户代理和API密钥。
$options = [ 'user_agent' => 'safari', 'api_key' => 'your_secure_api_key', 'timeout' => 20 ]; $client = new HttpClient('https://api.example.com', $options); $client->set_referrer('https://referrer.example.com'); $response = $client->post('/submit', ['data' => 'value']); print_r($response);
此配置显示了更复杂的设置,其中配置了多个选项,以根据特定需求定制HTTP客户端的行为。
错误处理
异常在内部被捕获,但建议在应用程序逻辑中处理潜在的错误或异常,尤其是在关键操作中。
HttpClient
通过返回状态码和错误信息来处理连接错误。以下是如何处理错误的示例
if ($response['status'] !== 200) { echo "Error: " . $response['message']; } else { echo "Success: " . $response['message']; }
处理响应
HttpClient
使用PHP的file_get_contents
函数进行HTTP请求,并提供了详细的响应处理,包括HTTP状态码和错误消息。请求的响应通常包括状态码、消息和服务器返回的任何头。
响应数组结构
当使用HttpClient
类进行HTTP请求时,get
或post
等方法返回的响应将是一个包含与HTTP响应相关的各种信息的关联数组。以下是关于可能包含在此响应数组中的内容的解释,后跟一个详细示例。
响应数组的常见组件
- status:服务器返回的HTTP状态码。这是一个整数(例如,200表示成功请求,404表示找不到错误等)。
- message:与HTTP状态码相关联的状态信息(例如,200为“OK”,404为“Not Found”)。
- response:从服务器接收到的完整响应头作为数组。
- code:状态的副本,为了方便而包含。
- referrer:如果在请求期间设置了,则表示引用URL。
- http:一个包含从响应头第一行提取的协议版本、状态码和文本状态信息的数组。
响应数组的示例
以下是一个示例,说明在向API端点发起GET请求后,响应数组可能看起来像什么。
$response = $client->get('/api/data'); print_r($response);
假设请求成功,输出可能看起来像这样
Array
(
[status] => 200
[message] => OK
[response] => Array
(
[0] => HTTP/1.1 200 OK
[Content-Type] => application/json; charset=utf-8
[Content-Length] => 1234
[Connection] => keep-alive
[Date] => Wed, 12 Apr 2024 08:23:17 GMT
[Server] => Apache/2.4.41 (Unix)
)
[code] => 200
[referrer] => https://referrer.example.com
[http] => Array
(
[0] => HTTP/1.1
[1] => 200
[2] => OK
)
)
详细分解
- status(200):表示HTTP请求成功。
- message("OK"):描述HTTP状态码的文本。
- response:包含服务器返回的详细头信息,包括内容类型、内容长度、连接状态、服务器类型等信息。
- code(200):关于HTTP状态码的冗余信息,提供方便。
- referrer(《https://referrer.example.com》)):如果有的话,表示引用请求的URL。
- http:对初始响应行的分解,提供协议、状态码和文本状态信息。
处理和利用响应
您可以使用这种结构化响应来检查HTTP请求的状态,记录信息,解析用于会话或缓存目的的标题,并使用主体的内容(未在此数组中显示,但通常作为字符串或JSON对象单独处理)。这种结构化方法允许进行健壮的错误处理,并集成到更复杂的应用程序逻辑中,确保您的应用程序能够适当地对来自外部服务的不同响应做出反应。
安全:处理API响应
当使用HttpClient
或任何类似工具与外部API交互时,了解处理您接收到的数据和响应所涉及的安全影响至关重要。以下是确保您应用程序安全的一些重要考虑和最佳实践。
验证API响应
始终假设从外部接收到的任何数据都可能是有害的。在将其用于应用程序之前,必须严格验证和清理所有传入数据。这包括
- 检查数据类型:确保数据与预期类型匹配(例如,字符串、整数)。
- 清理输入:使用库函数来转义有害字符和字符串,尤其是在将数据插入数据库或渲染到用户界面之前。
谨慎处理敏感数据
如果API传输敏感数据,请确保它使用TLS(HTTPS)安全传输。避免记录敏感数据,如API密钥、用户凭据或个人信息,因为日志可能是数据泄露的途径。
安全存储身份验证令牌
如果您的应用程序使用身份验证令牌(例如,API密钥、OAuth令牌)
- 安全存储令牌:使用安全存储机制存储敏感令牌和凭证,避免在源代码中硬编码值。
- 定期生成令牌: 定期更改API密钥和令牌可以限制在暴露事件中造成的损害。
管理错误处理
适当的错误处理可以防止不希望的信息泄露
- 避免详细错误信息: 详细错误信息可以为攻击者提供对后端过程的洞察,这可能会被利用。为用户提供通用错误信息,并安全地记录详细错误。
- 实现健壮的日志记录: 确保错误日志是安全的,并且只能被授权人员访问。
设置超时和大小限制
配置超时并限制响应大小,以避免拒绝服务攻击,这些攻击试图占用资源
- 超时: 设置适当超时以确保缓慢的API响应不会使您的应用程序挂起。
- 响应大小限制: 限制应用程序将接受的响应大小,以防止系统过载。
小心使用重定向
在HTTP请求中自动跟随重定向可能导致安全漏洞
- 验证重定向: 确保任何重定向都指向受信任的URL,尤其是在URL动态构建的场景中。
- 限制自动重定向: 如果可能,在验证新URL后手动处理重定向。
定期更新依赖项
保持所有依赖项的最新状态,包括您的HTTP客户端库。定期更新可以保护您的应用程序免受攻击者可能利用的已知漏洞。
虽然HttpClient
提供了方便的方式来制作HTTP请求,但实施强大的安全实践来保护您的应用程序及其数据至关重要。始终谨慎处理外部数据,并确保您的应用程序能够安全地处理意外或恶意数据。
范围和限制
HttpClient
被设计为PHP应用程序中制作HTTP请求的简单直接工具。它适用于需要基本HTTP功能而无需更复杂库开销的小到中型项目。
何时使用HttpClient
- 小型项目: 对于需要与API交互而没有复杂要求的中小型应用程序或脚本,是理想的选择。
- 学习和原型设计: 对于教育目的、教程或原型设计,是出色的选择,其中简单性和易用性至关重要。
- 有限的依赖项: 在减少依赖项是重点的环境或安装大型库受到限制的环境中非常有用。
限制
尽管HttpClient
对简单任务效率很高,但它缺乏一些更全面HTTP客户端库中发现的先进功能和优化。这些限制包括
- 并发: 不支持异步请求或原生前端处理并发API调用。
- 中间件和插件: 不支持中间件或插件,无法通过钩子或拦截器扩展功能。
更复杂需求的考虑
对于更丰富和健壮的HTTP客户端功能,请考虑使用更全面的库,如GuzzleHTTP
。Guzzle提供了一组适用于复杂应用程序的功能,包括
- 异步请求: 支持异步和并行请求,以提高执行大量外部调用应用程序的性能。
- 中间件支持: 允许使用中间件在请求和响应上动态修改,这对于日志记录、身份验证和缓存等任务非常有用。
- 完全支持HTTP协议: 更好地符合最新的HTTP标准,包括HTTP/2,以及更复杂的SSL/TLS选项。
HttpClient
是一个轻量级且简单的HTTP请求解决方案。然而,对于需要更广泛的功能或处理大量流量的应用程序,推荐使用更高级的解决方案,如GuzzleHTTP。始终评估项目的具体需求和复杂性,以选择最合适的工具。
许可证
本项目采用MIT许可证——有关详细信息,请参阅LICENSE文件。
支持
如果您在使用HttpClient
时遇到任何问题或有任何疑问,请提交一个issue。