2012-08-08 15 views
5

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

इसलिए मैंने एक एपीआई बनाया है जो जेएसओएन को AJAX अनुरोधों में उपयोग के लिए थूकता है, लेकिन मुझे लगता है कि मैं इसे गलत कर रहा हूं क्योंकि मैं आरईएसटी का उपयोग नहीं कर रहा हूं या कुछ भी अलग कर रहा हूं जो इसे अन्य कोड से अलग करता है नियंत्रक में।

उदा। (नोट: मैं इस उदाहरण के लिए JSON में बदलकर बारे में हिस्सा याद कर रहा हूँ)

class ApiController extends AppController { 

    function index() { 
     $posts= $this->Post->find('all'); 
     $this->set(compact('posts')); 
    } 
} 

की तरह एक यूआरएल बनाने के लिए: (इस लक्ष्य को हासिल करने के लिए कस्टम मार्ग बनाने के हैं), जो मैं तो उपयोग करने के लिए AJAX का उपयोग कर कॉल कर सकते हैं domain.com/api/posts/all मेरे मोबाइल ऐप में

अब मेरा प्रश्न यह है कि आरईएसटी का उपयोग करके इसे अलग-अलग किया जाएगा? मैं अनुप्रयोगों के निर्माण के लिए बहुत नौसिखिया हूं और मेरी ताकतें बैक एंड डेवलपमेंट की बजाय फ्रंट एंड में हैं, इसलिए किसी भी पॉइंटर्स, इसकी सहायता से बहुत सराहना की जाएगी।

+0

