【问题标题】:Preserve data type of post fields when sending data using PHP and cURL使用 PHP 和 cURL 发送数据时保留 post 字段的数据类型
【发布时间】:2014-12-12 15:33:42
【问题描述】:

我知道 HTTP POST 表单数据作为字符串值发送到服务器端,我必须将它们转换为布尔值或整数等。

但我的问题是:是否可以在保留值类型的同时使用 cURL 发布数据?

例如:

以下 PHP 代码准备 PHP 数据数组,其中“age”是一个 int,“optin”是一个布尔值,然后使用 cURL 通过 POST 方法将此数据发送到测试脚本。

$url = 'http://www.sometestserver.com/test/receive.php';

$data = array (
    'name'  => "Firstname SecondName",
    'age'   => 25,
    'optin' => true
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/xml'));
$response = curl_exec($ch);

我在上面的代码将数据发布到的测试脚本中有以下代码。该脚本只是读取其中的任何内容并将所有内容 var_dump 到一个文本文件中。

ob_start();
var_dump($_POST);
$data = ob_get_clean();
file_put_contents(time() . ".txt", $data);

输出如下:

array(22) {
  ["name"]=>
  string(21) "Firstname SecondName"
  ["age"]=>
  string(2) "25"
  ["optin"]=>
  string(1) "1"
}

如您所见,所有值都转换为字符串类型,布尔值 true 转换为字符串“1”。

在另一个测试中,布尔值 false 作为空字符串 '' 发送。

有什么方法可以保留数据类型吗? 也许通过设置特定的 curl 选项? 或者这根本不可能?

如果 cUrl 总是将布尔值转换为字符串,是否有任何硬性和快速的规则来规定另一端的值是什么?即 bool true 总是会是字符串“1”而 false 总是会是空字符串吗?

感谢您的帮助。

【问题讨论】:

    标签: php http post curl


    【解决方案1】:

    这个问题的答案在于 PHP 将原始类型转换为字符串的方式。它唯一可能通过 HTTP 和 cURL 将数据作为字符串发送,因此 php 使用 PHP 的类型杂耍系统将非字符串值转换为字符串。

    请看PHP documentation for how PHP cast non-string values using it's type juggling system

    【讨论】:

      【解决方案2】:

      你可以使用 JSON 来保存类型,但是......你真的需要它吗?)你总是可以将字符串转换为任何类型

      【讨论】:

        【解决方案3】:

        您可以这样发送数据,字符串始终为 TRUE,除非值为 0 或空。

        【讨论】:

        • 我明白这就是像 PHP 这样的语言将字符串转换为自然数据类型的方式。但我想知道 cURL 在进行转换时使用的规则,因为我并不总是知道我发布数据的系统使用哪种语言以及这些语言/系统如何解释布尔值的字符串表示
        【解决方案4】:

        我发现将数组转换为对象会导致值被保留。可能是因为curl在发送时将对象转换为json,而php在接收端将其转换回关联数组。

        $data = (object) array (
            'name'  => "Firstname SecondName",
            'age'   => 25,
            'optin' => true
        );
        

        【讨论】:

          猜你喜欢
          • 2010-11-08
          • 1970-01-01
          • 2021-11-13
          • 1970-01-01
          • 2012-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多