PHP http_build_query 会将 boolean 类型的数据转换为 1 或 0

PHP http_build_query 会将 boolean 类型的数据转换为 10,从网络上搜到的方法都是用引号括住 "true""false"
stackoverflow
cnblogs
但是在 post 请求后端的时候会被类型检查干掉。
发现 http_build_query 会返回 string 类型,于是我手动拼接了一下如 "testbool=true",还是会被后端报类型错误
post 方式问题,get 方式问题,Python 请求就都没问题,所以很郁闷,后端又不能随便改,来求助各位了!

阅读 3.1k
2 个回答

http_build_query 默认使用 RFC1738 来对数据进行编码,这个 RFC 中没有强调对于布尔值应该如何编码,所以各个语言处理的方式可能存在一些差异,大部分的实现都是以将 Bool 转换为字符串的结果来作为最后的结果。而 php 中,将 bool 转换成字符串将得到 1 和 0 ,分别对应 true 和 false。

如果你需要将数据中的 bool 转成 "true""false" ,那可以先使用 array_walk_recursive 递归遍历数据,把里面的 bool 值转成你对应的 "true""false"

<?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, static 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 有问题,GET 没问题

那就应该询问接收端的处理方式,POST 接收时,如果是使用 x-www-form-urlencoded (其使用 RFC3986,但是与 RFC1738 的明显差别在于对于空格的处理),那其应该是和前面的差不多的。

如果是使用 JSON 这种格式,那就应该使用 JSON 数据或者直接发送,而不需要经过 http_build_query。

Python 请求就都没问题

你可以把 Python 发送的请求抓包放出来,或者提供相关代码。

http请求数据没有布尔这种, 只有字符串.

要看接收方是如何处理请求的.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题