मैं जितना संभव हो उतना विशिष्ट और वर्बोज़ बनने जा रहा हूं और इसमें से कुछ कोड शामिल कर रहा हूं। मैंने पहले से ही एक खोज की है और this question मिला है, जो समान लगता है; हालांकि लेखक 3 के बजाय एक्शनस्क्रिप्ट 2 का उपयोग कर रहे थे, और मैं अपनी स्थिति को प्रभावी ढंग से दिए गए किसी भी उत्तर को लागू नहीं कर सका।मैं इस क्रॉस-डोमेन एक्शनस्क्रिप्ट 3 त्रुटि को कैसे ठीक करूं?
मैं उसी डोमेन सीमा को पार करने के लिए फ्लैश/एक्शनस्क्रिप्ट 3 के माध्यम से जावास्क्रिप्ट के XMLHttpRequest ऑब्जेक्ट के व्यवहार को अनुकरण (सीमित तरीके से) करने का प्रयास कर रहा हूं। लेकिन मुझे पता चल रहा है कि उस संबंध में एक्शनस्क्रिप्ट की अपनी सीमाएं हैं। मैं मानता हूं कि मैं गलत हो सकता हूं, लेकिन जो मैं समझता हूं उससे सैद्धांतिक रूप से अभी भी एक्शनस्क्रिप्ट का उपयोग कर इस तरह के क्रॉस-डोमेन स्क्रिप्टिंग करना संभव है, जब तक आपको सभी अनुमतियां सही मिलती हैं। और यही वह जगह है जहां मैं परेशानी में भाग रहा हूं।
सबसे पहले, मैंने AjaxRequest नामक कक्षा के लिए कुछ ओपन-सोर्स कोड उधार लिया, जिसे मैंने /ajax/AjaxRequest.as
के रूप में सहेजा है। इसके बाद मैंने /jsajax.fla
नामक एक फ्लैश फ़ाइल बनाई जो अंतिम एसडब्ल्यूएफ फ़ाइल, /jsajax.swf
पर निर्यात करता है।
import ajax.AjaxRequest;
Security.allowDomain("domainone.com");
Security.allowDomain("domaintwo.com");
function jsAjax(stringURL:String, stringMethod:String, stringData:String):void
{
var xhr:AjaxRequest = new AjaxRequest(stringURL);
xhr.contentType = "application/x-www-form-urlencoded";
xhr.dataFormat = URLLoaderDataFormat.TEXT;
if (stringMethod.toUpperCase() == "POST") {
xhr.method = URLRequestMethod.POST;
} else {
xhr.method = URLRequestMethod.GET;
}
xhr.addEventListener("complete", jsAjaxResponse);
xhr.send(stringData);
return;
}
function jsAjaxResponse(evt:Event):void
{
ExternalInterface.call("jsAjaxResponse", evt.currentTarget.data.toString());
return;
}
ExternalInterface.addCallback("jsAjax", jsAjax);
ExternalInterface.call("jsAjaxReady");
अब तक तो अच्छा: अब, यहाँ ActionScript कोड है कि फ्लैश फाइल का पहला और एकमात्र फ्रेम शामिल है। मुझे एहसास है कि Security.allowDomain
कॉलों में से एक या अधिक की आवश्यकता नहीं है, लेकिन वे इस समस्या को हल करने का प्रयास करने के लिए मेरे (असफल) प्रयास थे।
मेरी जावास्क्रिप्ट में, मुझे तीन कार्य परिभाषित किए गए हैं: jsAjax
, jsAjaxResponse
, और jsAjaxReady
। आखिरी वाला यह एक बहुत ही बुनियादी कार्य है जो इंगित करता है कि फ्लैश ऑब्जेक्ट सफलतापूर्वक लोड किया गया है (जिसे केवल एक बार और इसे लोड करने पर तुरंत कहा जाता है), जबकि अन्य दो डेटा भेजने और प्राप्त करने के लिए उपयोग किए जाते हैं। जैसा कि आप देख सकते हैं, उनके पास इसी एक्शनस्क्रिप्ट समकक्ष हैं।
अंत में, मैं /test.html
नामक एक साधारण HTML पेज है कि इस SWF फ़ाइल (swfobject उपयोग करते हुए) को एम्बेड करता है और jsAjax
समारोह फोन करने के लिए साधारण से फ़ॉर्म नियंत्रण की एक जोड़ी है बनाया। मेरी सभी जावास्क्रिप्ट परिभाषाएं इस HTML फ़ाइल में भी एम्बेड की गई हैं। मैंने /test.php
नामक एक बहुत ही सरल PHP स्क्रिप्ट भी बनाई है जो $_REQUEST
सरणी की सामग्री को प्रिंट करता है। यही वह स्क्रिप्ट है जिसे मैं इस AJAX विधि का उपयोग करने का अनुरोध करना चाहता हूं।
तीन परिदृश्य है कि मैं परीक्षण किया है, लेकिन मैं केवल काम कर उनमें से दो प्राप्त करने में सक्षम था: मैं करने के लिए इन फ़ाइलों के सभी अपलोड करते हैं एक सर्वर
पर सभी:
SCENARIO एक domainone.com, और फिर test.php का अनुरोध करें, यह ठीक काम करता है। मेरे फ़ाइल/फ़ोल्डर संरचना तो इस तरह दिखता है:
domainone.com/jsajax.swf
domainone.com/test.html
domainone.com/test.php
फिर, इस काम करता है। JsAjaxResponse फ़ंक्शन test.php से डेटा को ठीक से वापस प्राप्त करता है।
परिदृश्य दो: दोनों सर्वर पर, झुकाव छोड़ दिया
मैं पहली बार सर्वर पर एचटीएमएल और SWF अपलोड किया है, और फिर बस यह दूसरी सर्वर पर PHP स्क्रिप्ट फोन है, ऐसा नहीं है जब तुरंत काम करो। मैंने कुछ खुदाई की, और पाया कि domaintwo.com पर crossdomain.xml
फ़ाइल बनाकर जिसने domainone.com तक पहुंच प्रदान की, यह तय किया गया।जब स्पष्ट रूप से crossdomain.xml फ़ाइल में domainone.com अनुमति देता है, यह काम करता है
domainone.com/jsajax.swf
domainone.com/test.html
domaintwo.com/test.php
domaintwo.com/crossdomain.xml
: तो मेरी फ़ाइल/फ़ोल्डर संरचना इस तरह देखा। फिर, jsAjaxResponse फ़ंक्शन test.php से डेटा को ठीक से वापस प्राप्त करता है।
SCENARIO तीन: दोनों सर्वर पर, झुकाव सही
जब मैं domaintwo.com करने के लिए सभी लेकिन एचटीएमएल अपलोड किया है, मैं अब यह काम करने के लिए मिल सकता है। दूसरे शब्दों में, domainone.com पर HTML domaintwo.com पर होस्ट की गई एक एसडब्ल्यूएफ फ़ाइल का संदर्भ दे रहा है, और यह कि एसडब्ल्यूएफ फ़ाइल domaintwo.com से अनुरोध करने का प्रयास कर रही है। मैंने परिदृश्य 2 से वही crossdomain.xml फ़ाइल छोड़ी, बस मामले में। मेरे फ़ाइल/फ़ोल्डर संरचना इस तरह देखा:
domainone.com/test.html
domaintwo.com/jsajax.swf
domaintwo.com/test.php
domaintwo.com/crossdomain.xml
यह केवल मामले मैं काम नहीं कर रहा हो सकता है है, और इस मामले में मैं काम कर पाने की जरूरत है। पहला दो वास्तव में परीक्षण परिदृश्य थे ताकि यह देखने के लिए कि स्क्रिप्ट बिल्कुल काम कर रही थी या नहीं। जब मैं यहां अपने jsAjax समारोह चलाने का प्रयास, मैं एक त्रुटि है कि पता चलता है के साथ दो बार Firebug में हवा:
uncaught exception: Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.].
uncaught exception: Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.].
मदद! मैं इसे परिदृश्य 3 में कैसे काम कर सकता हूं?