我正在尝试从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,所以这似乎不需要)。
任何人都知道发生了什么事?
FWIW,我在OSX 10.8上,节点是通过macports安装的v0.8.20,请求是通过npm安装v2.14.0。
答案 0 :(得分:1)
我不确定请求库,但默认的nodejs对我来说效果很好。它看起来比你的图书馆看起来容易得多,而且确实以大块的形式回归。
http://nodejs.org/api/http.html#http_http_request_options_callback 或者用于https(如你的请求)http://nodejs.org/api/https.html#https_https_request_options_callback(尽管如此)
对于选项一点提示:使用url parse
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需要是您要发送的数据
答案 1 :(得分:0)
我认为您的请求身份验证不正确。必须在request.get之前提供身份验证。
请参阅request HTTP authentication的文档。 qs
是一个必须像url和auth一样传递给request options的对象。
您也使用相同的req
作为第二个请求。您应该知道request.get返回给定的URL的GET流。您使用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) {
});
回调参数有3个参数。第一个是适用时的错误(通常来自http.Client选项而不是http.ClientRequest对象)。第二个是http.ClientResponse对象。第三个是响应主体String或Buffer。 第二个对象是响应流。要使用它,您必须使用事件'数据','结束','错误'和'关闭'。
请务必正确使用参数。
答案 2 :(得分:0)
您必须传递选项{json:true}以启用响应的json解析