响应编码与node.js“请求”模块
我正在尝试从BingsearchAPI获取数据,而且由于现有的库似乎基于旧的停用的API,所以我尝试使用request
库,这似乎是最常见的库。 我的代码看起来像
var SKEY = "myKey...." , ServiceRootURL = 'https://api.datamarket.azure.com/Bing/Search/v1/Composite'; function getBingData(query, top, skip, cb) { var params = { Sources: "'web'", Query: "'"+query+"'", '$format': "JSON", '$top': top, '$skip': skip }, req = request.get(ServiceRootURL).auth(SKEY, SKEY, false).qs(params); request(req, cb) } getBingData("bookline.hu", 50, 0, someCallbackWhichParsesTheBody)
Bing返回一些JSON,我可以使用它, 但如果响应正文包含大量的非ASCII字符JSON.parse
抱怨该string格式不正确。 我尝试切换到一个ATOM内容types,但没有区别,该XML是无效的。 检查request()
callback中提供的响应主体实际上显示错误的代码。
所以我尝试了一些Python代码的相同的请求,似乎一直工作正常。 以供参考:
r = requests.get( 'https://api.datamarket.azure.com/Bing/Search/v1/Composite?Sources=%27web%27&Query=%27sexy%20cosplay%20girls%27&$format=json', auth=HTTPBasicAuth(SKEY,SKEY)) stuffWithResponse(r.json())
我无法用较小的响应来重现问题(例如限制结果的数量),并且无法确定导致问题的单个结果(通过加大偏移量)。 我的印象是,响应以块读取,以某种方式进行代码转换,并以不好的方式重新组合,这意味着如果多字节字符被拆分,json / atom数据就会失效,这种情况发生在较大的响应上,而不是小的响应。
作为节点的新手,我不确定是否应该做些什么(将编码设置在某处?Bing会返回UTF-8,所以这似乎不需要)。
任何人都知道发生了什么?
FWIW,我在OSX 10.8上,节点是通过macports安装的v0.8.20,请求是通过npm安装的v2.14.0。
我不确定请求库,但默认nodejs一个适合我的。 它看起来好像比你的图书馆更容易阅读,确实是以大块的forms回来的。
http://nodejs.org/api/http.html#http_http_request_options_callback或https(像你的请求) http://nodejs.org/api/https.html#https_https_request_options_callback (尽pipe如此)
对于一个小技巧的选项:使用URLparsing
var url = require('url'); var params = '{}' var dataURL = url.parse(ServiceRootURL); var post_options = { hostname: dataURL.hostname, port: dataURL.port || 80, path: dataURL.path, method: 'GET', headers: { 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': params.length } };
显然params需要是你想发送的数据
我认为你的请求authentication是不正确的。 请在request.get之前提供validation。 请参阅请求HTTP身份validation的文档。 qs
是一个必须传递给请求选项的对象,就像url和auth一样。 另外,你正在使用相同的请求第二次请求。 你应该知道request.get返回给定的url的GETstream。 您使用req
下一个请求将出错。
如果你只需要HTTPBasicAuth,这也应该工作
//remove req = request.get and subsequent request request.get('http://some.server.com/', { 'auth': { 'user': 'username', 'pass': 'password', 'sendImmediately': false } },function (error, response, body) { });
callback参数获取3个参数。 首先是适用的错误(通常来自http.Client选项而不是http.ClientRequest对象)。 第二个是http.ClientResponse对象。 第三个是响应体String或Buffer。 第二个对象是响应stream。 要使用它,你必须使用事件'数据','结束','错误'和'closures'。
一定要正确使用参数。
您必须传递选项{json:true}以启用jsonparsing响应