构造Nodejs HTTPS获得Payload

问题描述 投票:0回答:1

目前我正在尝试使用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
}

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

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

javascript node.js get
1个回答
0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.