如何调用另一个API并使用分页返回数据?
我有一个控制器,使另一个API调用并循环遍历结果,创建自定义对象并返回结果。如何调用另一个API并使用分页返回数据?
什么是添加分页和过滤器的最佳方式是什么? 在我手动完成之前,我认为有一种方法可以通过Sails框架来实现。
我的电流控制器代码:
request.get({
url: 'https://api.nytime.com/v1/articles?apiKey=xxxx&source=Client1'
}, function(error, response, body) {
if (error) {
sails.log.error(error);
}
else {
var asd = JSON.parse(body);
if (asd.status == 'error') {
sails.log.error(asd.message);
return res.send(asd);
return false;
}
var newRtnStr = new Array();
var b = new Object();
for (var i = 0; i < asd.articles.length; i++) {
b = {
"title": "" + asd.articles[i]["title"],
"source": "" + asd.articles[i]["author"],
"description": "" + asd.articles[i]["description"],
"link": "" + asd.articles[i]["url"],
"category": "NYTimes",
"media": asd.articles[i]["urlToImage"],
"rssdate": "" + asd.articles[i]["IL.pubdate"],
"id": "" + i,
"createdAt": "" + asd.articles[i]["publishedAt"],
"updatedAt": "" + asd.articles[i]["publishedAt"]
}
newRtnStr.push(b);
}
return res.send(newRtnStr);
我怎么想,我没有使用模型在这里,它正在被从我的路线就称为控制器。
我跟着教程描述了如何使用蓝图和服务来过滤和创建分页,但我不知道如何使用它,因为我的模型在这里是空的。
一旦我有bluetrints文件夹下的find.js和services服务文件夹下的ActionUtilityService.js,本教程说调用以下内容。
const Pagination = require('sails-pagination')
const buildParams = Pagination.build(q.query)
PublicNews
.find(buildParams)
.then((models) => {
return [
models,
PublicNews.count(buildParams)
]
})
在我的情况下,“PublicNews”是我的模型,但它是空的。根据以上代码,我的自定义对象具有数据,并且需要过滤器和分页,称为“newRtnStr”。
拥抱HATEOAS。纽约时报API给你一种方法来向他们表明分页参数(页面,总是10元)。
我只是简单地通过querystring params或类似的方式将这些信息从客户端传递给他们。我还会给客户端提供下一个和前一个结果链接以及足够的信息,让他们自己找出其他的结果。唯一真正的问题是他们没有告诉你有多少页面,这就限制了你可以使用分页的方式。您可以尝试预取下一页,只是为了确定是否有一个。
例如,你的返回对象我会变成一个对象,并应用元数据给它:
var newRtnStr = {
meta: {
current: "https://example.com/articles?page=3", // URL to the current query results
next: "https://example.com/articles?page=4",
previous: "https://example.com/articles?page=2"
},
articles: []
};
var b = {};
for (var i = 0; i < asd.articles.length; i++) {
b = {
"title": "" + asd.articles[i]["title"],
"source": "" + asd.articles[i]["author"],
"description": "" + asd.articles[i]["description"],
"link": "" + asd.articles[i]["url"],
"category": "NYTimes",
"media": asd.articles[i]["urlToImage"],
"rssdate": "" + asd.articles[i]["IL.pubdate"],
"id": "" + i,
"createdAt": "" + asd.articles[i]["publishedAt"],
"updatedAt": "" + asd.articles[i]["publishedAt"]
}
newRtnStr.articles.push(b);
}
谢谢保罗。 NYtime只是一个示例填充程序,我打电话给另一台服务器,每次调用提供100个提要,所以为什么我要寻找一个解决方案,使我可以根据创建的客户对象进行筛选和分页。这是newRtnStr。 – ShyBoy
我也不确定这是否是我正在做或不做的正确方法。 – ShyBoy
我按照以下文章来实现分页。 https://hellosails.com/how-to-implement-url-pagination-for-sails-js-api/ 但是新增服务没有被调用,我是否必须做一些事情来调用服务? 在我的情况下,我的模型是空的,但我的控制器确实有上述代码来调用另一个API,回收数据,然后返回它,当我使用这篇文章上的代码来查看分页是否工作,它完全忽略。我必须做些什么来调用服务?风帆与它无关。 – ShyBoy
你是否已经检查,如果这个插件(https://www.npmjs.com/package/sails-分页)对你有用吗? –
你不能在客户端做类似angularjs的分页吗? –
感谢您的意见,我不能使用客户端分页,因为我正在构建和API,因此分页和过滤器必须在服务器端完成。 我修改了上面的问题,并显示了使用帆分页时面临的挑战。 – ShyBoy