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

时间:2014-12-12 15:33:43

标签: php http post 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”。

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

有没有办法保留数据类型? 也许通过设置一个特定的卷曲选项? 或者这根本不可能?

如果cUrl总是将布尔值转换为字符串,那么在另一端有什么值的硬性和快速规则吗?即bool是否总是成为字符串“1”而错误总是变成空字符串?

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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