PHP HTTP构建查询没有数组符号



对于extern (Django) API,我们需要将GET查询数据传递给它们,如下所示:

?products=Product1&products=Product2

可以看到它们对数组的编码不同于PHP内置的

http_build_query(['Product1', 'Product2'])=>?products[]=Product1&products[]=Product2

是否有在PHP的方式构建查询以获得Django API期望的结果?还是我得自己写点什么?

提前感谢!

可以使用下面的代码

$params = ['products'=>['Product1', 'Product2']];
$query_params = http_build_query($params,null, '&');
$query_string = preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '=', $query_params);
print_r($query_string);

这会得到像"products= product1 "products= Product2">这样的查询字符串

本机不支持该格式。

我认为主要原因是URL参数是一个平面键/值结构,而http_build_query()可以序列化任意嵌套的数组和对象。为了支持这一点,您需要一些约定来处理平面列表中的数据树。URL规范没有提供。PHP使用[]表示法来模拟其他地方的数组(例如$_GET),因此在内置查询创建函数中使用这样的约定是有意义的。

如果您不需要嵌套数据,您可以轻松编写自己的函数:

function encodeParams(array $data): string
{
$params = [];
foreach ($data as $name => $val) {
if (is_array($val)) {
foreach ($val as $v) {
$params[] = sprintf('%s=%s', rawurldecode($name), rawurldecode($v));
}
} else {
$params[] = sprintf('%s=%s', rawurldecode($name), rawurldecode($val));
}
}
return implode('&', $params);
}
$test = [
'products' => [
'Product1',
'Product2',
],
'page' => 123,
'order' => 'asc'
];
var_dump(http_build_query($test));
var_dump(encodeParams($test));
string(68) "products%5B0%5D=Product1&products%5B1%5D=Product2&page=123&order=asc"
string(54) "products=Product1&products=Product2&page=123&order=asc"

如果你需要嵌套数据,你首先必须决定你的命名约定是什么。

相关内容

  • 没有找到相关文章

最新更新