为什么我从这个http请求得到空的响应

时间:2017-11-13 22:59:28

标签: json node.js httprequest httpresponse

我正在处理我的第一个node.js脚本,它只是向https://www.swapi.co/api/people/?search=Luke+发出http请求并解析响应数据。

端点如下:

var options = {
  host: 'www.swapi.co',
  path: `/api/people/?search=`+firstName+'+'+lastName
};

逻辑是从响应中获取数据并将其解析为person对象:

makeRequest(options, function( data, error) {
    let person = data.results[0];
    if (person) {
        let height = person.height;
        let response = person.name + " is " + height + " centimeters tall.";
        callback(null, {"speech": response});
    }
    else {
        callback(null, {"speech": "I'm not sure!"});
    }
  });

makerequest功能的定义如下:

function makeRequest(options, callback) {
    var request = http.request(options, 
    function(response) {
        var responseString = '';
        response.on('data', function(data) {
            responseString += data;
        });
         response.on('end', function() {
            console.log('end: $$$' + responseString + '$$$');
            var responseJSON = JSON.parse(responseString);
            callback(responseJSON, null);
        });
    });
    request.end();
}

当我运行脚本时,我收到了有关解析JSON的错误。

Unexpected end of JSON input
    at Object.parse (native)
    at IncomingMessage.<anonymous> (/var/task/index.js:42:37)
    at emitNone (events.js:91:20)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:80:11)
    at process._tickDomainCallback (internal/process/next_tick.js:128:9)

我使用Postman测试了端点并获得了以下JSON作为响应:

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "name": "Luke Skywalker",
            "height": "172",
            "mass": "77",
            "hair_color": "blond",
            "skin_color": "fair",
            "eye_color": "blue",
            "birth_year": "19BBY",
            "gender": "male",
            "homeworld": "https://www.swapi.co/api/planets/1/",
            "films": [
                "https://www.swapi.co/api/films/2/",
                "https://www.swapi.co/api/films/6/",
                "https://www.swapi.co/api/films/3/",
                "https://www.swapi.co/api/films/1/",
                "https://www.swapi.co/api/films/7/"
            ],
            "species": [
                "https://www.swapi.co/api/species/1/"
            ],
            "vehicles": [
                "https://www.swapi.co/api/vehicles/14/",
                "https://www.swapi.co/api/vehicles/30/"
            ],
            "starships": [
                "https://www.swapi.co/api/starships/12/",
                "https://www.swapi.co/api/starships/22/"
            ],
            "created": "2014-12-09T13:50:51.644000Z",
            "edited": "2014-12-20T21:17:56.891000Z",
            "url": "https://www.swapi.co/api/people/1/"
        }
    ]
}

但是,当我调试代码时,响应数据是一个空字符串。这解释了JSON错误。

我的http请求有什么问题?为什么我没有得到正确答案?

2 个答案:

答案 0 :(得分:1)

您定位的API似乎仅支持SSL,但Node的HTTP库仅支持纯文本请求。请尝试使用他们的HTTPS库。

var https = require('https');
var request = https.request(options, ...);

答案 1 :(得分:0)

您使用的网址默认返回HTML。

相反,您需要致电:https://www.swapi.co/api/people/?format=json&search=Luke+

(注意format=json参数)