PHP HTTP客户端:正确发送请求

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

介绍:为什么在 PHP 中需要 HTTP 客户端?

现代 Web 应用程序很少孤立存在。它们与外部 API、微服务架构服务、分析系统和支付网关进行交互。这种交互的基础是 HTTP 协议。对于 PHP 开发者来说,能够正确发送 HTTP 请求不仅是一项有用的技能,更是专业工具集中必不可少的一部分。

在本文中,我们将介绍在 PHP 中创建 HTTP 客户端的三种主要方法:从简单的 file_get_contents() 到功能强大的 cURL,再到现代的 Guzzle 包。您将学习如何选择合适的工具、处理错误、处理标头以及确保请求的安全性。



1. 使用 file_get_contents() 进行简单请求

在 PHP 中发送 GET 请求的最简单方法是使用内置函数 file_get_contents()。此方法适用于快速原型设计和简单场景,当不需要对连接进行精细调整时。



基本 GET 请求

<?php$url = 'https://api.example.com/data';$response = file_get_contents($url);if ($response === false) {    echo '获取数据时出错';} else {    echo $response;}?>


配置流上下文

要管理标头和请求方法,请使用 stream_context_create()。这允许您发送 POST 请求并设置自定义标头。

<?php$data = json_encode(['name' => 'John', 'email' => 'john@example.com']);$options = [    'http' => [        'method' => 'POST',        'header' => "Content-Type: application/json\\r" .                     "Accept: application/json\\r",        'content' => $data    ]];$context = stream_context_create($options);$result = file_get_contents('https://api.example.com/users', false, $context);if ($result === false) {    // 错误处理}?>

缺点: file_get_contents() 不支持 cookie、连接级别的超时、重定向处理以及 SSL 证书操作。对于严肃的项目,最好使用 cURL 或 Guzzle。



2. 强大且灵活的 cURL

cURL 扩展(Client URL Library)是 PHP 中处理 HTTP 的标准工具。它提供了对请求的完全控制:标头、正文、超时、身份验证、文件处理等等。



使用 cURL 的基本 GET 请求

<?php$ch = curl_init('https://api.example.com/data');curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_TIMEOUT, 30);$response = curl_exec($ch);if (curl_errno($ch)) {    echo 'cURL 错误: ' . curl_error($ch);} else {    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);    echo "HTTP 代码: $httpCode";    echo $response;}curl_close($ch);?>


带 JSON 和标头的 POST 请求

<?php$postData = ['title' => 'PHP HTTP Client', 'body' => '请求示例'];$jsonData = json_encode($postData);$ch = curl_init('https://jsonplaceholder.typicode.com/posts');curl_setopt_array($ch, [    CURLOPT_RETURNTRANSFER => true,    CURLOPT_POST => true,    CURLOPT_POSTFIELDS => $jsonData,    CURLOPT_HTTPHEADER => [        'Content-Type: application/json',        'Accept: application/json',        'Authorization: Bearer YOUR_TOKEN_HERE'    ],    CURLOPT_TIMEOUT => 15,    CURLOPT_SSL_VERIFYPEER => true // 在生产环境中始终为 true!]);$result = curl_exec($ch);$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);curl_close($ch);if ($httpCode >= 200 && $httpCode < 300) {    $decoded = json_decode($result, true);    print_r($decoded);} else {    echo "错误: HTTP $httpCode";}?>


有用的 cURL 选项

  • CURLOPT_

博客

书籍推荐