Ich versuche, Daten von der Bing-Such-API abzurufen, und da die vorhandenen Bibliotheken auf alten, abgekündigten APIs basieren, würde ich mich selbst mit der request
-Bibliothek versuchen. Dies scheint die gebräuchlichste Bibliothek dafür zu sein. Mein Code sieht aus wieAntwortcodierung mit dem Modul "request" von 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)
gibt Bing einige JSON und ich kann manchmal aber mit ihm arbeiten, wenn die Antwort Körper eine große Menge an nicht-ASCII-Zeichen enthält JSON.parse
beklagt, dass der String ungültig ist. Ich habe versucht, zu einem ATOM-Inhaltstyp zu wechseln, aber es gab keinen Unterschied, das XML war ungültig. Das Überprüfen des Antwortkörpers, wie in dem Rückruf request()
verfügbar ist, zeigt tatsächlich fehlerhaften Code an.
Also habe ich die gleiche Anfrage mit etwas Python-Code versucht, und das scheint die ganze Zeit gut zu funktionieren. Als Referenz:
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())
Ich bin nicht in der Lage, das Problem mit kleineren Antworten zu reproduzieren und nicht in der Lage (zum Beispiel der Anzahl der Ergebnisse zu begrenzen) ein einzelnes Ergebnis zu identifizieren, die das Problem verursacht (durch den Offset verstärkt). Mein Eindruck ist, dass die Antwort in Chunks gelesen, irgendwie transcodiert und schlecht wieder zusammengesetzt wird, was bedeutet, dass die json/atom Daten ungültig werden, wenn ein Multibyte-Zeichen geteilt wird, was bei größeren Antworten passiert, aber nicht bei kleinen.
Da ich neu in Node bin, bin ich nicht sicher, ob es etwas gibt, was ich tun sollte (Einstellung der Kodierung irgendwo? Bing gibt UTF-8 zurück, so scheint dies nicht erforderlich).
Hat jemand eine Vorstellung von dem, was vor sich geht?
FWIW, ich bin auf OSX 10.8, Knoten ist v0.8.20 über MacPorts installiert, Anfrage ist v2.14.0 über npm installiert.
TBH, damit hatte ich versucht, es so zu tun (obwohl 'mit https.get' anstatt' .request') zu aber ich konnte es nicht zur Arbeit bringen, ich muss etwas falsch gemacht haben. Jedenfalls scheint es jetzt zu funktionieren, also werde ich Ihre Antwort trotzdem akzeptieren, wenn jemand keine Lösung für die Verwendung des Request-Moduls zur Verfügung stellt. Vielen Dank! – riffraff
Möglicherweise hat es mehr damit zu tun, dass der JSON tatsächlich fehlerhaft ist. Wenn Sie eine Zeichenfolge mit einem Multibyte-Zeichen darin haben und die 'Content-Length' als' params.length' übergeben, dann sagen Sie, dass der Inhalt dieselbe Bytelänge hat wie die Anzahl der Zeichen in der Zeichenfolge. Dies gilt nicht für Multibyte-Zeichen. Anstelle von '{" name ":" feeé "}' erhält Ihre API wahrscheinlich '{" name ":" feeé "' – amsross