PHP前端开发

PHP中http_build_query函数如何正确处理布尔值?

百变鹏仔 1个月前 (12-15) #PHP
文章标签 正确处理

http_build_query 与布尔值类型转换

php 中的 http_build_query 函数可以将数据转换为 url 查询字符串。然而,在将布尔值类型的数据转换为 1 或 0 时,可能会遇到问题。

默认情况下,http_build_query 使用 rfc1738 编码数据,其中对于布尔值的编码方式没有明确规定。因此,不同的语言可能采用不同的处理方式。php 中,布尔值转换为字符串时分别为 1 和 0,对应 true 和 false。

如果您需要将布尔值转换为 "true" 和 "false",可以使用 array_walk_recursive 函数递归遍历数据并进行转换。示例代码如下:

立即学习“PHP免费学习笔记(深入)”;

$arr = [    'id' => 1,    'is_admin' => false,    'permissions' => [        'write' => false,        'read' => true,        'delete' => false,        'edit' => true,        'advanced' => [            'report' => true,            'down' => true,        ],    ],];array_walk_recursive($arr, function (&$val) {    is_bool($val) && $val = $val ? 'true' : 'false';});echo http_build_query($arr);// id=1&is_admin=false&permissions%5Bwrite%5D=false&permissions%5Bread%5D=true&permissions%5Bdelete%5D=false&permissions%5Bedit%5D=true&permissions%5Badvanced%5D%5Breport%5D=true&permissions%5Badvanced%5D%5Bdown%5D=true

在 post 请求中遇到问题的原因可能是接收端对布尔值处理方式不同。如果您使用的是 x-www-form-urlencoded 格式,其使用 rfc3986 编码数据,与 rfc1738 的主要区别在于空格的处理。对于布尔值的处理也可能存在差异。

如果您使用的是 json 格式,则应使用 json 数据或直接发送,而无需经过 http_build_query。

如果您需要调试 python 请求,可以抓取请求包或提供相关代码以进行分析。