目前我正在尝试使用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:
同时,当我构建选项时,它看起来像这样
{
"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
答案 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
项目的所有内容,尽管在这种情况下大多数选项都无关紧要。您只需使用host
,protocol
和path
项。该网页会告诉您为什么您现在拥有的timeout
项目无效。