引言:为什么需要PHP HTTP客户端?
\n\n现代Web开发离不开与外部服务的交互。无论是向第三方API发送数据、获取汇率信息,还是集成支付网关——每个PHP开发者都会遇到执行HTTP请求的需求。创建一个可靠的PHP HTTP客户端是一项基本技能,它能让您的应用程序与外界进行通信。
\n\n在本文中,我们将探讨两种主要方法:使用内置的cURL扩展和流行的Guzzle库。您将学习如何正确发送GET、POST、PUT和DELETE请求,处理错误以及操作请求头。本材料对新手和经验丰富的开发者均有帮助,有助于系统化相关知识。
\n\n1. PHP HTTP客户端基础:使用cURL
\n\n1.1. 什么是cURL及其重要性
\n\ncURL(Client URL Library)是PHP的一个强大扩展,允许您通过HTTP、HTTPS、FTP等协议与各种服务器进行交互。它包含在PHP的标准发行版中,但有时需要在php.ini中单独启用。cURL让您完全控制请求:您可以设置任何方法、请求头、请求体和超时时间。
\n\n1.2. 使用cURL发送简单GET请求
\n\n我们从最常见的场景开始——从服务器获取数据。来看一个向公共API JSONPlaceholder发起请求的示例:
\n\n<?php\n// 初始化cURL会话\n$ch = curl_init('https://jsonplaceholder.typicode.com/posts/1');\n\n// 设置选项\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_HTTPGET, true);\ncurl_setopt($ch, CURLOPT_TIMEOUT, 30);\n\n// 执行请求\n$response = curl_exec($ch);\n$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n\n// 检查错误\nif (curl_errno($ch)) {\n echo 'cURL错误:' . curl_error($ch);\n} else {\n echo "HTTP状态码:$httpCode\\n";\n $data = json_decode($response, true);\n print_r($data);\n}\n\n// 关闭会话\ncurl_close($ch);\n?>\n\n请注意:我们始终检查响应状态码和错误信息。CURLOPT_RETURNTRANSFER确保结果被返回到变量中,而不是直接输出。
1.3. 发送带数据的POST请求
\n\n要向服务器发送数据(例如创建新记录),我们使用POST方法。数据可以以数组或JSON字符串的形式传递:
\n\n<?php\n$ch = curl_init('https://jsonplaceholder.typicode.com/posts');\n\n$postData = [\n 'title' => '新文章',\n 'body' => '文章内容',\n 'userId' => 1\n];\n\ncurl_setopt_array($ch, [\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_POST => true,\n CURLOPT_POSTFIELDS => json_encode($postData), // JSON\n CURLOPT_HTTPHEADER => [\n 'Content-Type: application/json',\n 'Accept: application/json'\n ],\n CURLOPT_TIMEOUT => 30\n]);\n\n$response = curl_exec($ch);\n$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\ncurl_close($ch);\n\necho "HTTP状态码:$httpCode\\n";\necho $response;\n?>\n\n关键点:如果您将数组传递给CURLOPT_POSTFIELDS,PHP会自动将其编码为application/x-www-form-urlencoded格式。对于JSON,需要使用json_encode()并显式设置Content-Type请求头。
1.4. PUT和DELETE请求
\n\n更新和删除资源时使用PUT和DELETE方法。在cURL中,通过CURLOPT_CUSTOMREQUEST选项设置:
<?php\n// PUT请求(更新)\n$ch = curl_init('https://jsonplaceholder.typicode.com/posts/1');\n$updateData = ['title' => '更新后的标题'];\n\ncurl_setopt_array($ch, [\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_CUSTOMREQUEST => 'PUT',\n CURLOPT_POSTFIELDS => json_encode($updateData),\n CURLOPT_HTTPHEADER =>