构建Nodejs HTTPS获取有效负载

时间:2017-12-31 15:44:25

标签: javascript node.js get

目前我正在尝试使用https.get函数来检索令牌以及对Yahoo进行常规API调用。当我构建一个长查询字符串并将其添加到url中时,我似乎能够使它工作,将整个url字符串作为第一个参数传递。

var finalUrl = host + path + "?" + paramString;

return new Promise(function(resolve, reject) {
    var data = {
       "error_str": "",
       "errno": 0,
       "return_code": 0,
       "contents": ""
    }
    console.log("In promise function");
    console.log("finalUrl: " + finalUrl);
var options = {
    "host": host,
    "path": path,
    "headers": params,
    "timeout": 2
};

console.log("options: " + JSON.stringify(options));

https.get(finalUrl, (res) => {
// resolves

但是,当我使用options对象尝试https.get时,我可以调整更多数据密集型调用的超时时间,它会失败

https.get(options, (res) => {
// rejects

打印最终网址:

finalUrl:

  

https://api.login.yahoo.com/oauth/v2/get_request_token?oauth_callback=oob&oauth_consumer_key=my_consumer_key&oauth_nonce=334283&oauth_signature_method=PLAINTEXT&oauth_timestamp=1514728974491&oauth_version=1.0&xoauth_lang_pref=en-us&oauth_signature=my_comsumer_secret%26

同时,当我构建选项时,它看起来像这样

{
    "host":"https://api.login.yahoo.com",
    "path":"/oauth/v2/get_request_token",
    "headers":{
        "xoauth_lang_pref":"en-us",     
        "oauth_callback": "oob",                  `                                                                                                          
        "oauth_consumer_key":"my_consumer_key",`
        "oauth_nonce":334283,
        "oauth_signature_method":"PLAINTEXT",
        "oauth_timestamp":1514728974491,
        "oauth_version":"1.0",
        "oauth_signature":"my_consumer_secret&"
    },
    "timeout":2
}

但是,使用此有效负载执行get会产生

getaddrinfo ENOTFOUND https://api.login.yahoo.com https://api.login.yahoo.com:443

1 个答案:

答案 0 :(得分:0)

构建options对象的方式存在两个大问题。

首先,host项应该只指定目标主机名,在本例中为"api.login.yahoo.com""https:"部分应在单独的protocol项中指定。这就是您收到ENOTFOUND错误的原因。

第二个是查询字符串应该作为path项的一部分包含在内。因此,您应该像构建path时那样构建finalUrl项的内容。 headers项目用于完全不同的目的。它允许您指定其他HTTP请求标头,而不是查询字符串元素。您在此处不需要headers项。

您可以在https://nodejs.org/docs/latest-v6.x/api/http.html#http_http_request_options_callback阅读Node.js文档中的options项目的所有内容,尽管在这种情况下大多数选项都无关紧要。您只需使用hostprotocolpath项。该网页会告诉您为什么您现在拥有的timeout项目无效。