这是一个标志位(flag),用于告诉 cURL 库你希望执行一个 HTTP POST 请求。

CURLOPT_POST 是什么?
CURLOPT_POST 是一个布尔值(true / false 或 1 / 0)的 cURL 选项。
- 作用:当您将其设置为
true时,cURL 会将请求方法从默认的GET修改为POST。 - 默认值:
false(0)。
CURLOPT_POST = true 的作用就像在浏览器地址栏输入网址后,不是直接按回车(GET),而是点击一个表单里的“提交”按钮(POST)。
如何使用 CURLOPT_POST
使用 CURLOPT_POST 需要和其他几个相关的 cURL 选项配合使用,才能完整地构建一个 POST 请求。
基本用法示例
以下是一个最简单的 POST 请求示例,向一个测试服务器发送数据。

<?php
// 1. 初始化 cURL 会话
$ch = curl_init();
// 2. 设置要请求的 URL
$url = 'https://httpbin.org/post'; // httpbin.org 是一个可以测试 HTTP 请求的网站
curl_setopt($ch, CURLOPT_URL, $url);
// 3. 核心设置:告诉 cURL 这是一个 POST 请求
curl_setopt($ch, CURLOPT_POST, true);
// 4. 设置要发送的 POST 数据
// 数据格式通常是 key1=value1&key2=value2 的字符串
$postData = 'username=myuser&password=mypassword';
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
// 5. 设置将响应直接输出到屏幕上(或者你也可以获取为字符串)
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 如果想获取响应内容而不是直接输出,取消这行注释
// 6. 执行 cURL 会话
$response = curl_exec($ch);
// 7. 检查是否有错误发生
if (curl_errno($ch)) {
echo 'cURL 错误: ' . curl_error($ch);
} else {
// 如果使用了 CURLOPT_RETURNTRANSFER, $response 会包含服务器返回的内容
echo $response;
}
// 8. 关闭 cURL 会话
curl_close($ch);
?>
关键点:
curl_setopt($ch, CURLOPT_POST, true);:开启 POST 模式。curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);:设置 POST 的具体内容,这个选项是 POST 请求的灵魂,CURLOPT_POST只是打开了这个大门。
CURLOPT_POST 与 CURLOPT_POSTFIELDS 的关系
这是一个非常重要的概念,很多初学者会混淆它们。
| 选项 | 作用 | 类型 | 必要性 |
|---|---|---|---|
CURLOPT_POST |
声明请求方法为 POST,它是一个开关,一个标志。 | boolean (true / false) |
必须,如果你想发 POST 请求 |
CURLOPT_POSTFIELDS |
设置 POST 请求的具体数据内容。 | string 或 array |
必须,当 CURLOPT_POST 为 true 时 |
关系总结:
CURLOPT_POST 是告诉 cURL “怎么发”(用 POST 方法),而 CURLOPT_POSTFIELDS 是告诉 cURL “发什么”)。
一个常见的错误:
设置了 CURLOPT_POSTFIELDS 但忘记设置 CURLOPT_POST = true,cURL 默认会使用 GET 方法,CURLOPT_POSTFIELDS 的值会被简单地附加到 URL 后面,这通常不是你想要的结果。

CURLOPT_POSTFIELDS 的数据格式
CURLOPT_POSTFIELDS 的值可以是字符串(string)也可以是数组(array),这会影响 Content-Type 请求头的设置。
1 字符串格式
这是最传统的方式,数据需要手动拼接成 key=value&key2=value2 的形式。
$postDataString = 'name=John%20Doe&email=john%40example.com&age=30'; curl_setopt($ch, CURLOPT_POSTFIELDS, $postDataString);
- 注意:你需要自己处理 URL 编码(空格
%20,%40),cURL 不会自动为你编码。
2 数组格式(推荐)
从 PHP 5.2.0 开始,CURLOPT_POSTFIELDS 可以接受一个关联数组,cURL 会自动将数组转换为正确的字符串格式,并自动进行 URL 编码。
更重要的是,当 CURLOPT_POSTFIELDS 是一个数组时,cURL 会自动将 Content-Type 请求头设置为 application/x-www-form-urlencoded,这是标准的表单提交格式。
$postDataArray = [
'name' => 'John Doe',
'email' => 'john@example.com',
'age' => 30
];
curl_setopt($ch, CURLOPT_POSTFIELDS, $postDataArray);
// cURL 会自动将其转换为 "name=John+Doe&email=john%40example.com&age=30"
// 并自动添加请求头: Content-Type: application/x-www-form-urlencoded
3 发送 JSON 数据(现代 API 的常见场景)
现在很多 API 要求使用 JSON 格式发送数据,要实现这一点,你需要手动设置 CURLOPT_POSTFIELDS 和 Content-Type 请求头。
// 1. 准备 PHP 数组
$dataToBeSent = [
'name' => 'Jane Doe',
'email' => 'jane@example.com'
];
// 2. 将 PHP 数组转换为 JSON 字符串
$jsonPayload = json_encode($dataToBeSent);
// 3. 设置 POST 数据为 JSON 字符串
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonPayload);
// 4. 手动设置 Content-Type 请求头为 application/json
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($jsonPayload) // 建议同时设置 Content-Length
]);
// 同时确保 CURLOPT_POST 为 true
curl_setopt($ch, CURLOPT_POST, true);
高级用法:发送文件(multipart/form-data)
当需要通过 POST 请求上传文件时,数据格式会更复杂,使用数组格式可以轻松实现。
// 准备包含文件和其他字段的混合数据
$postDataWithFile = [
'username' => 'fileuploader',
'description' => 'A profile picture',
// 使用 @ 符号来标识一个文件(在旧版 PHP 中)
// 在新版 PHP (cURL 7.59.0+) 中,推荐使用 CURLFile 类
'avatar' => new CURLFile('/path/to/your/avatar.jpg')
];
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postDataWithFile);
// 当使用数组且包含文件时,cURL 会自动设置
// Content-Type 为 multipart/form-data 并生成正确的 boundary
| 要点 | 描述 |
|---|---|
| 核心作用 | CURLOPT_POST 是一个开关,用于将 HTTP 请求方法从 GET 切换到 POST。 |
| 必配选项 | 使用 CURLOPT_POST 时,必须同时使用 CURLOPT_POSTFIELDS 来设置要发送的数据。 |
| 数据格式 | CURLOPT_POSTFIELDS 可以是字符串或数组。推荐使用数组,因为它更清晰、安全(自动编码),并能自动设置 Content-Type。 |
| 发送 JSON | 如果要发送 JSON,需将 CURLOPT_POSTFIELDS 设为 JSON 字符串,并手动设置 Content-Type: application/json 请求头。 |
| 文件上传 | 通过将文件路径封装在 CURLFile 对象中,并放入 CURLOPT_POSTFIELDS 的数组里,可以轻松实现文件上传。 |
CURLOPT_POST 和 CURLOPT_POSTFIELDS 的区别与联系,你就能熟练地使用 cURL 发送各种类型的 POST 请求了。
