PHP、cURL 和 HTTP POST:如何在 2025 年像专业人士一样发送数据
\n\n如果您曾经编写过需要与另一台服务器“对话”的 PHP 代码——无论是提交表单、调用 API 还是仅仅传输数据——您很可能遇到过 cURL。它不仅仅是一个库,更是 HTTP 请求的瑞士军刀。尽管在 2025 年我们拥有像 Guzzle 或 Symfony HttpClient 这样更现代的工具,但 cURL 仍然是每个 PHP 开发者都需要了解的基础。
\n\n在 Stack Overflow 上,"PHP, cURL, and HTTP POST example?" 这个问题获得了数千次浏览。为什么?因为这是每两个项目中就会遇到一次的任务:从集成支付系统到向 CRM 发送数据。让我们弄清楚如何正确、安全且优雅地完成这项工作。
\n\n什么是 cURL,为什么在 PHP 中需要它?
\n\ncURL(Client URL)是一个强大的库,它允许您的 PHP 脚本充当 HTTP 客户端。想象一下,您的代码就像一个没有界面的浏览器。它可以打开页面、提交表单、下载文件,甚至处理 Cookie。
\n\n在 2025 年,cURL 仍然很重要,因为:
\n- \n
- 它内置于 PHP 中(无需安装额外的包) \n
- 比某些“重量级”库运行得更快 \n
- 让您完全控制请求的每个方面 \n
- 支持所有现代协议:HTTP/2、HTTPS、FTP 甚至 IMAP \n
基本示例:使用 cURL 发送 POST 请求
\n\n让我们从经典示例开始。以下是最小可运行代码,用于向服务器发送 POST 请求:
\n\n<?php\n// 发送数据的目标 URL\n$url = 'https://api.example.com/submit';\n\n// 要发送的数据(关联数组)\n$postData = [\n 'name' => '伊万·彼得罗夫',\n 'email' => 'ivan@example.com',\n 'message' => '来自 2025 年的问候!'\n];\n\n// 初始化 cURL\n$ch = curl_init($url);\n\n// 请求设置\ncurl_setopt_array($ch, [\n CURLOPT_POST => true, // 这是 POST 请求\n CURLOPT_POSTFIELDS => http_build_query($postData), // 字符串格式的数据\n CURLOPT_RETURNTRANSFER => true, // 将响应作为字符串返回\n CURLOPT_HEADER => false, // 不返回标头\n CURLOPT_TIMEOUT => 30, // 超时时间 30 秒\n CURLOPT_SSL_VERIFYPEER => true, // 验证 SSL 证书\n]);\n\n// 执行请求\n$response = curl_exec($ch);\n\n// 检查错误\nif (curl_errno($ch)) {\n echo 'cURL 错误:' . curl_error($ch);\n} else {\n $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n echo "HTTP 响应代码:$httpCode\\n";\n echo "响应正文:$response";\n}\n\n// 关闭连接\ncurl_close($ch);\n?>\n\n请注意 http_build_query()。这是一个方便的函数,可以将数组转换为 URL 编码的字符串。没有它,cURL 可能无法正确处理数据。
发送 JSON 而不是表单数据
\n\n在 2025 年,大多数 API 使用 JSON 而不是传统的 POST 表单。以下是如何调整我们的示例:
\n\n<?php\n$url = 'https://api.example.com/v2/users';\n$jsonData = json_encode([\n 'username' => 'developer_2025',\n 'password' => 'secret_password',\n 'role' => 'admin'\n]);\n\n$ch = curl_init($url);\ncurl_setopt_array($ch, [\n CURLOPT_POST => true,\n CURLOPT_POSTFIELDS => $jsonData, // 发送原始 JSON\n CURLOPT_HTTPHEADER => [ // 重要:指定标头\n 'Content-Type: application/json',\n 'Content-Length: ' . strlen($jsonData),\n 'Accept: application/json'\n ],\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_TIMEOUT => 15,\n]);\n\n$response = curl_exec($ch);\n$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\ncurl_close($ch);\n\nif ($htt