2011-11-14 13 views
6

के लिए लूरकास्ट रेस्टलर कॉलबैक पैरामीटर मैं एक साधारण आरईएसटी एपीआई लागू करने के लिए Restler का उपयोग कर रहा हूं। अब अगर मुझे एपीएक्स के माध्यम से किसी अन्य डोमेन से एपीआई का उपभोग करने की ज़रूरत है, तो मुझे अपने अनुरोधों के साथ कॉलबैक पैरामीटर भेजने की आवश्यकता होगी। क्या इसके लिए Restler में समर्थन है (मुझे अभी तक कोई वास्तविक दस्तावेज नहीं मिला है)?क्रॉस-डोमेन AJAX

उत्तर

5

गुगलिंग से इस पृष्ठ पर आने वाले किसी भी व्यक्ति के लिए, मैंने जिथब में एक मुद्दा प्रस्तुत किया, और लेखक से उत्कृष्ट समर्थन प्राप्त हुआ। अगर आप परिचित हैं कि कैसे रेस्टलर बनाया गया है, तो यह लागू करने के लिए यह काफी छोटा है।

https://github.com/Luracast/Restler/issues/17 से

<?php 
//jsonpformat.php 
class JsonpFormat implements iFormat { 

    const MIME = 'text/javascript'; 
    const EXTENSION = 'js'; 
    /* 
    * JsonFormat is used internally 
    * @var JsonFormat; 
    */ 
    public $jsonFormat; 
    public static $functionName = 'parseResponse'; 

    public function __construct() { 
     $this->jsonFormat = new JsonFormat(); 
     if (isset ($_GET ['jsonp'])) { 
      self::$functionName = $_GET ['jsonp']; 
     } 
    } 
    public function getMIMEMap() { 
     return array (self::EXTENSION => self::MIME); 
    } 
    public function getMIME() { 
     return self::MIME; 
    } 
    public function getExtension() { 
     return self::EXTENSION; 
    } 
    public function encode($data, $human_readable = FALSE) { 
     return self::$functionName . '(' . $this->jsonFormat->encode ($data, $human_readable) . ');'; 
    } 
    public function decode($data) { 
     return $this->jsonFormat->decode ($data); 
    } 
    public function setMIME($mime) { 
     //do nothing 
    } 
    public function setExtension($extension) { 
     //do nothing 
    } 
} 
?> 

यह restler.php फ़ाइल के रूप में एक ही निर्देशिका में बचाया जाना चाहिए। एक बार आपके पास यह हो जाने के बाद, इस फ़ाइल को शामिल करने के लिए अपना गेटवे (index.php) संपादित करें और इसे एक समर्थित प्रारूप के रूप में जोड़ें। उदाहरण:

<?php 
require_once '../../restler/restler.php'; 

#set autoloader 
#do not use spl_autoload_register with out parameter 
#it will disable the autoloading of formats 
spl_autoload_register('spl_autoload'); 

$r = new Restler(); 
$r->setSupportedFormats('JsonpFormat','JsonFormat', 'XmlFormat'); 
$r->addAPIClass('BMI'); 
$r->handle(); 
?> 
+0

अच्छा। मैं सोच रहा हूं, अगर यह सुरक्षा सुरक्षित है: स्वयं :: $ _ प्राप्त करें ['jsonp']? –

+0

ढांचे को हैक करना हमेशा एक बुरा विचार है ... यह एक बेहतर है ... – danielrvt

+0

क्या लूराकास्ट हमें 'डिफ़ॉल्ट :: $ accessControlAllowHeaders' स्थिर सदस्य प्रकार का सौदा सेट करने की अनुमति नहीं दे सकता है? – Miles

1

यह हमारे लिए अच्छी तरह से काम: हैडर ('पहुंच-नियंत्रण-अनुमति दें-मूल: *');

उस शाखा में सभी अंतराल के लिए नियंत्रक वर्ग कन्स्ट्रक्टर को एक सिंगल एंड पॉइंट के लिए रिटर्न से पहले नियंत्रक विधि में जोड़ें या इसे साइट को चौड़ा करने के लिए ऊपर तक।

यदि आप केवल कुछ साइट्स को हेडर ('एक्सेस-कंट्रोल-ऑब्जेक्ट-ऑरिजन: example.com') या हेडर जैसे कुछ ('एक्सेस-कंट्रोल-ऑब्जेक्ट-ऑरिजन:'। $ Remote_domain) तक पहुंचने की अनुमति दे रहे हैं। जहां $ remote_domain कुछ पारित टोकन या इस तरह के आधार पर गतिशील रूप से सेट किया गया है। * वाइल्डकार्ड के उपयोग को सीमित करने के लिए क्रॉस-ओरिजिनल रिसोर्स शेयरिंग (सीओआरएस) देखें।

<?php 

class Say { 

__construct(){ 
    header('Access-Control-Allow-Origin: *'); //Here for all /say 
} 

function hello($to='world') { 
    header('Access-Control-Allow-Origin: *'); //Here for just /say/hello 
    return "Hello $to!"; 
    } 
} 

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

शीर्षलेख ('पहुंच-नियंत्रण-अनुमति-तरीके: प्राप्त करें, पोस्ट करें, हटाएं, पुट, विकल्प'); शीर्षलेख ('एक्सेस-कंट्रोल-स्वीकृति-हेडर: जो भी_हेडर_योउ_लो, हेडर 1, हेडर 2');

IE9 और नीचे के लिए आपको एक JSONP हैक की आवश्यकता होगी। रेस्टलर के पास आईएफओ आउटपुट जेएएसओएनपी शैली को लपेटने के लिए iFormat क्लास को विस्तारित करने का उदाहरण है।

सीओआरएस पर विवरण के लिए मोज़िला हैक देखें। http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/ और बाहर की जाँच OPTIONS in PHP REST API

+0

ऊपर दिए गए कार्यों के लिए महान काम करता है लेकिन अन्य कार्यों को कुछ कामों की आवश्यकता होती है। कुछ विवरणों के लिए मोज़िला हैक्स देखें। http: //hacks.mozilla।org/2009/07/क्रॉस साइट-XMLHttpRequest-साथ-CORS / – punkael

0

मैं यहाँ जोड़ देंगे कि अगर किसी कारण से आप JSONP का उपयोग नहीं करना चाहते, तो आप बस जोड़ सकते हैं:

header('Access-Control-Allow-Origin: *'); 

punkael की पहली प्रति जवाब (उसने ऐसा नहीं किया निर्दिष्ट करें कि इसे रेस्टर में कहां करें)। SendData ($ डेटा) फ़ंक्शन में restler.php पर यह लाइन जोड़ें जहां Restler प्रतिक्रिया में हेडर डेटा जोड़ता है। यह लाइन 378 पर शुरू होता है।

हालांकि सावधानी बरतें, क्योंकि यह किसी भी डोमेन को आपके एपीआई से डेटा ले जाने की अनुमति देगा।