CURLOPT_POST与CURLOPT_POSTFIELDS:是否需要CURLOPT_POST选项?

时间:2014-11-04 06:04:43

标签: php curl libcurl

我是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发送数据?

2 个答案:

答案 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;设置。