【问题标题】:able to call an api via curl but same api hangs when called from nodejs能够通过 curl 调用 api,但是从 nodejs 调用时相同的 api 挂起
【发布时间】:2020-11-30 01:19:28
【问题描述】:

所以场景是这样的我

  1. 从本地系统 - 能够通过 curl 和 nodejs 代码调用 api。 mitmproxy 连接详情截图见截图。

  1. 从托管在 linode 上的服务器 - 能够通过 curl 调用 api,但在本地工作的相同代码会卡住。 mitmproxy 连接详情截图见截图。

据我猜测,这很可能与 ssl 握手被卡在某处有关。最近几天困扰我的是curl和nodejs的请求和标头相同,那么为什么不同的行为

示例卷曲curl 'https://www.nseindia.com/api/liveEquity-derivatives?index=stock_fut' -H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'Connection: keep-alive' -H 'Cookie: _ga=GA1.2.1464035869.1595747215; RT="z=1&dm=nseindia.com&si=d2d25dd8-0b59-4941-a83c-9e3fd2ff9f63&ss=kdllvs49&sl=0&tt=0&bcn=%2F%2F684d0d37.akstat.io%2F&ul=36pqu&hd=36pwb"; ak_bmsc=32ED2E364503B6429496808D1A081032DFC42B6C6C2B0000013A315F40BDEA22~pl0PkvDhq66QJbIByCPofydTlTrNC70ggGqe1TUq9qks8cAr8R3eZemC9KyklftDSOsn0lHOiNNrEUdQWVD7K9oyJ4mGjON/9EjkvUCiHECyXvRkGJmEOaZcBzDtdvX+B8wg8spNZ3RI3jWLg7w+Asr66XwLm8l04X6nfSo9UkF+iOv49hjP4Lfhb4tC6p74oLmL/TQsX5a1gQlb9MGZznGPrXhhxFu1Rd1m3XD9/PToM=' -H 'Upgrade-Insecure-Requests: 1' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache' -H 'TE: Trailers'

示例 nodejs 代码 -NODE_DEBUG=* node mytest.js

var request = require('request');
var https = require('https')
var fetch = require('node-fetch');

const httpsAgent = new https.Agent({
  rejectUnauthorized: false,
  secureProtocol: "TLSv1_2_method"
});

var headers = {
  'Host': 'www.nseindia.com',
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache',
    'TE': 'Trailers',
  'Cookie': '_ga=GA1.2.1464035869.1595747215; RT=z=1&dm=nseindia.com&si=d2d25dd8-0b59-4941-a83c-9e3fd2ff9f63&ss=kdllvs49&sl=0&tt=0&bcn=%2F%2F684d0d37.akstat.io%2F&ul=36pqu&hd=36pwb; ak_bmsc=32ED2E364503B6429496808D1A081032DFC42B6C6C2B0000013A315F40BDEA22~pl0PkvDhq66QJbIByCPofydTlTrNC70ggGqe1TUq9qks8cAr8R3eZemC9KyklftDSOsn0lHOiNNrEUdQWVD7K9oyJ4mGjON/9EjkvUCiHECyXvRkGJmEOaZcBzDtdvX+B8wg8spNZ3RI3jWLg7w+Asr66XwLm8l04X6nfSo9UkF+iOv49hjP4Lfhb4tC6p74oLmL/TQsX5a1gQlb9MGZznGPrXhhxFu1Rd1m3XD9/PToM='

};

var options = {
    url: 'https://www.nseindia.com/api/liveEquity-derivatives?index=stock_fut',
    headers: headers
};

function callback(error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body);
    }
}

(async function(){
  if(require.main==module){
    console.log('before')
    let data = await fetch(options.url, {
      headers: {
        Connection: 'keep-alive',
        'Cache-Control': 'no-cache',
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0'      
      },
      agent:httpsAgent
                                        }).then(res => res.json())
    console.log(data)
  }
})();

【问题讨论】:

    标签: node.js ssl curl


    【解决方案1】:

    这是有效的代码,

    curl -v --output test.gz -H User-Agent: -H Accept: -H "Connection: keep-alive" -H "Accept-Encoding: gzip, deflate, br" "https://www.nseindia.com/api/liveEquity-derivatives?index=stock_fut"
    

    输出存储在 test.gz 中

    编辑:(更多解释) 我认为服务器只接受一些特定的编码,我使用-H "Accept-Encoding: gzip, deflate, br" 指定了这些编码,并且需要保持连接处于活动状态。剩下的参数很容易解释。

    【讨论】:

    • 您能解释一下这段代码以使答案更有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2015-07-08
    相关资源
    最近更新 更多