使用 PHP 和 cURL 发送数据时保留 post 字段的数据类型


Preserve data type of post fields when sending data using PHP and cURL

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

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

例如:

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

$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_dumps到文本文件中。

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总是将布尔值转换为字符串,那么在另一端期望什么值是否有任何硬性规定? 即布尔值是否总是字符串"1",而假总是空字符串?

感谢您的帮助。

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

请查看 PHP 文档,了解 PHP 如何使用其类型杂耍系统强制转换非字符串值

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

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

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

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