Я пытаюсь получить данные из API поиска Bing, а поскольку существующие библиотеки, по-видимому, основаны на старых API-интерфейсах, которые я прекратил использовать, хотя я бы попытался использовать библиотеку request
, который, как представляется, является наиболее распространенной библиотекой для этого. Мой код выглядитКодирование ответа с помощью модуля «request» node.js
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, узел v0.8.20 установлен через macports, запрос v2.14.0 установлен через npm.
ТБХ я пытался сделать это таким образом (хотя с помощью 'https.get' вместо' .request') слишком но я не мог заставить его работать, должно быть, у меня что-то не так. В любом случае, похоже, он работает сейчас, поэтому я буду принимать ваш ответ в любом случае, если кто-то не предоставит исправления для использования модуля 'request'. Благодаря! – riffraff
Возможно, это связано скорее с тем, что JSON на самом деле искажен. Если в нем есть строка с многобайтовым символом, и вы передаете 'Content-Length' как' params.length', то вы говорите, что содержание имеет ту же длину байта, что и количество символов в строке. Это неверно для многобайтовых символов. Вместо '{" name ":" feeé "}', ваш api, вероятно, получает '{" name ":" feeé "' – amsross