【问题标题】:API response is NULL in Node but works fine in PythonAPI 响应在 Node 中为 NULL,但在 Python 中工作正常
【发布时间】:2018-07-25 11:39:10
【问题描述】:

我必须为这个项目使用节点,它返回为空。

'use strict';

var https = require('https');
var pathString = '/api/SomeAPI/Start?Query=SomeData&Account=USER\sean1234&needed=0';

var request = https.get({
host: "some-host-path",
path: pathString,
header: {'Content-Type': 'application/json'}
}, function(response) {

    var json = "";
    response.on('data', function(chunk) {
        json += chunk;
        console.log("json is: " + json);

     });
    response.on('end', function() {
        var jsonData = JSON.parse(json);
        var count = 0;
        var reply = "";
        var keys;

        console.log("jsonData is: " +jsonData);
        console.log("Object.keys(jsonData) is: " + Object.keys(jsonData));
        console.log("Object.keys(jsonData[0]) is: " + Object.keys(jsonData[0]));
        //console.log("Object.keys(jsonData[0].SomeData is: " + Object.keys(jsonData[0].SomeData));
        //The previous line raises an Error: TypeError: Cannot convert undefined or null to object

        console.log("\njsonData[0].SomeData: " +jsonData[0].SomeData);

        count = jsonData[0].SomeData;

        console.log("JSON.stringify(count): " + JSON.stringify(count)); 
     });

});

以上node.js代码的日志如下:

json is: [{"SomeData":null}]
jsonData is: [object Object]
Object.keys(jsonData) is: 0
Object.keys(jsonData[0]) is: SomeData

jsonData[0].SomeData: null
JSON.stringify(count): null

如您所见,它们返回为 null,但是当我这次尝试使用 Python 访问相同的 API 时,它返回了预期的正确值:

import json
import requests

api_url = 'some-api-url'

response = requests.get(api_url, headers={'Content-Type': 'application/json'})
print(response.status_code)
loaded = json.loads(response.content.decode('utf-8'))
print(loaded)

来自上述 Python 代码的日志:

200
[{'SomeData': 2893}]

我别无选择,只能为这个项目使用节点。我错过了什么?这里似乎有什么问题?

附:如果我没有明确表达我的观点,我对上面的 Node 和 Python 代码使用完全相同的 API。

【问题讨论】:

  • 根据this example,您应该可以调用https.get('some_api_url', function(){...}),而不是传递主机和路径
  • @barbsan 我将其更改为该格式,仍然是相同的 API 响应。
  • 你比较过这两个查询的标题吗?
  • @barbsan 我没有,我该怎么做?
  • 您是仅在控制台还是某些浏览器中运行这些项目?或者你可以添加到js查询头'Content-Type': 'application/json'(我看到它是在python代码中设置的,但不是在js中)

标签: javascript python node.js python-3.x


【解决方案1】:

当我尝试更改 API pathString 中的参数时,我找到了问题的根本原因(出于安全考虑,我无法在此处发布实际的参数)

API 是这样的

pathString = '/api/SomeAPI/Start?Query=SomeData&Account=USER\sean1234&needed=0';

我为“Account”尝试了不同的有效用户帐户值,直到我最终用一个统计为字母“b”的用户对其进行了测试,因此路径现在类似于:

pathString = '/api/SomeAPI/Start?Query=SomeData&Account=USER\brian3415&needed=0';

这个带有 \b 的 pathString 开始抛出错误:

throw new TypeError('请求路径包含非转义字符');

为了转义未转义的字符,我将“\”加倍为“\\”,因此路径:

pathString = '/api/SomeAPI/Start?Query=SomeData&Account=USER\\brian3415&needed=0';

这样,不再抛出错误 + API 最终返回具有正确整数的预期 JSON。

我觉得奇怪的是 API 仍然返回带有空值 [{"SomeData":null}] 的 JSON,而不是导致完全错误。更糟糕的是,我还有另一个具有不同参数的 API(将 pathString 中的“SomeData”更改为“SomeOtherData”),它实际上可以正常工作 - 返回正确的[{"SomeOtherData":123}] - 即使使用未转义的“\”。

【讨论】:

    猜你喜欢
    • 2017-12-30
    • 1970-01-01
    • 2023-01-02
    • 2017-08-13
    • 2016-11-27
    • 1970-01-01
    • 2021-04-17
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多