在 PHP 中,可以使用内置的 cURL 库或 Guzzle 等第三方库来创建一个 HTTP 客户端,用于发送符合 REST API 规范的请求。以下是使用 cURLGuzzle 的示例代码。


方法 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();
}
?>

解释:

  1. HttpClient:封装了 GET、POST、PUT 和 DELETE 请求方法。
  2. sendRequest 方法:使用 cURL 发送请求,支持 JSON 格式的请求体和响应。
  3. curl_setopt:设置请求选项,如 URL、请求方法、请求头等。
  4. curl_exec:执行请求并获取响应。
  5. curl_getinfo:获取 HTTP 状态码。
  6. 异常处理:捕获 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();
}
?>

解释:

  1. GuzzleHttp\Client:创建一个 Guzzle 客户端实例。
  2. request 方法:发送 HTTP 请求,支持 GET、POST、PUT 和 DELETE。
  3. json 选项:自动将数据序列化为 JSON 格式并设置请求头。
  4. 异常处理:捕获 RequestException 并抛出异常。

总结

  • cURL:适合简单的 HTTP 请求,无需依赖第三方库。
  • Guzzle:功能强大,支持异步请求、文件上传等高级功能,适合复杂的应用场景。

根据你的需求选择合适的工具。如果需要快速实现功能,cURL 是一个不错的选择;如果需要更强大的功能和更好的开发体验,推荐使用 Guzzle

标签: PHP

评论已关闭