请求堆栈溢出API返回怪异的响应
我正在使用下面的代码来调用堆栈溢出API:
var request = require('request'); var url = 'http://api.stackexchange.com/2.2/search?order=desc&sort=activity&tagged=node.js&intitle=node.js&site=stackoverflow'; request({ headers: { 'Accept': 'application/json; charset=utf-8', 'User-Agent': 'RandomHeader' }, uri: url, method: 'GET' }, function(err, res, body) { console.log("response.statusCode" + res.statusCode); console.log("response.headers" + JSON.stringify(res.headers)); console.log("res" + JSON.stringify(res)); console.log("resParse" + JSON.parse(res)); });
}
这段代码以奇怪的字符的forms返回响应:
res{"statusCode":200,"body":"\u001f \b\u0000\u0000\u0000\u0000\u0000\u0004\u0000 { H \n I ]M ̬U 5ݳ7= 3 ک mݝN L t \u0005\\\u001e h E q ] \\ \u0011 ɏxe \" \\ o J? \u001f o jq X < A?ݸv6Z \u0012~F N v ?7 | bq ۢ mՈ Ŷ Cj\u0016 b I \u001e \u001b iY \u001aw \"Oҕ}H ѝ\\Vզ \r\u0002 m c\u001b : \bsJ\u0010f \u0012 M\u001aW ¾w ߭t\u0001\u001an\u0016&-7+ ) _ Oz } \u0005 \\ *p \u0016 * p Y\u0006 m\u0007e- ?: o\u0016i rW m W Y< v \u0010 ۬ ˛E3 ; n\u0016e \u0017 e *}J \u0015\u001c 0,B \".l # e} -*\u0015 \u0018 gӉ A'\u0013\u001c \u0014 o\u001f3 undefined:1 [object Object]
res{"statusCode":200,"body":"\u001f \b\u0000\u0000\u0000\u0000\u0000\u0004\u0000 { H \n I ]M ̬U 5ݳ7= 3 ک mݝN L t \u0005\\\u001e h E q ] \\ \u0011 ɏxe \" \\ o J? \u001f o jq X < A?ݸv6Z \u0012~F N v ?7 | bq ۢ mՈ Ŷ Cj\u0016 b I \u001e \u001b iY \u001aw \"Oҕ}H ѝ\\Vզ \r\u0002 m c\u001b : \bsJ\u0010f \u0012 M\u001aW ¾w ߭t\u0001\u001an\u0016&-7+ ) _ Oz } \u0005 \\ *p \u0016 * p Y\u0006 m\u0007e- ?: o\u0016i rW m W Y< v \u0010 ۬ ˛E3 ; n\u0016e \u0017 e *}J \u0015\u001c 0,B \".l # e} -*\u0015 \u0018 gӉ A'\u0013\u001c \u0014 o\u001f3 undefined:1 [object Object]
相同的代码适用于不同的API调用。 有人可以build议出了什么问题?
Stackoverflow使用压缩来响应您的请求。 我已经得到正确的回应使用以下内容:
var request = require('request'); var url = 'http://api.stackexchange.com/2.2/search?order=desc&sort=activity&tagged=node.js&intitle=node.js&site=stackoverflow'; request({ headers: { 'Accept': 'application/json; charset=utf-8', 'User-Agent': 'RandomHeader' }, uri: url, method: 'GET', gzip: true }, function(err, res, body) { console.log("response.statusCode" + res.statusCode); console.log('server encoded the data as: ' + (res.headers['content-encoding'] || 'identity')) console.log('the decoded data is: ' + body) });
我的第一个回答是你应该谷歌JS承诺。 我的第一个猜测是它必须是promisified对象。 如果它是一个图像,由于JSasynchronous性质,你必须首先promisify它。 如果不是诺言,那是造成这个问题的原因,确保它是“UTF-8”支持的语言。