如何从Sails应用程序向外部Sails API

时间:2016-01-14 23:13:16

标签: sails.js

我开始使用SailsJS,我发现它非常棒且功能强大。

有人可以解释一下如何向Sails外的API发送POST和GET请求,以及我在哪里写这个请求?

非常感谢2016年大家快乐!

修改

你好@arcseldon,谢谢你一直试图帮助我。

我会尝试更好地解释自己,并告诉你我的代码。

我有一个用PHP编写的API(我认为不相关),它接受POST,GET,PUT,DELETE方法。我使用Postman进行测试,一切看起来还不错。

我正在尝试在Sails中创建一个应用程序,它向我的API发出GET和POST请求,但我不知道放置GET和POST代码的最佳位置在哪里。

在模型中我已经有以下要求令牌来执行其他请求,并且它可以工作:

gettoken: function (requestnewtoken,tokenresult) {
    if(!requestnewtoken) {
      tokenresult(global.tokeng);
    } else {
        request({
            headers: {
                'User-agent' : 'develop',
                'Content-Type' : 'application/x-www-form-urlencoded;charset=UTF-8',
                'Content-Length' : '29',
                'Authorization' : 'Basic ' + global.idsecret
            },
            uri: "https://myapi/oauth2/token",
            method: "POST",
            form: {
                grant_type: "client_credentials"
            }
        }, function(error, response, body) {
        var tokenjson = JSON.parse(body);
        var token = tokenjson['access_token'];
        global.tokeng = token;
            tokenresult(token);
        });
    }
}

然后,我对另一个端点执行GET请求,该端点有效:

listpublicroutes: function(requestnewtoken,cb) {
    Model.gettoken(requestnewtoken,function(token) {
        request({
            headers: {
                'Authorization' : 'Bearer ' + token
            },
            uri: "https://myapi/folder/file.json",
            method: "GET",
            timeout: 10000,
            followRedirect: true,
            maxRedirects: 10
        }, function(error,response, body) {
        if(error || (response.statusCode != 200)) {
          Model.listpublicroutes(true,cb);
        } else {
                cb(null,JSON.parse(body));
        }
        });
    });
}

我怀疑这是否是编写POST和GET请求的最佳方式,或者它们可能更简单,如果请求应该在控制器(或其他任何地方)而不是模型中完成。

你能给我一个POST和GET请求的例子吗?

非常感谢所有想要了解我的人。

1 个答案:

答案 0 :(得分:1)

您的问题并不清楚您的要求......根据您的目的,以下是一些建议。

  

如果您正在尝试呼叫并从内部发出http请求   服务器端Sails代码然后我建议你看一下   NPM模块request

     

如果您正在讨论获取/发布测试API的请求,   然后使用网络浏览器插件/工具,如postman(也是一个   相同名称的Chrome插件。

     

如果您正在谈论调用完全不同的域URL   在Web应用程序客户端中使用AJAX(通过Web浏览器)   那么你可以使用任何AJAX方法(jquery / angular / whatever   您正在使用的客户端库来进行ajax调用)但请注意   你打电话给的域必须用十字架设置   原始资源共享( CORS )。

您可以控制自己的CORS设置(允许源自其他域的应用通过更新 config / cors.js 设置从浏览器调用您的sails API。

这是否回答了你的问题?如果您需要进一步的帮助,请在下面留言,我会尽力提供帮助。

根据问题更新进行更新:

@Michi - 好的,您希望从SailsJS中调用您的PHP api - 就位置而言,三个竞争者是在Controller,自定义Model方法或自定义服务中。

我的建议"大多数情况下,如果逻辑不是真的需要在别处共享,那么这个逻辑就在Controller内。你可以想象,可以调用Model.method(),但通常""您希望将模型视为您的域数据(当然不总是如此,如果您所做的事情的责任真正属于拥有所有状态交互的单个模型等,那么模型可能是找到该责任的正确位置) 。

但是,在你的情况下,你得到一个令牌,而没有看到你的模型代码(你刚刚提供了getToken函数,它看起来并没有真正与特定模型相关联......)然后如果其他地方不需要,我会选择在你的控制器中调用它。否则,将其重构为service。引用SailsJS文档:

  

可以将服务视为包含其功能的库   您可能希望在应用程序的许多位置使用。例如,   您可能有一个EmailService,它包含一些默认的电子邮件   您希望在您的许多部分中使用的样板代码   应用。在Sails中使用服务的主要好处是它们   全球化 - 您不必使用require()来访问它们。

我经常将自定义逻辑放在控制器模型服务中,但对于网络相关逻辑等,我的偏好是:

  • 控制器是否为一次性逻辑。
  • 如果需要可重用性,或者将代码封装为服务,则可以提高服务的可读性/维护性

使用模型,只有当您坚信逻辑和责任真正与该模型相关时 - 在这里谨慎一点并谨慎使用。但我承认我的建议可能被认为是主观的 - 我将它们建立在我认为优秀的OOP实践的基础上。