为什么返回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);
});
}
};
});
这里似乎有一些未记录的Angular行为。根据Angular文档,params参数采用"字符串或对象的映射,该映射将在url后转换为?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'
}])
}
}
)