为什么这会返回400错误(唯一查询最多可能有一个结果。得到100):
[{
name:null,
type:'music/artist'
}]
我希望它能从音乐/艺术家中返回前100个名字?它是一个独特的查询?
我正在尝试构建一个随机查询,我可以提供两个参数 - 页面和页面内的结果返回 - 并返回一个项目
如果MQL支持return: 'random'
编辑 - 添加完整的Angular工厂。如果我将其打入freebase.com/query引擎,则查询运行正常。
myApp.factory('FB_Random', function ($http) {
return {
fn: function (callback) {
$http.get("https://www.googleapis.com/freebase/v1/mqlread",
{
params: {
query:[{
name: null,
type: '/music/artist'
}]
}
}
).success(function (d, status, headers, config) {
callback(d.result);
}).error(function (d, status, headers, config) {
console.log(d);
});
}
};
});
答案 0 :(得分:1)
看起来这里有一些未记录的Angular行为。根据{{3}}, params 参数采用“在网址后将转为?key1=value1&key2=value2
的字符串或对象的地图。”
但是,似乎还有一些额外的逻辑可以在 params 映射中查找数组值并将它们转换为重复参数;即。 ?query={...}&query={...}
。由于您的查询(正确地)以数组表示法包装,表明您期望多个结果,因此Angular将其解释为具有查询参数的单个值的列表。然后它提取该查询参数并将其添加到URL中,如下所示:
https://www.googleapis.com/freebase/v1/mqlread?query={%22name%22:null,%22type%22:%22/music/artist%22}
这就是为什么您错误地询问查询错误请求单个结果的原因。因为Angular删除了MQL所需的外部数组符号。
解决此问题的最简单方法是将查询简单地包装在另一个数组中,如下所示:
$http.get("https://www.googleapis.com/freebase/v1/mqlread",
{
params: {
query:[[{
name: null,
type: '/music/artist'
}]]
}
}
)
如果您想使修复更明确,并且您的代码更容易阅读,您可以像这样自己将MQL查询字符串化:
$http.get("https://www.googleapis.com/freebase/v1/mqlread",
{
params: {
query: JSON.stringify([{
name: null,
type: '/music/artist'
}])
}
}
)