我正在尝试从Bing搜索API中获取数据,由于现有的库似乎是基于已停用的旧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会抱怨字符串格式不正确。我尝试切换到ATOM内容类型,但没有任何区别,xml无效。在request()回调中提供的响应主体实际上显示了错误代码。因此,我尝试使用一些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,因此似乎不需要这样做)。
任何人都有任何想法吗?
顺便说一下,我正在使用OSX 10.8,node是通过macports安装的v0.8.20,请求是通过npm安装的v2.14.0。
https.get
而不是.request
),但是我无法让它正常工作,我一定做错了什么。不管怎样,现在看起来它能正常工作了,所以如果没有人提供使用request
模块的修复方法,我还是会接受你的答案。谢谢! - riffraffContent-Length
作为params.length
传递,则表示内容的字节长度与字符串中字符数相同。这在多字节字符中是不正确的。您的API可能会收到{"name": "feeé"
而不是{"name": "feeé"}
。 - amsross