2012-08-08 26 views
5

Mam prostą aplikację CakePHP, która pozwala użytkownikowi tworzyć i edytować posty. I zamierzam wprowadzić aplikację do PhoneGap w pewnym momencie w przyszłości.Utwórz interfejs API za pomocą CakePHP

Dlatego stworzyłem API, które wypluwa JSON do użycia w żądaniach AJAX, ale mam wrażenie, że robię to źle, ponieważ nie używam REST lub robię coś innego, co odróżnia go od innego kodu w kontrolerze.

np. (UWAGA: Brakuje mi część o przekształcenie go w JSON dla tego przykładu)

class ApiController extends AppController { 

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

Aby utworzyć url tak: domain.com/api/posts/all (stworzyłoby niestandardową drogę do osiągnięcia tego celu), które można następnie wywołać za pomocą AJAX używać w mojej aplikacji mobilnej.

Teraz moje pytanie brzmi, co inaczej robiłby to używając REST? Jestem początkującym programistą w budowaniu aplikacji, a moje mocne strony są raczej w fazie front-end niż w back-endie, więc wszelkie wskazówki, pomoc w tym będą mile widziane.

+0

Jeśli używasz Sencha Dotknij wewnątrz aplikacji PhoneGab, można również użyć [wdrażanie Ext.Direct] (http://banchaproject.org) zamiast spokojny. –

Odpowiedz

3

Włączenie REST w CakePHP zasadniczo kieruje odpowiednie metody HTTP do działań. Tak więc żądanie GET zostanie przekierowane do indeksu lub akcji widoku, żądanie DELETE przekierowane do akcji usuwania i tak dalej.

Stwarza to bardzo łatwy punkt końcowy dla osób korzystających z interfejsu API. Następnie podczas wywoływania tego punktu końcowego, w zależności od metody HTTP Ciasto skieruje go do prawidłowego działania (wybaczyć ewentualne błędy składniowe żądania HTTP):

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

żądanie GET, trasy do /posts/index.json

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

POST żądanie, trasy do /posts/edit/1.json

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 

Czytając ten odpowie na większość pytań: http://book.cakephp.org/2.0/en/development/rest.html

+0

Okay, które zostały powiedziane ... Jak to się różni od zwykłego tworzenia standardowych metod w sterowniku bez używania REST? Może to wyglądać na inne pytanie, ale co oferuje metoda DELETE w stosunku do metod POST lub GET dla formularzy? – Cameron

+0

Po pierwsze, jest to łatwiejsze dla programistów i dla Ciebie (tworzenie dokumentów). Mniej punktów końcowych. Po drugie, * wymagałoby * prawidłowej metody HTTP. Na przykład, użytkownicy nie mogą już odwiedzać '/ api/posts/delete/1' w swojej przeglądarce i usuwać posty, ale faktycznie będą musieli zażądać DELETE przy użyciu właściwej metody. Ponadto system REST Cake'a pozwoli Ci akceptować różne typy treści i automatycznie dekodować je w '$ this-> request-> data'.Jeśli to nie działa, nie musisz tego robić, ale jest to właściwy sposób tworzenia RESTful API. – jeremyharris

3

Jeśli twoja troska ma być prawdziwa wobec zleceniodawców odpoczynku.

Następnie są zwykle 4 punkty, aby pamiętać:

  • Baza URI dla usługi internetowej
  • Internet typ nośnika danych obsługiwanych przez usługę internetową.
    Często jest to JSON, XML lub YAML, ale może to być jakikolwiek inny prawidłowy typ mediów Internet .
  • Zestaw operacji obsługiwanych przez usługę WWW przy użyciu metod HTTP (np. GET, PUT, POST lub DELETE).
  • API musi być napędzany hipertekstu

See, http://en.wikipedia.org/wiki/Representational_state_transfer więcej szczegółów.

Teraz, z tym, co powiedziałem, sugerowałbym zmianę powyższego kodu, aby był czymś zbliżonym do poniższych pseudo-kodów.

1) Istnienie zasobów jest kluczowe, pomyśl o swoich wpisach jako zbiór zasobów, do których dostęp ma URI.(Uwierzytelnianie & autoryzacja są inne obawy, że możesz również obsłużyć):

api.domain.com/resources/posts => To URI wskazuje na zbiór postach

2) zestaw operacji, które będziemy chcieli, aby wspierać za pomocą metody HTTP/czasowniki muszą zdefiniowana, jako przykład może chcemy odzyskać tylko jeden członek kolekcji w ten sposób:

api.domain.com/resources/posts/12

Poniżej znajdują się nagłówki żądania: & treść, które można znaleźć w przychodzącym Wniosek o takim adresie:

Accept: application/json
Content-Type: application/json
URL żądania: http://api.domain.com/resources/posts/12
Zapytanie Metoda: GET

Aplikacja powinna być w stanie obsłużyć tego typu żądanie, bez potrzeby ustalania operacji w URI, przywracając nas do punktu (1),

zamiast posiadania identyfikatora URI zapisanego w ten sposób:

domain.com/api/posts/ wszystko

Twój URI powinien być modelem w ten sposób:

resources/postów/12 jako zasoby/typ/element, aby pobrać jeden element ze zbioru,
zasoby/posty jako zasoby/typ do pracy z całą kolekcją.

Oto przykład kodów:

Wspólna klasa abstrakcyjna Tutaj można realizować pewne wspólne zadania. Jeśli korzystasz z usługi opartej na usługach , może to również zostać wykonane przy użyciu usługi.

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. 
     */ 
    } 
} 

Kod ten jest niekompletny, ale mam nadzieję, że to daje wyobrażenie o tym, co prawdziwe Spokojny API może wyglądać.

Klucz, aby upewnić się, że "aplikacja może wchodzić w interakcje z zasobem, wiedząc dwie rzeczy: identyfikator zasobu i wymagane działanie".

Mam nadzieję, że to pomogło.

Powiązane problemy