2013-02-22 28 views
7

Bing arama API'sinden veri almaya çalışıyorum ve var olan kitaplıklar eski üretilmemiş API'lere dayanıyor gibi görünüyorsa da, request kitaplığını kullanarak kendim denedim Bunun için en yaygın kütüphane gibi görünüyor. Kodumnode.js "istek" modülü ile yanıt kodlaması

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) 

benziyor Bing bazı JSON döndüren ve tepki vücut dizesi biçimi bozuktur şikayet JSON.parse olmayan ASCII karakterleri büyük miktarda içeriyorsa onunla bazen ama çalışabilir. Bir ATOM içerik türüne geçmeyi denedim, ancak fark olmadı, xml geçersizdi. Yanıt gövdesinin request() geri çağrısında kullanılabilir olarak incelenmesi, aslında hatalı kod gösterir.

Aynı isteği bir python koduyla denedim ve bu her zaman iyi çalışıyor gibi görünüyor. Referans için:

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()) 

I (ofset hızlandırarak) soruna neden tek bir sonuç tespit etmek (örneğin, sonuç sayısının sınırlandırılması) daha küçük yanıtlarıyla sorunu yeniden yapamaz ve am yapamaz. Benim izlenimim, yanıtların bir şekilde okunması, bir şekilde kod dönüştürülmesi ve kötü bir şekilde yeniden bir araya getirilmesidir. Bu, bazı çokbaytlı karakterlerin bölünmesi durumunda json/atom verilerinin geçersiz hale geldiği anlamına gelir, bu da daha büyük yanıtlarda gerçekleşir, ancak küçük olmayanlar için geçerlidir.

Düğüm için yeni olmakla, yapmam gereken bir şey olup olmadığından emin değilim (kodlamayı bir yerde ayarlama? Bing, UTF-8'i döndürür, bu nedenle gerekli görünmüyor).

Neler olup bittiği hakkında herhangi bir fikri olan var mı?

FWIW, OSX 10.8'deyim, node v0.8.20 macports üzerinden kuruldu, istek vpm.14.0 npm aracılığıyla kuruldu.

cevap

1

İstek kitaplığı konusunda emin değilim ama varsayılan nodejs biri benim için iyi çalışıyor. Kitaplığınızdan okumak çok daha kolay görünüyor ve gerçekten de parçalara dönüşüyor.

http://nodejs.org/api/http.html#http_http_request_options_callback ya da (senin req gibi) https için

http://nodejs.org/api/https.html#https_https_request_options_callback

seçenek için biraz ipucu (gerçekten olsa aynı): Kullanım url açıkça params

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 
    } 
}; 

ayrıştırmak verileri olması gerekir

+0

TBH ait json ayrıştırılması anlamında çok ama işe yaramazdım, yanlış bir şeyim olmalı. Her neyse, şimdi çalışıyor gibi görünüyor, bu yüzden birisi 'request' modülünü kullanmak için bir düzeltme sağlamazsa cevabınızı kabul ediyorum. Teşekkürler! – riffraff

+1

JSON'un aslında bozuk olduğu gerçeğiyle daha fazla ilgisi olabilir. İçinde çok baytlı bir karakter dizisi varsa ve 'İçerik Uzunluğu'nu 'params.length' olarak iletirseniz, içeriğin dizedeki karakter sayısıyla aynı bayt uzunluğuna sahip olduğunu söylüyorsunuz. Bu, çok baytlı karakterler ile doğru değildir. "{" Name ":" feeé "}' yerine, api muhtemelen '{"name": "feeé" – amsross

0

Göndermek istediğiniz istek doğrulaması yanlıştır. Kimlik doğrulama, request.get'den önce sağlanmalıdır. request HTTP authentication belgelerine bakın. qs, URL ve auth gibi request options'a geçirilmesi gereken bir nesnedir. Ayrıca ikinci istek için aynı req kullanıyorsunuz. Request.get'in verilen URL'nin GET'i için bir akış döndürdüğünü bilmelisiniz. Bir sonraki isteğiniz req kullanarak yanlış gidecek. Yalnızca HTTPBasicAuth gerekiyorsa

, bu da geri arama argüman 3 argümanları alır

//remove req = request.get and subsequent request 
request.get('http://some.server.com/', { 
    'auth': { 
    'user': 'username', 
    'pass': 'password', 
    'sendImmediately': false 
    } 
},function (error, response, body) { 
}); 

çalışmalıdır. Birincisi, uygulanabilir olduğunda bir hatadır (genellikle http.Client seçeneğinden değil, http.ClientRequest nesnesinden). İkincisi bir http.ClientResponse nesnesidir. Üçüncüsü, yanıt gövdesi String veya Buffer'dır. İkinci nesne, yanıt akışıdır. Kullanmak için 'data', 'end', 'error' ve 'close' olaylarını kullanmalısınız.

doğru argümanlar kullanmaya dikkat edin

.

+0

no'yu almayı gerektiriyor, akıcı sözdizimi seçenekleri doğru şekilde ayarlıyor, sadece oldukça zayıf bir şekilde belgelendi. Sorunum kimlik doğrulama değil, çalıştığını görebiliyorum ve onaylanmış bir yanıt alıyorum. Benim meselem karışık yanıt gövdesi. – riffraff

0

Sen seçeneği {json: true} geçmek zorunda (https.get` yerine `den` kullanarak gerçi .request`) ben bu şekilde yapmaya çalıştık tepki

+0

sorunu, ATOM ile de denediğim soruyu okursanız, formatlamamaktadır. Ama soru 18 aylık, yani umarım düzeltmişlerdir. – riffraff

İlgili konular