मैं बिंग सर्च एपीआई से डेटा प्राप्त करने की कोशिश कर रहा हूं, और चूंकि मौजूदा पुस्तकालय पुराने बंद एपीआई पर आधारित प्रतीत होते हैं, हालांकि मैं 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 के माध्यम से स्थापित है।
TBH की json पार्स सक्षम करने के लिए (हालांकि 'का उपयोग कर https.get' बल्कि' से .request') भी मैं इसे इस तरह से करने की कोशिश की थी लेकिन मैं इसे काम नहीं कर सका, मुझे कुछ गलत होना चाहिए था। वैसे भी यह अब काम करने लगता है, इसलिए अगर कोई 'अनुरोध' मॉड्यूल का उपयोग करने के लिए कोई फिक्स प्रदान नहीं करता है तो मैं आपका जवाब स्वीकार करूंगा। धन्यवाद! – riffraff
इस तथ्य के साथ और अधिक हो सकता है कि JSON वास्तव में विकृत है। यदि आपके पास एक मल्टीबाइट वर्ण वाला स्ट्रिंग है और आप 'सामग्री-लंबाई' को 'params.length' के रूप में पास करते हैं, तो आप कह रहे हैं कि स्ट्रिंग में वर्णों की संख्या के समान सामग्री की बाइट लंबाई है। यह multibyte वर्णों के साथ सच नहीं है। '{" नाम ":" फीस "} के बजाय, आपका एपीआई शायद' {"नाम" प्राप्त कर रहा है: "फीस" ' – amsross