PHP Http客户端两种实现方式
在 PHP 中,可以使用内置的 cURL
库或 Guzzle
等第三方库来创建一个 HTTP 客户端,用于发送符合 REST API 规范的请求。以下是使用 cURL
和 Guzzle
的示例代码。
方法 1:使用 cURL
库
cURL
是 PHP 内置的库,适合简单的 HTTP 请求。
示例代码:
<?php
// 创建一个 HTTP 客户端类
class HttpClient {
private $baseUrl;
public function __construct($baseUrl) {
$this->baseUrl = $baseUrl;
}
// 发送 GET 请求
public function get($endpoint) {
return $this->sendRequest('GET', $endpoint);
}
// 发送 POST 请求
public function post($endpoint, $data = []) {
return $this->sendRequest('POST', $endpoint, $data);
}
// 发送 PUT 请求
public function put($endpoint, $data = []) {
return $this->sendRequest('PUT', $endpoint, $data);
}
// 发送 DELETE 请求
public function delete($endpoint) {
return $this->sendRequest('DELETE', $endpoint);
}
// 发送请求的核心方法
private function sendRequest($method, $endpoint, $data = []) {
$url = $this->baseUrl . $endpoint;
$ch = curl_init();
// 设置请求方法和 URL
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
// 如果是 POST 或 PUT 请求,设置请求体
if ($method === 'POST' || $method === 'PUT') {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
}
// 设置请求头
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Accept: application/json',
]);
// 执行请求
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// 检查是否有错误
if (curl_errno($ch)) {
$error = curl_error($ch);
curl_close($ch);
throw new Exception("cURL Error: $error");
}
curl_close($ch);
// 返回响应
return [
'status' => $httpCode,
'body' => json_decode($response, true),
];
}
}
// 使用示例
try {
$client = new HttpClient('https://api.example.com');
// 发送 GET 请求
$response = $client->get('/users');
print_r($response);
// 发送 POST 请求
$response = $client->post('/users', ['name' => 'John Doe', 'email' => '[email protected]']);
print_r($response);
// 发送 PUT 请求
$response = $client->put('/users/1', ['name' => 'Jane Doe']);
print_r($response);
// 发送 DELETE 请求
$response = $client->delete('/users/1');
print_r($response);
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
?>
解释:
HttpClient
类:封装了 GET、POST、PUT 和 DELETE 请求方法。sendRequest
方法:使用cURL
发送请求,支持 JSON 格式的请求体和响应。curl_setopt
:设置请求选项,如 URL、请求方法、请求头等。curl_exec
:执行请求并获取响应。curl_getinfo
:获取 HTTP 状态码。- 异常处理:捕获
cURL
错误并抛出异常。
方法 2:使用 Guzzle
库
Guzzle
是一个功能强大的 PHP HTTP 客户端库,支持异步请求、文件上传、重试机制等高级功能。
安装 Guzzle:
使用 Composer 安装 Guzzle:
composer require guzzlehttp/guzzle
示例代码:
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
// 创建一个 HTTP 客户端类
class HttpClient {
private $client;
public function __construct($baseUrl) {
$this->client = new Client(['base_uri' => $baseUrl]);
}
// 发送 GET 请求
public function get($endpoint) {
return $this->sendRequest('GET', $endpoint);
}
// 发送 POST 请求
public function post($endpoint, $data = []) {
return $this->sendRequest('POST', $endpoint, $data);
}
// 发送 PUT 请求
public function put($endpoint, $data = []) {
return $this->sendRequest('PUT', $endpoint, $data);
}
// 发送 DELETE 请求
public function delete($endpoint) {
return $this->sendRequest('DELETE', $endpoint);
}
// 发送请求的核心方法
private function sendRequest($method, $endpoint, $data = []) {
try {
$options = [
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
];
if ($method === 'POST' || $method === 'PUT') {
$options['json'] = $data;
}
$response = $this->client->request($method, $endpoint, $options);
return [
'status' => $response->getStatusCode(),
'body' => json_decode($response->getBody(), true),
];
} catch (RequestException $e) {
throw new Exception("Guzzle Error: " . $e->getMessage());
}
}
}
// 使用示例
try {
$client = new HttpClient('https://api.example.com');
// 发送 GET 请求
$response = $client->get('/users');
print_r($response);
// 发送 POST 请求
$response = $client->post('/users', ['name' => 'John Doe', 'email' => '[email protected]']);
print_r($response);
// 发送 PUT 请求
$response = $client->put('/users/1', ['name' => 'Jane Doe']);
print_r($response);
// 发送 DELETE 请求
$response = $client->delete('/users/1');
print_r($response);
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
?>
解释:
GuzzleHttp\Client
:创建一个 Guzzle 客户端实例。request
方法:发送 HTTP 请求,支持 GET、POST、PUT 和 DELETE。json
选项:自动将数据序列化为 JSON 格式并设置请求头。- 异常处理:捕获
RequestException
并抛出异常。
总结
cURL
:适合简单的 HTTP 请求,无需依赖第三方库。Guzzle
:功能强大,支持异步请求、文件上传等高级功能,适合复杂的应用场景。
根据你的需求选择合适的工具。如果需要快速实现功能,cURL
是一个不错的选择;如果需要更强大的功能和更好的开发体验,推荐使用 Guzzle
。
评论已关闭