代码之家  ›  专栏  ›  技术社区  ›  Jack Frye

构造Nodejs HTTPS get有效负载

  •  0
  • Jack Frye  · 技术社区  · 8 年前

    目前我正在尝试使用https。获取函数以检索令牌,并对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
    

    然而,当我尝试https时。使用options对象,这样我就可以调整超时以适应更多数据密集型调用,但它失败了

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

    打印最终url会产生:

    最终:

    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 回复  |  直到 8 年前
        1
  •  0
  •   ottomeister    8 年前

    您构建 options 对象

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

    第二个问题是,应该将查询字符串作为 path 项目因此,您应该构建 路径 项目就像您在构建时所做的一样 finalUrl . 这个 headers 项目用于完全不同的目的。它允许您指定其他HTTP请求头,而不是查询字符串元素。您不需要 标题 此处为项目。

    您可以阅读有关 选项 节点中的项目。js文档位于 https://nodejs.org/docs/latest-v6.x/api/http.html#http_http_request_options_callback 虽然大多数选项在这种情况下都是不相关的。您只需使用 主办 , 协议 路径 项目。该网页将告诉您 timeout 您现在拥有的物品无效。