我知道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
);