响应编码与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。

       

网上收集的解决方案 "响应编码与node.js“请求”模块"

我不确定请求库,但默认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响应