【问题标题】:CURLOPT_POST vs. CURLOPT_POSTFIELDS: Is CURLOPT_POST option required?CURLOPT_POST 与 CURLOPT_POSTFIELDS:是否需要 CURLOPT_POST 选项?
【发布时间】:2014-12-30 23:09:42
【问题描述】:

我是 PHP 中 cURL 的新手。我对 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发送数据是否需要?

【问题讨论】:

  • 是的。要在 curl 中设置请求方法'post',我们设置 curl_setopt($ch, CURLOPT_POST, TRUE);为了发送数据,我们使用关联数组。如果数组是多线程的,那么我们使用 json_encode 作为内部级别。
  • 您是否正确阅读了问题?我不是在问这些选项 CURLOPT_POSTFIELDS 和 CURLOPT_POST 的作用。你试过我提到的例子吗?

标签: php curl libcurl


【解决方案1】:

你是对的。 CURLOPT_POSTFIELDS 暗示 CURLOPT_POST。在使用 CURLOPT_POSTFIELDS 时,您不需要使用 CURLOPT_POST。在这种情况下,请求方法将始终设置为 POST。

请注意,只要您希望它是 POST 请求,这就是您的情况。

如果您不想成为 POST 请求但设置了 CURLOPT_POSTFIELDS,请参阅此相关问答:

【讨论】:

    【解决方案2】:

    API 文档说明 CURLOPT_POST 以供将来参考


    总结:

    真正的参数告诉库做一个常规的 HTTP 发布。这也将使库使用“Content-Type: application/x-www-form-urlencoded”标头。 (这是迄今为止最常用的 POST 方法)。

    使用 CURLOPT_POSTFIELDS 选项指定要发布的数据,使用 CURLOPT_POSTFIELDSIZE 设置数据大小。或者,您可以使用 CURLOPT_READFUNCTION 和 CURLOPT_READDATA 选项向 POST 提供数据。

    您可以通过使用 CURLOPT_HTTPHEADER 设置您自己的来覆盖默认的 POST Content-Type: 标头。

    在 HTTP 1.1 中使用 POST 意味着使用“Expect: 100-continue”标头。您可以像往常一样使用 CURLOPT_HTTPHEADER 禁用此标头。

    如果您使用 POST 到 HTTP 1.1 服务器,如果您使用分块编码,您可以在开始 POST 之前不知道大小的情况下发送数据。您可以通过使用 CURLOPT_HTTPHEADER 添加诸如“Transfer-Encoding: chunked”之类的标头来启用此功能。使用 HTTP 1.0 或没有分块传输,您必须在请求中指定大小。

    如果您已发出 POST 请求并想要改为发出 HEAD 或 GET,则必须使用 CURLOPT_NOBODY 或 CURLOPT_HTTPGET 或类似方法明确选择新的请求类型。


    我现在正在测试设置 CURLOPT_POST 是否会覆盖我的 CURLOPT_HTTPHEADER, "Content-Type: application/json; charset=utf-8" 设置。

    【讨论】:

      猜你喜欢
      • 2023-01-19
      • 2014-07-06
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 2021-12-10
      • 2013-05-18
      • 1970-01-01
      相关资源
      最近更新 更多