PHP में सिंपल JSON-RPC जैसी API

प्रविष्टि


JSON-RPC API क्या है? यह केवल एपीआई प्रकारों में से एक है, लेकिन यह भी एक स्पष्ट मानक है, जो इस लेख में नहीं हो सकता है (हां, एक नमूना होगा)।

जब मैंने थोड़ी देर के लिए रैस्टफुल एपीआई के साथ फिड किया और उस पर बहुत गुस्सा आया, तो यह बाहर पर कितना सरल है और इसे अंदर से तह किया जा सकता है, मैं प्रतिस्थापन की तलाश में Google पर गया।

और मुझे JSON-RPC API के बारे में एक लेख आया, और मुझे इसकी अवधारणा में बहुत दिलचस्पी थी, इतना कि मैंने अपनी बाइक को यथासंभव सरल बनाने का फैसला किया।

JSON-RPC API कॉन्सेप्ट

इस मानक का मुख्य विचार एक निश्चित वस्तु-उन्मुख दृष्टिकोण में है।

शब्दार्थ, प्रश्न इस तरह दिखता है:

{ "api version": 0.1, "method": "object.method", "params": { "user id": 1234 } } 

और यह सिर्फ एक अनुरोध है, इस तरह के एपीआई का बड़ा आकर्षण यह है कि उन्हें खूबसूरती से जोड़ा जा सकता है, और यह हमें बैच अनुरोधों के लिए इसका उपयोग करने का अवसर देता है (भागों में कुछ लोड करें)।

अर्थात्, एक पूर्ण अनुरोध इस तरह दिख सकता है।

 { "api_v": "0.1", "reqs": [ { "name": "my_important_request", "method": "user.kick_out", "params": { "id": "1234", "when": "now", ... } }, ... ] } 

यहाँ api_v एपीआई संस्करण है, और अनुरोध अनुरोधों का एक सरणी है। क्या महत्वपूर्ण है, प्रत्येक अनुरोध में एक विधि (class.method), पैरामीटर और नाम है। नाम यहाँ एक बड़ी भूमिका निभाता है। जब आपको सर्वर से प्रतिक्रिया मिलती है, तो आप उसके नाम से क्वेरी परिणाम का उल्लेख कर सकते हैं। उदाहरण: उपयोगकर्ता को जोड़ने की एक विधि के साथ एक अनुरोध को "user_creating" कहा जाना चाहिए, लेकिन यह आपके ऊपर है;)

लिखना शुरू करते हैं


पहली चीज़ जो करने की ज़रूरत है वह है एपीआई क्लास, मेरे मामले में यह उससे भी कम करना चाहिए। कुछ प्रक्रियाएं मुझसे अलग हैं, लेकिन यह सार नहीं बदलता है।

 <?php // @package 'api_0.1.php' // API  0.1 class API { private $last_resp; //    private $resp = []; //   public function __call( $method, $params ) { //  ,     $object = substr($method, 0, strpos($method, '.')); $method_name = substr($method, strpos($method, '.')+1); //   include_once __DIR__.'/source/'.$object.'.methods.php'; //      $resp = $object::$method_name($params); if(!empty($resp)) $this->last_resp = $resp; else $this->last_resp = null; } //          - pulbic function add_resp($req_name){ if($this->last_resp === null) return false; $req = $this->last_resp; $this->resp[$req_name] = $req; } //  ,    public function response(){ exit ( json_encode($this->resp) ); } } 

कोड में टिप्पणियां हैं, लेकिन यहां एक संक्षिप्त विषयांतर है ... हम एपीआई को एक अज्ञात फ़ंक्शन कहते हैं, इन उद्देश्यों के लिए मैजिक __call फ़ंक्शन का उपयोग करें। यही है, एपीआई के "Object.method" फ़ंक्शन ($ api -> {"Object.method"}) को कॉल करके, यह स्वचालित रूप से स्ट्रिंग को ऑब्जेक्ट-विधि की एक जोड़ी में विभाजित करता है और इसे कॉल करता है। उसके बाद, सभी प्रश्नों के परिणाम एक सरणी में जोड़ दिए जाते हैं और इसे वापस json प्रारूप में भेज दिया जाता है। सब कुछ सरल है।

