2013-02-22 100 views
7

मैं बिंग सर्च एपीआई से डेटा प्राप्त करने की कोशिश कर रहा हूं, और चूंकि मौजूदा पुस्तकालय पुराने बंद एपीआई पर आधारित प्रतीत होते हैं, हालांकि मैं 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) 

लग रहा है बिंग कुछ JSON वापस आती है और मैं इसके साथ काम कर सकते हैं कभी कभी लेकिन अगर प्रतिक्रिया शरीर गैर ASCII वर्ण की एक बड़ी राशि JSON.parse शिकायत है कि स्ट्रिंग विकृत है शामिल हैं। मैंने एटीओएम सामग्री प्रकार पर स्विच करने का प्रयास किया, लेकिन कोई फर्क नहीं पड़ता, एक्सएमएल अवैध था। request() कॉलबैक में उपलब्ध प्रतिक्रिया निकाय का निरीक्षण वास्तव में खराब कोड दिखाता है।

इसलिए मैंने कुछ पायथन कोड के साथ एक ही अनुरोध की कोशिश की, और यह हर समय ठीक काम करता प्रतीत होता है। संदर्भ के लिए:

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

मैं एक ही परिणाम है जो इस मुद्दे (ऊपर कदम ऑफसेट द्वारा) का कारण बनता है पहचान करने के लिए छोटे प्रतिक्रियाओं (जैसे परिणामों की संख्या को सीमित) के साथ समस्या यह पुन: पेश करने में असमर्थ और असमर्थ हूँ। मेरी धारणा यह है कि प्रतिक्रिया भाग में पढ़ी जाती है, किसी भी तरह से ट्रांसकोड किया जाता है और खराब तरीके से फिर से इकट्ठा किया जाता है, जिसका अर्थ है कि कुछ मल्टीबाइट चरित्र विभाजित होने पर जेसन/परमाणु डेटा अमान्य हो जाता है, जो बड़े प्रतिक्रियाओं पर होता है लेकिन छोटे नहीं होते हैं।

नोड के लिए नया होने के नाते, मुझे यकीन नहीं है कि मुझे कुछ करना चाहिए (कहीं एन्कोडिंग सेट करना? बिंग यूटीएफ -8 लौटाता है, इसलिए यह आवश्यक नहीं लगता है)।

किसी को भी क्या पता चल रहा है इसका कोई विचार है?

एफडब्ल्यूआईडब्ल्यू, मैं ओएसएक्स 10.8 पर हूं, नोड v0.8.20 मैकपोर्ट्स के माध्यम से स्थापित है, अनुरोध v2.14.0 npm के माध्यम से स्थापित है।

उत्तर

1

मुझे अनुरोध पुस्तकालय के बारे में निश्चित नहीं है लेकिन डिफ़ॉल्ट नोडज एक मेरे लिए अच्छा काम करता है। यह आपकी लाइब्रेरी से पढ़ने के लिए बहुत आसान लगता है और वास्तव में वापस भाग में वापस आ जाता है।

http://nodejs.org/api/http.html#http_http_request_options_callback या https (आपके अनुरोध की तरह) के लिए http://nodejs.org/api/https.html#https_https_request_options_callback (समान वास्तव में, हालांकि)

विकल्पों के लिए एक छोटे से टिप: उपयोग यूआरएल को पार्स

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

जाहिर पैरामीटर डेटा आप की जरूरत है

+0

TBH की json पार्स सक्षम करने के लिए (हालांकि 'का उपयोग कर https.get' बल्कि' से .request') भी मैं इसे इस तरह से करने की कोशिश की थी लेकिन मैं इसे काम नहीं कर सका, मुझे कुछ गलत होना चाहिए था। वैसे भी यह अब काम करने लगता है, इसलिए अगर कोई 'अनुरोध' मॉड्यूल का उपयोग करने के लिए कोई फिक्स प्रदान नहीं करता है तो मैं आपका जवाब स्वीकार करूंगा। धन्यवाद! – riffraff

+1

इस तथ्य के साथ और अधिक हो सकता है कि JSON वास्तव में विकृत है। यदि आपके पास एक मल्टीबाइट वर्ण वाला स्ट्रिंग है और आप 'सामग्री-लंबाई' को 'params.length' के रूप में पास करते हैं, तो आप कह रहे हैं कि स्ट्रिंग में वर्णों की संख्या के समान सामग्री की बाइट लंबाई है। यह multibyte वर्णों के साथ सच नहीं है। '{" नाम ":" फीस "} के बजाय, आपका एपीआई शायद' {"नाम" प्राप्त कर रहा है: "फीस" ' – amsross

0

मुझे लगता है कि आपका अनुरोध प्रमाणीकरण गलत है। Request.get से पहले प्रमाणीकरण प्रदान किया जाना है। request HTTP authentication के लिए प्रलेखन देखें। qs एक ऑब्जेक्ट है जिसे यूआरएल और ऑथ की तरह request options पर पास किया जाना है। इसके अलावा आप दूसरे अनुरोध के लिए req का उपयोग कर रहे हैं। आपको यह अनुरोध पता होना चाहिए। यूआरएल दिए गए यूआरएल के लिए एक स्ट्रीम देता है। 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 ऑब्जेक्ट है। तीसरा प्रतिक्रिया शरीर स्ट्रिंग या बफर है। दूसरी वस्तु प्रतिक्रिया स्ट्रीम है। इसका उपयोग करने के लिए आपको ईवेंट 'डेटा', 'एंड', 'एरर' और 'क्लोज' का उपयोग करना होगा।

तर्कों का सही ढंग से उपयोग करना सुनिश्चित करें।

+0

नहीं, धाराप्रवाह वाक्यविन्यास विकल्पों को सही तरीके से सेट करता है, यह केवल काफी खराब दस्तावेज है। मेरी समस्या प्रमाणीकरण नहीं है, मैं देख सकता हूं कि यह काम करता है और मुझे एक गंभीर प्रतिक्रिया मिलती है। मेरा मुद्दा उलझन में प्रतिक्रिया शरीर है। – riffraff

0

आप विकल्प को {json: सच} पास करना प्रतिक्रिया

+0

समस्या एन्कोडिंग है, स्वरूप नहीं, अगर आप सवाल पढ़ते हैं तो मैंने एटीओएम के साथ भी कोशिश की। लेकिन सवाल 18 महीने पुराना है, इसलिए उम्मीद है कि उन्होंने इसे ठीक कर दिया है। – riffraff

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^