यदि आप अपने फोनगैब ऐप के अंदर सेन्चा टच का उपयोग करते हैं, तो आप रीस्टफुल के बजाय [Ext.Direct कार्यान्वयन] (http://banchaproject.org) का भी उपयोग कर सकते हैं। –

उत्तर

3

केकेपीएचपी में आरईएसटी चालू करना मूल रूप से कार्यों के लिए उचित HTTP विधियों को रूट करता है। इसलिए, एक जीईटी अनुरोध एक इंडेक्स में भेजा जाएगा या कार्रवाई देखें, एक हटाई गई अनुरोध हटाने की कार्रवाई के लिए भेजा गया अनुरोध, और आगे।

यह आपके एपीआई का उपयोग करने वाले लोगों के लिए एक बहुत ही आसान अंतराल बनाता है। फिर जब यह अंत बिंदु बुला, HTTP विधि केक से रूट किया जाएगा यह उचित कार्रवाई करने के लिए पर निर्भर करता है (किसी भी HTTP अनुरोध वाक्यविन्यास त्रुटियों को माफ):

// single endpoint 
http://example.com/api/posts 

एक GET अनुरोध है कि मार्गों /posts/index.json को

GET /api/posts.json HTTP/1.1 
Host: example.com 

एक पोस्ट अनुरोध है कि मार्गों

POST /api/posts/1.json HTTP/1.1 
Host: example.com 
Content-Type: application/x-www-form-urlencoded; charset=utf-8 
Content-Length: 24 

data[Post][name]=updated 

/posts/edit/1.json को यह पढ़ना अपने सवालों के अधिकांश का जवाब देंगे: http://book.cakephp.org/2.0/en/development/rest.html

012,
+0

ठीक है कि कहा गया है ... यह आरईएसटी का उपयोग किए बिना नियंत्रक में मानक तरीकों को बनाने से अलग कैसे है? यह भी एक अलग सवाल की तरह प्रतीत हो सकता है, लेकिन DELETE विधि POST या फॉर्म के लिए GET विधियों पर क्या प्रदान करता है? – Cameron

+0

एक के लिए, डेवलपर्स के लिए और आपके लिए (दस्तावेज़ बनाना) आसान है। कम अंतराल। दूसरा, यह * उचित HTTP विधि की आवश्यकता होगी। उदाहरण के लिए, अब उपयोगकर्ता अपने ब्राउज़र में '/ api/posts/delete/1'' पर जा सकते हैं और एक पोस्ट हटा सकते हैं, उन्हें वास्तव में उचित विधि का उपयोग करके DELETE का अनुरोध करना होगा। इसके अलावा, केक की आरईएसटी प्रणाली आपको विभिन्न सामग्री प्रकारों को स्वीकार करने की अनुमति देगी और इसे आपके लिए '$ this-> अनुरोध-> डेटा' में स्वचालित रूप से डीकोड कर देगी।यदि यह आपके लिए काम नहीं करता है, तो इसे करने की कोई आवश्यकता नहीं है, लेकिन एक विश्वसनीय API बनाने का यह सही तरीका है। – jeremyharris

3

यदि आपकी चिंता बाकी प्रिंसिपल के लिए सच है। वेब सेवा

  • वेब सेवा के द्वारा समर्थित डेटा की इंटरनेट मीडिया प्रकार के लिए

    • बेस यूआरआई:

      फिर, वहां आम तौर पर 4 अंक को ध्यान में रखना है।
      यह अक्सर जेएसओएन, एक्सएमएल या वाईएएमएल है लेकिन यह कोई अन्य वैध इंटरनेट मीडिया प्रकार हो सकता है।

    • HTTP विधियों (उदा।, प्राप्त करें, PUT, POST, या DELETE) का उपयोग कर वेब सेवा द्वारा समर्थित संचालन का सेट।
    • एपीआई हाइपरटेक्स्ट अधिक जानकारी के लिए प्रेरित किया जाना चाहिए

    देखें, http://en.wikipedia.org/wiki/Representational_state_transfer

    अब, इसके साथ ही, मैं नीचे दिए गए छद्म कोड के करीब कुछ होने के लिए अपने उपरोक्त कोड को बदलने का सुझाव दूंगा।

    1) संसाधनों का अस्तित्व महत्वपूर्ण है, संसाधनों के संग्रह के रूप में आपके पदों के बारे में सोचें जिन्हें यूआरआई द्वारा उपयोग किया जा सकता है।(प्रमाणीकरण & प्राधिकरण अन्य चिंताओं है कि आप भी संभाल करने के लिए चाहते हो सकता है कर रहे हैं):

    api.domain.com/resources/posts =>

    2 पोस्ट) का एक संग्रह करने के लिए इस यूआरआई अंक आपरेशन के सेट है कि आप HTTP तरीकों का उपयोग कर समर्थन करना चाहते हैं जाएगा/क्रिया, परिभाषित करने की जरूरत है एक उदाहरण के रूप में हम ऐसा करके संग्रह में से एक सदस्य को पुनः प्राप्त करना चाह सकते हैं:

    api.domain.com/resources/posts/12

    नीचे अनुरोध हैडर & शरीर जो आने वाले में पाया जा सकता है इस यूआरआई के लिए अनुरोध:

    स्वीकार करें: आवेदन/json
    सामग्री प्रकार: आवेदन/json
    अनुरोध यूआरएल: http://api.domain.com/resources/posts/12
    अनुरोध विधि: प्राप्त

    आपका आवेदन के प्रकार को संभालने के लिए सक्षम होना चाहिए अनुरोध, यूआरआई में ऑपरेशन को निर्धारित करने की आवश्यकता के बिना, हमें वापस बिंदु (1),

    यूआरआई लिखने के बजाय इस तरह लिखा:

    domain.com/api/posts/ सभी

    आपका यूआरआई मॉडल इस तरह से किया जाना चाहिए:

    संसाधनों/पदों/12 के रूप में संसाधनों/प्रकार/आइटम संग्रह से एक सदस्य को पुनः प्राप्त करने,
    पूरे संग्रह के साथ काम करने के लिए संसाधन/प्रकार संसाधन/प्रकार के रूप में पोस्ट।

    आम अमूर्त वर्ग यहाँ आप कुछ सामान्य कार्यों को लागू कर सकते हैं:

    यहाँ कोड का एक उदाहरण है। यदि आप सेवा आधारित कार्यान्वयन का उपयोग कर रहे हैं तो यह एक सेवा द्वारा भी पूरा किया जा सकता है।

    abstract class ResourcesController extends AppController { 
    } 
    
    
    class PostResourcesController extends ResourcesController { 
    
        /** 
        * By the time this method is called in your controller/class, you already know 
        * that the HTTP method is GET. 
        * 
        * @param Request\$_GET $request A request instance 
        * @param int   $postId The post ID to retrieve 
        * 
        * @return Response A reponse instance 
        */ 
        function getPost(Request $Request, $postId = null) 
        { 
         /** 
         * Here you can use the request object to get 
         * the response content type  
         * the requesting client accepts. Example JSON or XML. 
         */ 
    
         /** 
         * using the $postId you can then query your database 
         * to retrieve a post with that ID or use a sort of 
         * service. 
         */ 
    
         /** 
         * Once you implemented a you logic 
         * you can build a response to return. 
         */ 
        } 
    } 
    

    इस कोड को अधूरा है, लेकिन मुझे आशा है कि यह तुम क्या एक असली RESTful API कैसा लग सकता है की एक विचार देता है।

    यह सुनिश्चित करने के लिए कुंजी है कि
    "एप्लिकेशन दो चीजों को जानकर संसाधन के साथ बातचीत कर सकता है: संसाधन की पहचानकर्ता और कार्रवाई आवश्यक"।

    उम्मीद है कि इससे मदद मिली।

  • संबंधित मुद्दे