我是PHP中 cURL 的新手。我对卷曲选项的使用有疑问。
考虑两个脚本文件:test1.php和test2.php都存在于根www中。我正在使用 Ubuntu 12.04 LTS 。 PHP的libcurl版本为 7.22.0 。
test1.php的内容
<?php
$ch = curl_init();
$post_data = array(
'firstname' => 'John',
'lastname' => 'Doe'
);
curl_setopt($ch, CURLOPT_URL, 'localhost/test2.php');
curl_setopt($ch, CURLOPT_POST, TRUE); //is it optional?
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_exec($ch);
curl_close($ch);
?>
test2.php的内容
<?php
var_dump($_POST);
?>
当我通过浏览器执行test1.php时,我可以看到发布的结果。现在,如果我删除包含 CURLOPT_POST 的curl选项,该示例仍然有效。即使我将 CURLOPT_POST 设置为false,也会执行发布并显示结果。那么, CURLOPT_POST 根本不需要吗?看起来选项CURLOPT_POSTFIELDS
负责通过 POST 发送数据,而不使用CURLOPT_POST
选项。当我在test2.php中打印$_SERVER
时,请求方法始终设置为POST
(带或不带选项CURLOPT_POST
)。
有人可以让我知道CURLOPT_POST
选项的确切用法吗?是否需要通过POST
发送数据?
答案 0 :(得分:22)
你是对的。 CURLOPT_POSTFIELDS 表示 CURLOPT_POST 。使用 CURLOPT_POSTFIELDS 时,您无需使用 CURLOPT_POST 。在这种情况下,请求方法将始终设置为POST。
请注意,只要您希望它是 POST 请求,就属于您的情况。
如果您不想成为 POST 请求但设置 CURLOPT_POSTFIELDS ,请参阅此内容相关的Q&amp; A:
答案 1 :(得分:0)
为了将来参考,API文档会说明CURLOPT_POST
<强>要点:强>
一个true参数告诉库执行常规HTTP发布。这也将使图书馆使用a&#34; Content-Type:application / x-www-form-urlencoded&#34;头。 (这是目前最常用的POST方法)。
使用CURLOPT_POSTFIELDS选项指定要发布的数据,使用CURLOPT_POSTFIELDSIZE设置数据大小。 (可选)您可以使用CURLOPT_READFUNCTION和CURLOPT_READDATA选项向POST提供数据。
您可以通过使用CURLOPT_HTTPHEADER设置自己来覆盖默认的POST Content-Type:标头。
在HTTP 1.1中使用POST意味着使用&#34; Expect:100-continue&#34;头。您可以像往常一样使用CURLOPT_HTTPHEADER禁用此标头。
如果对HTTP 1.1服务器使用POST,如果使用分块编码,则可以在启动POST之前发送数据而不知道大小。您可以通过添加标题来启用此功能,例如&#34; Transfer-Encoding:chunked&#34;使用CURLOPT_HTTPHEADER。对于HTTP 1.0或没有分块传输,您必须在请求中指定大小。
如果您已发出POST请求并希望改为使用HEAD或GET,则必须使用CURLOPT_NOBODY或CURLOPT_HTTPGET或类似方法明确选择新的请求类型。
我现在正在测试是否设置要尝试的CURLOPT_POST将覆盖我的CURLOPT_HTTPHEADER,&#34; Content-Type:application / json;字符集= UTF-8&#34;设置。