कक्षाएं


यह बहुत महत्वपूर्ण है - यहां कक्षाएं स्रोत फ़ोल्डर में संग्रहीत की जाती हैं और इस तरह से कक्षा को देखना चाहिए

 <?php class object{ function method($params){ /* ... */ } } 

कक्षा का नाम, अनुरोध में मांगी गई विधि से मेल खाना चाहिए। बाकी सब कुछ मायने नहीं रखता। एक विधि कुछ भी कर सकती है और कुछ भी वापस कर सकती है।

लेकिन हमें एक नियंत्रण स्क्रिप्ट भी चाहिए। यह वही स्क्रिप्ट है जिसे अनुरोध पर बुलाया जाएगा।

 <?php // @package api.php header('Content-Type: application/json'); //     json $api_v = $_POST['api_v']; // $path = __DIR__.'/APIs/api_'.$api_v.'.php'; //       ,    if(!file_exists($path)) exit; //       include_once __DIR__.'/APIs/api_'.$api_v.'.php'; //  API $api = new API(); $reqs = $_POST['reqs']; $reqs = @json_decode($reqs, true); //  json  php  () //    ,          API foreach ($reqs as $req) { $method = $req['method']; $params = $req['params']; $req_name = $req['name']; $api->$method($params); $api->add_resp($req_name); } //    $api->response(); 

यहाँ क्या हो रहा है? हम अनुरोध में निर्दिष्ट संस्करण के आधार पर हमारे एपीआई को सक्षम करते हैं। हम json अनुरोध को डिकोड करते हैं और उनमें से प्रत्येक के माध्यम से जाते हैं। हम "ऑब्जेक्ट.method" प्रकार की एपीआई विधि को कॉल करते हैं और इस अनुरोध के नाम के तहत इसके परिणाम को बचाते हैं (यह ऊपर लिखा गया था कि प्रत्येक अनुरोध का अपना नाम है)। सभी अनुरोधों को निष्पादित करने के बाद, हम परिणामों की एक json सरणी लौटाते हैं ... और, मूल रूप से, यह बात है।

थोड़ा जे.एस.


यहाँ js में एक फ़ंक्शन का एक छोटा सा उदाहरण है जो इस प्रकार के एपीआई अनुरोध करेगा। यह jQuery का उपयोग करते हुए लिखा गया है, और मैं इसके लिए आपसे बेतहाशा माफी मांगता हूं, लेकिन यह बहुत सरल है बिना सार दिखाए।

 function api_call(reqs, callback){ //  (  ,    ,     )   json var json = JSON.stringify( (Array.isArray(reqs) ? reqs : [reqs]) ); //  POST  $.post({ url: '/api/api.php', //    api.php dataType: 'json', //   json,     data: ({ api_v: '0.1', reqs: json }), //   API   ( json ) success: function(res){ //         window,      .     for(var key in res){ window.loaded[key] = res[key]; } //      callback(res); } }); } 

यहां एक सरल POST अनुरोध है, और लगभग कुछ भी विशेष नहीं है, सिवाय इसके कि केवल एक अनुरोध निर्दिष्ट करना संभव है, न कि एक सरणी, और मैं भी डाउनलोड किए गए लोगों की सभी प्रतिक्रियाओं को सहेजता हूं, बस यही है, सुविधा के लिए, यह बिल्कुल भी आवश्यक नहीं है।

खैर, मुझे आशा है कि मुख्य विचार आपके लिए स्पष्ट है। मैं एक सरल और सहज ज्ञान युक्त एपीआई बनाना चाहता था - मैंने किया। अधिकांश भाग के लिए, मैं एक बहुक्रियाशील एपीआई बनाने के लिए इस सरल दृष्टिकोण को दिखाना चाहता था।

जल्द ही मिलते हैं ...

Source: https://habr.com/ru/post/hi446348/


All Articles