मैं बैज मिला इस प्रश्न के लिए Popular question
, इसलिए मुझे लगता है कि यह समय है कि मैं विस्तार से बताता हूं कि मैंने अपना रीस्ट-सोल्यूटन कैसे किया।
मैंने इस आरईएसटी एपीआई के लिए लैरवेल, सिम्पफोनी 2 और कोडिग्निटर दोनों को देखा। उन सभी के पास कुछ तत्व थे जिन्हें मैंने पसंद किया था और कुछ मुझे नापसंद था। मेरी मुख्य चिंता यह थी कि प्रमाणीकरण कैसे किया जाए क्योंकि मेरे पास एक जटिल एल्गोरिदम था जहां मेरे उपयोगकर्ता Google या Facebook द्वारा प्रदान किए गए ऐप्स 'access_token या access_tokens के साथ लॉग इन कर सकते हैं। मैं अपने ढांचे के पूर्ण नियंत्रण में भी निर्भर करता हूं और ऊपर वर्णित ढांचे में कुछ तत्व थे जो मुझे अनावश्यक और आसपास काम करने में मुश्किल महसूस करते थे। इस वजह से मैंने अपना खुद का आरईएसटी समाधान बनाने का फैसला किया। यह उतना कठिन नहीं है जितना कि कोई उम्मीद कर सकता है, और यह कई तरीकों से किया जा सकता है। जिस तरह से मैंने इसे ओओपी-प्रोग्रामिंग के बारे में कुछ जानकारी की आवश्यकता है।
ओके, इसलिए आरईएसटी नामक बेस-क्लास बनाया गया। यह कक्षा उन सभी चीजों का ख्याल रखती है जो प्रत्येक कॉल के लिए आम हैं। प्रमाणीकरण की तरह, अनुरोधित पथ को विधि में पार्स करना, access_token
आदि
इस कक्षा में केंद्रीय चीजों में से एक अनुरोधित पथ है और इसका तरीका किसी विधि में कैसे अनुवादित किया जाता है। मैंने यह लैरावेल से प्रेरित किया था। मेरे पास key
=>value
है जहां कुंजी यूआरएल है जो मेल खाना चाहिए और मूल्य कॉल करने का वास्तविक तरीका है।
'/user/(:id)' => 'user_id',
यह मेल खाएंगे किसी भी/उपयोगकर्ता/[संख्या]: मैं भी रास्ता Lavavel तो जैसे URL में चर पार्स शामिल थे। यह भी जांचता है कि यह किस प्रकार का अनुरोध है, इसलिए यदि यह एक आसान तरीका है तो यह get_user_id
पर कॉल करने का प्रयास करेगा। (:id)
के साथ पार्स किए गए कुछ भी उस विधि को कॉल करते समय तर्क के रूप में उपयोग किए जाएंगे (इसलिए यह वास्तव में get_user_id($id)
पर कॉल कर रहा है)।
प्रमाणीकरण के बाद वास्तविक विधि-कॉल का मूल्यांकन किया जाता है। मैं आरईएसटी-क्लास में सभी विधियों (जैसे get_user_id
) नहीं चाहता था, इसलिए मैंने इसे विभिन्न नियंत्रकों में तोड़ दिया जो आरईएसटी-क्लास को बढ़ाते हैं। यह अनुरोध किया जा रहा यूआरएल देखकर किया जाता है। यदि यह /user/(:id)
है तो स्क्रिप्ट जांच करेगी कि userController.php
नामक नियंत्रक है या नहीं। यदि यह मौजूद है, तो जांचें कि जिस विधि को हम कॉल करने जा रहे हैं, वह मौजूद है या नहीं। यदि ऐसा होता है, तो जांच करें कि तर्कों की संख्या हमारे पास क्या है। अगर सबकुछ अच्छा है, तो त्रुटि संदेश वापस न करें, विधि को निष्पादित करें। इस तरह एक एपीआई बनाते समय संरचना और त्रुटि संदेश बहुत महत्वपूर्ण हैं।
विभिन्न नियंत्रकों में मैं प्रमाणीकरण प्राप्त करने के लिए आरईएसटी-कक्षा के लिए कन्स्ट्रक्टर को कॉल करता हूं, यूआरएल का पार्सिंग हल किया जाता है। हर नियंत्रक के तल में
$controller = new MyController();
$controller->printResponse();
: यहां मुश्किल बात यह है कि मुझे क्या करना नहीं चाहता था है। इसलिए मैंने थोड़ा हैक और एक स्क्रिप्ट बनाई जिसे run.php
कहा जाता है जो यह प्रत्येक नियंत्रक-वर्ग के लिए गतिशील रूप से करता है। इससे पहले कि मैं run.php
शामिल करता हूं, मैं केवल $path = explode('/',__FILE__);
कर नियंत्रक के लिए पथ को सहेजता हूं। इसका उपयोग रन-स्क्रिप्ट में किया जाता है। रन-स्क्रिप्ट इस तरह दिखता है:
// Splitting the file-name, removing the extension
$name = explode('.',$path[count($path)-1]);
// Uppercasing the first letter to be nice and OOP-ish
$classToCall = ucfirst($name[0]);
// Creating a new instance
$controller = new $classToCall();
// Logging
$controller->doLog();
// Printing the final response
$controller->printResponse();
मुझे यह पता चला कि मैं अपना एपीआई कैसे बनाना चाहता हूं। मैं सरणी में इसे आपूर्ति करके नई विधियों को आसानी से जोड़ सकता हूं जो विधियों के लिए यूआरएल को पार करता है, और मैं अधिकतम स्वच्छता के लिए अच्छी तरह से टूटे हुए अलग नियंत्रकों में नई विधियां जोड़ सकता हूं।
कुछ लोगों को लगता है कि यह बहुत अधिक काम है, लेकिन वास्तव में इसे उठाने और चलाने के लिए मुझे केवल कुछ घंटे लग गए। मैं इसे अत्यधिक गतिशील भी कहूंगा क्योंकि मैं केवल नए नियंत्रकों को जोड़ सकता हूं और सिस्टम उन्हें पहचानेंगे यदि वे वैध यूआरएल-पैटर्न हैं।
कुछ दोस्ताना सलाह।
यदि आप इस समाधान के जैसा कुछ करने का फैसला करते हैं, तो ये कुछ अच्छी युक्तियां हो सकती हैं। प्रत्येक नियंत्रक में, ऐसा कुछ करें:
public function __construct() {
// Loading the class-name, setting it in the REST-class, so we can check if it holds the method being called
$this->className = get_class($this);
// Calling RESTs constructor
parent::__construct();
}
हमें उस कक्षा को स्टोर करने की आवश्यकता होगी जिसे हम वर्तमान में काम कर रहे हैं। यह UserController
या ऐसा कुछ होगा।
आरईएसटी-कक्षा में मैं इस चर का उपयोग यह जांचने के लिए कर सकता हूं कि इस नियंत्रक में वास्तविक विधि कहां चल रही है या नहीं। मैंने ऐसा किया है:
// Checking if the method exists
if (method_exists($this->className,$method_name)) {
// Check to see if we have the required number of arguments represented
$ReflectionClass = new ReflectionClass($this->className);
if ($ReflectionClass->getMethod($method_name)->getNumberOfParameters() == count($this->methodUrl['args'])) {
$this->response['response'] = call_user_func_array(array($this, $method_name), $this->methodUrl['args']);
मुझे उम्मीद है कि आप सभी जा सकते हैं।
मुबारक codin '
यहाँ एक अच्छा लेख है: [Symfony2 साथ बाकी एपीआई: सही रास्ता] (http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2 -थ-दाएं रास्ता /) – j0k
@ j0k: अच्छा, मैं इसे देख लूंगा। शायद समाधान इतना आसान हो सकता है। धन्यवाद। – OptimusCrime
आप कैसे साथ हो रहे हैं? –