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

2022-08-30 18:30:41

我是PHP中cURL的新手。我有一个关于使用卷曲选项的问题。

考虑两个脚本文件:test1.php 和 test2.php它们都存在于根 www 中。我使用的是 Ubuntu 12.04 LTS。PHP 的 libcurl 版本是 7.22.0

测试内容1.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);
?>

测试内容2.php

<?php 
    var_dump($_POST);
?>

当我通过浏览器执行 test1.php时,我可以看到发布的结果。现在,如果我删除包含CURLOPT_POST的curl选项,该示例仍然有效。即使我将CURLOPT_POST设置为 false,也会执行 post 并显示结果。那么,这根本不需要CURLOPT_POST吗?看起来选项负责通过POST发送数据而无需使用选项。当我在 test2 中打印时.php,请求方法始终设置为(带或不带选项)。CURLOPT_POSTFIELDSCURLOPT_POST$_SERVERPOSTCURLOPT_POST

任何人都可以让我知道选项的确切用法吗?是否需要通过以下方式发送数据?CURLOPT_POSTPOST


答案 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 内容类型:标头。

将 POST 与 HTTP 1.1 一起使用意味着使用“预期:100-continue”标头。您可以像往常一样使用CURLOPT_HTTPHEADER禁用此标头。

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

如果您已发出 POST 请求,并希望改为创建 HEAD 或 GET,则必须使用CURLOPT_NOBODY或CURLOPT_HTTPGET或类似名称显式选择新的请求类型。


我现在正在测试设置要尝试CURLOPT_POST是否会覆盖我的CURLOPT_HTTPHEADER,“Content-Type: application/json;字符集 = utf-8“ 设置。


推荐