2016-04-02 4 views
5

से असफल रहा है मुझे अपनी वेबसाइटों से तृतीय पक्ष डोमेन/सर्वर पर वेब सेवा कॉल करना है। जबकि मैं इस विधि को jQuery विधि के साथ पोस्ट विधि द्वारा सामग्री प्रकार के साथ बना रहा हूं: टेक्स्ट/सादा और यह ठीक काम कर रहा है।क्रॉस कॉल पोस्ट के साथ काम कर रहा है लेकिन प्री-फ्लाइट

लेकिन जब मैं इसे सामग्री प्रकार के लिए बदल रहा हूँ: text/xml फेंक जाता है:

रिस्पांस preflight अनुरोध अभिगम नियंत्रण जाँच में सफल नहीं करता है: नहीं 'पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति 'हेडर अनुरोधित संसाधन पर मौजूद है।

यहां तक ​​कि यह हमारी वेबसाइट तक पहुंच की अनुमति देने के लिए तृतीय पक्ष सर्वर पर भी सेट है। और सामग्री-प्रकार के साथ कॉल करते समय हमें यह हेडर मिल रहा है: टेक्स्ट/सादा।

हमने थर्डपार्टी सर्वर पर भी निम्नलिखित जोड़ा है।

Access-Control-Allow-Methods : Get , Post , Options ,PUT 

Access-Control-Allow-Headers: Authorization,origin, content-type, accept 

कृपया मुझे पता क्या कारण हो सकता है कि उड़ान-पूर्व अनुरोध के जवाब में नहीं मिल रहा है 'पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति' है?

+0

मैं बाकी सेवा करने के लिए साबुन सेवा को बदल दिया है और अब विकल्प कॉल सभी आवश्यक नियंत्रण-access- * हैडर कर रहे हैं। मुझे नहीं पता सोप कॉल के साथ क्या गलत था। – yashpal

उत्तर

0

आपकी स्क्रिप्ट टेक्स्ट/सादे के लिए काम कर रही है क्योंकि यह एक आसान अनुरोध है। यदि आप this answer देखते हैं, तो आप देख सकते हैं कि आपका टेक्स्ट/सादा अनुरोध एक साधारण अनुरोध के लिए आवश्यकताओं को फिट करता है। हालांकि, जब आप सामग्री-प्रकार को टेक्स्ट/xml में बदलते हैं तो यह इसे "गैर-सरल" अनुरोध में बदल देता है।

अपना "गैर-सरल" अनुरोध कार्य करने के लिए, आपको पूर्व-उड़ान अनुरोध करने का तरीका देखना होगा। This website बताता है कि आप "एक आसान अनुरोध को संभालने" के तहत कैसे कर सकते हैं।

अद्यतन

बस एक ध्यान दें: Access-Control-Allow-Methods संवेदनशील (सभी अपरकेस) डाली है, और आप एक साधारण अनुरोध (मिलता है, प्रमुख, पोस्ट) के लिए इस्तेमाल किया किसी भी तरीकों सूचीबद्ध करने की आवश्यकता नहीं है। - source

Access-Control-Allow-Methods: OPTIONS, PUT 
Access-Control-Allow-Headers: Authorization, Origin, Content-Type, Accept 

फ़ायरफ़ॉक्स एक ही मूल के अनुरोध पर एक उत्पत्ति हैडर शामिल नहीं है। लेकिन क्रोम और सफारी में मूल मूल पोस्ट/PUT/DELETE अनुरोधों पर मूल हेडर शामिल है (उसी मूल के अनुरोधों में मूल शीर्षलेख नहीं होगा)।

क्या कोई संभावना है कि मूल समान है?

क्या आपके caching के साथ कोई समस्या हो सकती है?

करें कि आप अपने jQuery ajax कॉल के लिए इन settings किया हुआ है:

crossDomain: true // Will force a cross domain request 
cache: false 
+0

हाँ मुझे पता है कि यह आसान अनुरोध है और दूसरा "इतना आसान अनुरोध नहीं है"। सवाल यह है कि एक अनुरोध में मुझे सभी एक्सेस-कंट्रोल- * हेडर मिल रहा है लेकिन विकल्प में मुझे इन हेडर नहीं मिल रहे हैं। तो मेरा "इतना आसान अनुरोध नहीं" असफल रहा है। – yashpal

+0

@ यशपाल मैंने अपना जवाब अपडेट कर लिया है। – GreeKatrina

0

content-type:text/plain और content-type: text/xml के बीच का अंतर है: "text/xml" "preflight" लेकिन "पाठ/सादे" की आवश्यकता है नहीं करता है।

MDN से:

इसे पाने के सिर या पोस्ट के अलावा अन्य तरीकों का उपयोग करता:

विशेष रूप से, एक अनुरोध करता है, तो preflighted है। इसके अलावा, पोस्ट प्रयोग किया जाता है आवेदन/x-www फार्म-urlencoded, बहुखण्डीय/फार्म-डेटा, या पाठ/सादे, उदा के अलावा किसी अन्य सामग्री प्रकार के साथ अनुरोध डेटा भेजने के लिए यदि POST अनुरोध एप्लिकेशन/एक्सएमएल या टेक्स्ट/एक्सएमएल का उपयोग कर सर्वर पर एक्सएमएल पेलोड भेजता है, तो अनुरोध प्रीफलाइट किया गया है।

कुछ संभावित कारण उन एक preflight अनुरोध के विफल पैदा कर सकता है:

  1. CORS सर्वर से सक्षम नहीं है। अपनी सर्वर तकनीक के लिए CORS को सक्षम करने का तरीका खोजें।
  2. सर्वर से "पाठ/सादे" अन्य एक अनुरोध का उपभोग नहीं करता है। उदाहरण के लिए; वसंत में consume option है जो परिभाषित करता है कि कौन सी सामग्री-प्रकार स्वीकार्य है।
  3. आपकी पोस्ट में "प्राधिकरण" शीर्षलेख है। यदि आप क्रेडेंशियल्स के साथ अनुरोध भेज रहे हैं, तो आपको Access-Control-Allow-Credentials: true हेडर भी जोड़ना चाहिए। MDN से फिर से।
संबंधित मुद्दे