【问题标题】:Request not working in NodeJS but working in Python请求不在 NodeJS 中工作,但在 Python 中工作
【发布时间】:2022-01-04 22:05:21
【问题描述】:

以下代码是 Postman 的摘录,我在其中得到了响应。由于某种原因,NodeJS 版本似乎没有运行并给出“Socket hang up”错误,而 python 版本运行良好。两个代码都粘贴在下面:

const obj = {
  asset: [
    {
      age: "33",
      existingDisease: false,
      gender: "MALE",
      id: "883a8cb5446f4d6780db2e59bdf4ee35",
      proposerRelationShip: "SELF",
      used: false,
    },
  ],
  cover: [],
  pinCode: "122001",
  quoteId: "7637d7ff982145569fbfa604e3b74485",
  sumInsured: "700000",
  term: { unit: "YEAR", value: "1" },
};

const strObj = JSON.stringify(obj);

var options = {
  method: "POST",
  url: "https://sa.navi.com/v3/premium?paymentMode=SUBSCRIPTION",
  headers: {
    appversion: "2.2.4",
    appversioncode: "92",
    osversion: "Android_11",
    deviceid: "3e44626c3bb37d4c",
    defaultlocale: "en_US",
    "x-session-token": "d635eb15-10aa-4315-9122-6ed3627dc1b8",
    "x-click-stream-data":
      '{"app":{"name":"Navi","version":"92","version_name":"2.2.4"},"device":{"device_id":"3e44626c3bb37d4c","advertising_id":"706649fa-50f0-410d-9c17-3085201808e2","manufacturer":"Google","model":"sdk_gphone_x86","os":"Android","os_version":"30"},"network":{"carrier":"Android","type":"Wifi"},"location":{"latitude":"37.4219983","longitude":"-122.084"},"user":{}}',
    "x-target": "GI",
    source: "APK",
    "content-type": "application/json; charset=utf-8",
    "content-length": "419",
    "accept-encoding": "gzip",
    "user-agent": "okhttp/4.9.0",
  },
  body: strObj,
};

console.log("Going to trigger API");
console.log(options);
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

给出错误:

错误:错误:套接字挂起

虽然 Python 中的相同代码有效:


url = "https://sa.navi.com/v3/premium?paymentMode=SUBSCRIPTION"

payload = "{\"asset\":[{\"age\":\"33\",\"existingDisease\":false,\"gender\":\"MALE\",\"id\":\"883a8cb5446f4d6780db2e59bdf4ee35\",\"proposerRelationShip\":\"SELF\",\"used\":false}],\"cover\":[],\"pinCode\":\"122001\",\"quoteId\":\"7637d7ff982145569fbfa604e3b74485\",\"sumInsured\":\"700000\",\"term\":{\"unit\":\"YEAR\",\"value\":\"1\"}}"
headers = {
  'appversion': '2.2.4',
  'appversioncode': '92',
  'osversion': 'Android_11',
  'deviceid': '3e44626c3bb37d4c',
  'defaultlocale': 'en_US',
  'x-session-token': 'd635eb15-10aa-4315-9122-6ed3627dc1b8',
  'x-click-stream-data': '{"app":{"name":"Navi","version":"92","version_name":"2.2.4"},"device":{"device_id":"3e44626c3bb37d4c","advertising_id":"706649fa-50f0-410d-9c17-3085201808e2","manufacturer":"Google","model":"sdk_gphone_x86","os":"Android","os_version":"30"},"network":{"carrier":"Android","type":"Wifi"},"location":{"latitude":"37.4219983","longitude":"-122.084"},"user":{}}',
  'x-target': 'GI',
  'source': 'APK',
  'content-type': 'application/json; charset=UTF-8',
  'content-length': '419',
  'accept-encoding': 'gzip',
  'user-agent': 'okhttp/4.9.0'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

【问题讨论】:

    标签: python node.js post request


    【解决方案1】:

    您的content-length 错误(当您的有效负载 JSON 的实际长度为 279 时,您传递了 419)。这可能意味着接收服务器仍在等待其余内容到达,它永远不会到达,因此最终服务器超时并挂断您(这就是您收到挂断错误的原因)。

    而且,你瞧,当我删除 content-length 标头并让请求库自动计算它时,请求开始为我工作。

    至于 python 实现,一种猜测是它覆盖了错误的内容长度并为您修复它。


    仅供参考,request() 库一直是deprecated,不建议人们使用它编写新代码,因为它不会在未来使用新功能进行改进。建议的替代方案列表(所有支持承诺)是here。在该列表中我最喜欢的是got(),它也支持与request() 库相同的大部分选项,但它是基于promise 的核心,并且有许多API 改进使其更易于使用(在我看来) .

    而且,您的代码确实可以在 got() 库中正常工作(在删除不正确的 content-length 标头之后)。

    const got = require('got');
    
    const obj = {
        asset: [{
            age: "33",
            existingDisease: false,
            gender: "MALE",
            id: "883a8cb5446f4d6780db2e59bdf4ee35",
            proposerRelationShip: "SELF",
            used: false,
        }, ],
        cover: [],
        pinCode: "122001",
        quoteId: "7637d7ff982145569fbfa604e3b74485",
        sumInsured: "700000",
        term: { unit: "YEAR", value: "1" },
    };
    
    const strObj = JSON.stringify(obj);
    
    var options = {
        method: "POST",
        url: "https://sa.navi.com/v3/premium?paymentMode=SUBSCRIPTION",
        headers: {
            appversion: "2.2.4",
            appversioncode: "92",
            osversion: "Android_11",
            deviceid: "3e44626c3bb37d4c",
            defaultlocale: "en_US",
            "x-session-token": "d635eb15-10aa-4315-9122-6ed3627dc1b8",
            "x-click-stream-data": '{"app":{"name":"Navi","version":"92","version_name":"2.2.4"},"device":{"device_id":"3e44626c3bb37d4c","advertising_id":"706649fa-50f0-410d-9c17-3085201808e2","manufacturer":"Google","model":"sdk_gphone_x86","os":"Android","os_version":"30"},"network":{"carrier":"Android","type":"Wifi"},"location":{"latitude":"37.4219983","longitude":"-122.084"},"user":{}}',
            "x-target": "GI",
            source: "APK",
            "content-type": "application/json; charset=utf-8",
            "accept-encoding": "gzip",
            "user-agent": "okhttp/4.9.0",
        },
        body: strObj,
    };
    
    console.log("Going to trigger API");
    got(options).then(response => {
        console.log(response.body);
    }).catch(e => {
        console.log(e);
    });
    

    【讨论】:

    • 非常感谢您的好先生,这就像一个魅力
    猜你喜欢
    • 2018-06-04
    • 2020-05-14
    • 2015-03-08
    • 2017-05-18
    • 1970-01-01
    • 2022-01-12
    • 2017-12-23
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多