对于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"
如果你需要嵌套数据,你首先必须决定你的命名约定是什么。