如何调用另一个API并使用分页返回数据?

如何调用另一个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”。

+0

你是否已经检查,如果这个插件(https://www.npmjs.com/package/sails-分页)对你有用吗? –

+0

你不能在客户端做类似angularjs的分页吗? –

+0

感谢您的意见,我不能使用客户端分页,因为我正在构建和API,因此分页和过滤器必须在服务器端完成。 我修改了上面的问题,并显示了使用帆分页时面临的挑战。 – ShyBoy

拥抱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); 
} 
+0

谢谢保罗。 NYtime只是一个示例填充程序,我打电话给另一台服务器,每次调用提供100个提要,所以为什么我要寻找一个解决方案,使我可以根据创建的客户对象进行筛选和分页。这是newRtnStr。 – ShyBoy

+0

我也不确定这是否是我正在做或不做的正确方法。 – ShyBoy

+0

我按照以下文章来实现分页。 https://hellosails.com/how-to-implement-url-pagination-for-sails-js-api/ 但是新增服务没有被调用,我是否必须做一些事情来调用服务? 在我的情况下,我的模型是空的,但我的控制器确实有上述代码来调用另一个API,回收数据,然后返回它,当我使用这篇文章上的代码来查看分页是否工作,它完全忽略。我必须做些什么来调用服务?风帆与它无关。 – ShyBoy