dan*_*cat 7 json curl google-chrome node.js postman
我现在已经把头发撕成了几个小时了.
我有一个简单的Node服务器,它调用外部API来获取(大量的,像4+ MB)JSON位.我正在使用你作为样板文件的一个请求,直接来自Node文档:
const muniURL = `http://api.511.org/transit/vehiclemonitoring?api_key=${API_KEYS.API_KEY_511}&format=json&agency=sf-muni`;
http.get(muniURL, (res) => {
const statusCode = res.statusCode;
const contentType = res.headers['content-type'];
console.log('Status Code:', statusCode);
console.log('Content Type:', contentType);
let error;
if (statusCode !== 200) {
error = new Error(`Request Failed.\n` +
`Status Code: ${statusCode}`);
} else if (!/^application\/json/.test(contentType)) {
error = new Error(`Invalid content-type.\n` +
`Expected application/json but received ${contentType}`);
}
if (error) {
console.log(`Request error: ${error.message}`);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => rawData += chunk);
res.on('end', () => {
try {
const parsedData = JSON.parse(rawData);
console.log('parsedData:', parsedData);
} catch (e) {
console.log(`Caught error: ${e.message}`);
}
});
}).on('error', (e) => {
console.log(`Got error: ${e.message}`);
});
Run Code Online (Sandbox Code Playgroud)
......每一次,它都会在catch声明中出现:
Caught error: Unexpected token in JSON at position 0.(注意'token'和'in'之间的两个空格.)
我已经使用两个不同的基于Web的JSON验证器检查了Chrome和Postman返回的JSON,并且它返回有效.写入rawData文件看起来像缓冲区(?)...
1fef bfbd 0800 0000 0000 0400 efbf bdef
bfbd efbf bd72 efbf bdc8 b62d efbf bd2b
0c3f 7547 1cef bfbd 00ef bfbd efbf bd0b
efbf bd5b 49ef bfbd 2def bfbd 6c6b efbf
bd5c 55ef bfbd efbf bd44 3fef bfbd 126c
71ef bfbd 021c 2029 6def bfbd 13ef bfbd
efbf bdef bfbd 437f 52ef bfbd 4227 48ef
bfbd efbf bd4d efbf bd31 13ef bfbd 09ef
bfbd 5d2f 7bef bfbd efbf bde5 aa81 745e
efbf bd65 efbf bd31 efbf bdef bfbd efbf
...
Run Code Online (Sandbox Code Playgroud)
... Buffer.isBuffer回来假.
到目前为止,我已经尝试过JSON.stringify第一次,toString转换为a new Buffer,然后进行字符串化,.trim处理白色空间以及replace各种各样的转义字符,但都无济于事.
我在这里错过了什么?
编辑:我意识到我正在验证Chrome和Postman提取的JSON,显然它正在进行某种预处理.curlURL会产生一大堆混乱,绝对不是JSON.仍然留下了实际上是什么数据类型的问题,以及为什么当我特别要求它时我没有得到JSON.
Roc*_*ims 11
似乎api.511.org正在将gzip应用于任何提供有效api_key的api调用.它还在json响应中返回一个无效的第一个字符.
这是一个解决方法:
var request = require('request');
var apiUrl = 'http://api.511.org/transit/vehiclemonitoring?api_key=${API_KEYS.API_KEY_511}&format=json&agency=sf-muni';
//apiUrl = 'http://ip.jsontest.com/';
var response = request({
method: 'GET',
uri: apiUrl,
gzip: true
}, function(error, response, body) {
//* workaround for issue with this particular apiUrl
var firstChar = body.substring(0, 1);
var firstCharCode = body.charCodeAt(0);
if (firstCharCode == 65279) {
console.log('First character "' + firstChar + '" (character code: ' + firstCharCode + ') is invalid so removing it.');
body = body.substring(1);
}
//*/
var parsedJson = JSON.parse(body);
console.log('parsedJson: ', parsedJson);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17457 次 |
| 最近记录: |