PHP项目怎么使用Guzzle HTTP客户端?

wen java案例 3

本文目录导读:

PHP项目怎么使用Guzzle HTTP客户端?

  1. 安装Guzzle
  2. 基本使用
  3. 处理响应
  4. 错误处理
  5. 高级配置
  6. 异步请求
  7. 完整示例:REST API客户端
  8. 性能优化建议

我来详细介绍在PHP项目中使用Guzzle HTTP客户端的方法。

安装Guzzle

首先通过Composer安装:

composer require guzzlehttp/guzzle

基本使用

创建客户端

<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
// 创建客户端实例
$client = new Client();

发送GET请求

// 简单GET请求
$response = $client->get('https://api.example.com/users');
// 获取响应内容
$body = $response->getBody()->getContents();
$statusCode = $response->getStatusCode();
// 带查询参数的GET请求
$response = $client->get('https://api.example.com/users', [
    'query' => [
        'page' => 1,
        'limit' => 10,
        'sort' => 'name'
    ]
]);
// 带请求头的GET请求
$response = $client->get('https://api.example.com/users', [
    'headers' => [
        'Authorization' => 'Bearer your-token',
        'Accept' => 'application/json'
    ]
]);

发送POST请求

// JSON数据
$response = $client->post('https://api.example.com/users', [
    'json' => [
        'name' => '张三',
        'email' => 'zhangsan@example.com',
        'age' => 25
    ]
]);
// 表单数据
$response = $client->post('https://api.example.com/login', [
    'form_params' => [
        'username' => 'admin',
        'password' => '123456'
    ]
]);
// multipart/form-data(文件上传)
$response = $client->post('https://api.example.com/upload', [
    'multipart' => [
        [
            'name' => 'file',
            'contents' => fopen('/path/to/file.jpg', 'r'),
            'filename' => 'file.jpg'
        ],
        [
            'name' => 'description',
            'contents' => '图片描述'
        ]
    ]
]);

处理响应

$response = $client->get('https://api.example.com/users');
// 获取状态码
$statusCode = $response->getStatusCode(); // 200
// 获取响应头
$headers = $response->getHeaders();
$contentType = $response->getHeaderLine('Content-Type');
// 获取响应体
$body = $response->getBody()->getContents(); // 原始字符串
// 解析JSON响应
$data = json_decode($response->getBody(), true);
// 检查状态码
if ($response->getStatusCode() == 200) {
    echo "请求成功!";
} elseif ($response->getStatusCode() == 404) {
    echo "资源未找到!";
}

错误处理

use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Exception\ServerException;
use GuzzleHttp\Exception\ConnectException;
try {
    $response = $client->get('https://api.example.com/users/999');
} catch (ClientException $e) {
    // 4xx 错误
    echo "客户端错误:" . $e->getMessage();
    $response = $e->getResponse();
    echo $response->getStatusCode(); // 404, 401等
} catch (ServerException $e) {
    // 5xx 错误
    echo "服务器错误:" . $e->getMessage();
} catch (ConnectException $e) {
    // 连接错误
    echo "连接失败:" . $e->getMessage();
}

高级配置

基础认证

$client = new Client([
    'base_uri' => 'https://api.example.com/',
    'auth' => ['username', 'password'] // 基础认证
]);
// 或者
$response = $client->get('/users', [
    'auth' => ['username', 'password']
]);

超时设置

$client = new Client([
    'timeout' => 30.0, // 请求超时时间(秒)
    'connect_timeout' => 5.0, // 连接超时时间(秒)
    'read_timeout' => 10.0 // 读取超时时间(秒)
]);

代理设置

$client = new Client([
    'proxy' => 'http://localhost:8080',
    'verify' => false // 关闭SSL验证(不推荐生产环境)
]);

Cookie处理

use GuzzleHttp\Cookie\CookieJar;
// 创建CookieJar
$cookieJar = new CookieJar();
// 发送请求并保存Cookie
$response = $client->get('https://example.com/login', [
    'cookies' => $cookieJar
]);
// 使用保存的Cookie发送后续请求
$response = $client->get('https://example.com/dashboard', [
    'cookies' => $cookieJar
]);

异步请求

use GuzzleHttp\Promise;
// 发起多个异步请求
$promises = [
    'users' => $client->getAsync('https://api.example.com/users'),
    'posts' => $client->getAsync('https://api.example.com/posts'),
    'comments' => $client->getAsync('https://api.example.com/comments')
];
// 等待所有请求完成
$results = Promise\Utils::unwrap($promises);
// 处理结果
foreach ($results as $key => $response) {
    $data = json_decode($response->getBody(), true);
    echo "$key 请求成功,数据量:" . count($data) . "\n";
}

完整示例:REST API客户端

<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Exception\ServerException;
class ApiClient
{
    private $client;
    private $baseUrl;
    private $apiKey;
    public function __construct($baseUrl, $apiKey)
    {
        $this->baseUrl = $baseUrl;
        $this->apiKey = $apiKey;
        $this->client = new Client([
            'base_uri' => $baseUrl,
            'timeout' => 30.0,
            'headers' => [
                'Authorization' => 'Bearer ' . $apiKey,
                'Content-Type' => 'application/json',
                'Accept' => 'application/json'
            ]
        ]);
    }
    public function getUsers($page = 1, $limit = 10)
    {
        try {
            $response = $this->client->get('/api/users', [
                'query' => [
                    'page' => $page,
                    'limit' => $limit
                ]
            ]);
            return json_decode($response->getBody(), true);
        } catch (ClientException $e) {
            return [
                'error' => true,
                'message' => $e->getMessage(),
                'status' => $e->getResponse()->getStatusCode()
            ];
        } catch (ServerException $e) {
            return [
                'error' => true,
                'message' => '服务器错误',
                'status' => 500
            ];
        }
    }
    public function createUser($userData)
    {
        try {
            $response = $this->client->post('/api/users', [
                'json' => $userData
            ]);
            return json_decode($response->getBody(), true);
        } catch (ClientException $e) {
            $errors = json_decode($e->getResponse()->getBody(), true);
            return [
                'error' => true,
                'message' => '创建用户失败',
                'errors' => $errors
            ];
        }
    }
    public function updateUser($id, $userData)
    {
        try {
            $response = $this->client->put("/api/users/{$id}", [
                'json' => $userData
            ]);
            return json_decode($response->getBody(), true);
        } catch (ClientException $e) {
            return [
                'error' => true,
                'message' => $e->getMessage()
            ];
        }
    }
    public function deleteUser($id)
    {
        try {
            $response = $this->client->delete("/api/users/{$id}");
            return [
                'success' => true,
                'message' => '用户删除成功'
            ];
        } catch (ClientException $e) {
            return [
                'error' => true,
                'message' => '删除用户失败'
            ];
        }
    }
}
// 使用示例
$api = new ApiClient('https://api.example.com', 'your-api-key');
// 获取用户列表
$users = $api->getUsers(1, 20);
print_r($users);
// 创建新用户
$newUser = $api->createUser([
    'name' => '李四',
    'email' => 'lisi@example.com'
]);
print_r($newUser);

性能优化建议

  1. 复用客户端实例:尽量复用 Client 实例
  2. 使用连接池:默认支持连接池
  3. 异步请求:并发多个请求时使用异步
  4. 设置合理超时:避免长时间等待
  5. 启用HTTP Keep-Alive:减少连接建立开销

Guzzle是PHP中最流行的HTTP客户端之一,功能强大且易于使用,非常适合处理各种HTTP请求场景。

抱歉,评论功能暂时关闭!