2017-04-11 15 views
10

के साथ प्रतिक्रिया शीर्षलेख पढ़ना "*://*/*" के लिए अनुमतियों के साथ मैं Google क्रोम एक्सटेंशन में हूं और मैं XMLHttpRequest से Fetch API पर स्विच करने की कोशिश कर रहा हूं।Fetch API

एक्सटेंशन उपयोगकर्ता-इनपुट लॉगिन डेटा संग्रहीत करता है जो HTTP एथ के लिए सीधे XHR के खुले() कॉल में रखा जाता है, लेकिन Fetch के तहत अब पैरामीटर के रूप में उपयोग नहीं किया जा सकता है। HTTP मूल प्रमाणीकरण के लिए, इस सीमा को धोखा तुच्छ है, तो आप मैन्युअल रूप से एक प्राधिकरण हैडर सेट कर सकते हैं के रूप में:

fetch(url, { 
    headers: new Headers({ 'Authorization': 'Basic ' + btoa(login + ':' + pass) }) 
    } }); 

HTTP Digest Auth तथापि अधिक अन्तरक्रियाशीलता की आवश्यकता है; आपको उन पैरामीटर को पढ़ने की आवश्यकता है जो सर्वर आपको वैध प्राधिकरण टोकन तैयार करने के लिए 401 प्रतिक्रिया के साथ भेजता है। मैं इस स्निपेट के साथ WWW-Authenticate प्रतिक्रिया हेडर फ़ील्ड पढ़ने की कोशिश की है:

fetch(url).then(function(resp) { 
    resp.headers.forEach(function(val, key) { console.log(key + ' -> ' + val); }); 
} 

लेकिन सभी मैं इस उत्पादन है:

content-type -> text/html; charset=iso-8859-1 

कौन सा अपने आप में सही है, लेकिन है कि अभी भी लगभग 6 अधिक क्षेत्रों कमी है क्रोम के डेवलपर टूल्स के मुताबिक। अगर मैं resp.headers.get("WWW-Authenticate") (या उस मामले के लिए किसी भी अन्य फ़ील्ड) का उपयोग करता हूं, तो मुझे केवल null मिलता है।

Fetch API का उपयोग कर उन अन्य क्षेत्रों में जाने का कोई मौका?

उत्तर

7

जब आप सीओआरएस पर Fetch API का उपयोग कर रहे हैं तो प्रतिक्रिया शीर्षकों तक पहुंचने के लिए एक प्रतिबंध है। आप कारण इस प्रतिबंध, आप मानक हेडर केवल इन पर पहुंच सकता:

  • Cache-Control
  • Content-Language
  • Content-Type
  • Expires
  • Last-Modified
  • Pragma

जब आप Google क्रोम एक्सटेंशन के लिए कोड लिख रहे हैं, तो आप CORS का उपयोग कर रहे हैं, इसलिए आप सभी शीर्षकों तक नहीं पहुंच सकते हैं। आप सर्वर को नियंत्रित हैं, तो आप के बजाय प्रतिक्रिया body में कस्टम जानकारी लौट सकते हैं इस प्रतिबंध पर headers

अधिक जानकारी - https://developers.google.com/web/updates/2015/03/introduction-to-fetch#response_types

+0

@jules सीओआरएस के लिए यह प्रतिबंध 'एक्सेस-कंट्रोल-एक्सपोज़-हेडर 'या संभवतः' एक्सेस-कंट्रोल-स्वीट-हेडर 'में मानों का सम्मान करता है (हम इसे दोनों में डालते हैं)। – jacob

+0

'एक्सेस-कंट्रोल-एक्सपोज़-हेडर' ने सर्वर से लौटे हेडर के लिए मेरे लिए काम किया - फिर हेडर फ़ेच प्रतिक्रिया हेडर ऑब्जेक्ट के माध्यम से उपलब्ध हैं। और सर्वर पर अनुरोध शीर्षलेखों को अनुमति देने के लिए 'एक्सेस-कंट्रोल-स्वीट-हेडर' का उपयोग किया गया था (या मुझे सर्वर से एक त्रुटि संदेश मिलेगा) – specimen

+1

यह बेवकूफ है कि यह प्राप्त करने के साथ संभव नहीं है, लेकिन XmlHttpRequest के साथ किया जा सकता है। सुरक्षा लाभ क्या है यदि यह अभी भी कामकाज के साथ संभव है? – sebas

3

MDN

से तुम भी प्रविष्टियों इटरेटर एक्सेस करके सभी हेडर प्राप्त कर सकते हैं।

// Display the key/value pairs 
for (var pair of res.headers.entries()) { 
    console.log(pair[0]+ ': '+ pair[1]); 
} 

इसके अलावा, मन this भाग में रखें:

सुरक्षा कारणों से, कुछ हेडर केवल उपयोगकर्ता एजेंट द्वारा नियंत्रित किया जा सकता है। इन शीर्षकों में वर्जित हेडर नाम और वर्जित प्रतिक्रिया शीर्षलेख नाम शामिल हैं।

+0

इटरेटर का उपयोग कर एक ही आउटपुट प्रस्तुत करता है, केवल सामग्री-प्रकार फ़ील्ड।और वर्जित हेडर नामों की सूचियां केवल संशोधन पर लागू होती हैं, और 'WWW-प्रमाणीकरण' या तो सूचीबद्ध नहीं है। – jules

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