2012-08-08 6 views
5

Ich habe eine einfache CakePHP-Anwendung, mit der ein Benutzer Beiträge erstellen und bearbeiten kann. Und ich bin auf der Suche nach der Anwendung in PhoneGap zu einem späteren Zeitpunkt.API mit CakePHP erstellen

Deshalb habe ich eine API erstellt, die JSON für die Verwendung in AJAX-Anfragen ausspuckt, aber ich habe das Gefühl, ich mache es falsch, weil ich REST nicht verwende oder etwas anderes mache, das es von anderem Code unterscheidet in der Steuerung.

z.B. (Anmerkung: Ich vermisse den Teil für dieses Beispiel es in JSON über das Drehen)

class ApiController extends AppController { 

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

Um eine URL wie zu erstellen: domain.com/api/posts/all (würde individuelle Route erstellen, dies zu erreichen), die dann kann ich AJAX-Aufruf mit verwenden, in meiner mobilen App.

Jetzt ist meine Frage, was anders wäre es mit REST zu tun? Ich bin ein Neuling, um Anwendungen zu bauen, und meine Stärken sind Front-End statt Back-End-Entwicklung, so dass alle Hinweise, Hilfe mit diesem würde sehr geschätzt werden.

+0

Wenn Sie Sencha Touch in Ihrer PhoneGab App verwenden, können Sie anstelle von RESTful auch eine [Ext.Direct-Implementierung] (http://banchaproject.org) verwenden. –

Antwort

3

Durch das Aktivieren von REST in CakePHP werden im Wesentlichen die richtigen HTTP-Methoden an Aktionen weitergeleitet. Eine GET-Anforderung würde also an eine Index- oder Ansichtsaktion, eine DELETE-Anforderung, die an die Löschaktion weitergeleitet wird, usw. weitergeleitet.

Dies erstellt einen sehr einfachen Endpunkt für Personen, die Ihre API verwenden. Dann, wenn dieser Endpunkt aufrufen, abhängig von der HTTP-Methode Kuchen leitet es an die richtige Aktion (verzeiht keine HTTP-Request-Syntaxfehler):

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

eine GET-Anfrage, die Routen

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

A POST-Anfrage, die Routen

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 

dies /posts/edit/1.json Lesen werden die meisten Ihrer Fragen beantworten: http://book.cakephp.org/2.0/en/development/rest.html

+0

Okay, das wurde gesagt ... Wie unterscheidet es sich von der Erstellung von Standardmethoden in der Steuerung ohne REST? Auch das mag wie eine andere Frage erscheinen, aber was bietet die DELETE-Methode gegenüber den POST- oder GET-Methoden für Formulare? – Cameron

+0

Zum einen ist es einfacher für Entwickler und für Sie (Erstellen von Dokumenten). Weniger Endpunkte Zweitens würde * die richtige HTTP-Methode * erforderlich sein. Zum Beispiel könnten Benutzer nicht mehr in ihrem Browser "/ api/posts/delete/1" aufrufen und einen Beitrag löschen, sie müssten tatsächlich ein DELETE mit der richtigen Methode anfordern. Außerdem erlaubt Ihnen das REST-System von Cake, verschiedene Inhaltstypen zu akzeptieren und sie automatisch in '$ this-> request-> data' für Sie zu dekodieren.Wenn es für Sie nicht funktioniert, müssen Sie es nicht tun, aber es ist der richtige Weg, um eine RESTful-API zu erstellen. – jeremyharris

3

Wenn Ihr Anliegen ist zu den Rest Prinzipien treu bleiben.

Dann gibt es in der Regel 4 Punkte im Auge zu behalten:

  • Basis-URI für den Webservice
  • Der Internet-Medientyp der von dem Web-Service unterstützt Daten.
    Dies ist oft JSON, XML oder YAML, kann aber auch ein anderes gültiges Internet Medientyp sein.
  • Der Satz von Operationen, die vom Web-Service unter Verwendung der HTTP-Methoden unterstützt werden (z. B. GET, PUT, POST oder DELETE).
  • Die API muss Hypertext

See, um weitere Informationen zu http://en.wikipedia.org/wiki/Representational_state_transfer gefahren werden.

Nun, mit dem gesagt, würde ich vorschlagen, ändern Sie Ihren obigen Code, um etwas zu sein, was in der Nähe der folgenden Pseudo-Codes.

1) Die Existenz von Ressourcen ist der Schlüssel, denken Sie an Ihre Post (s) als eine Sammlung von Ressourcen, auf die von einem URI zugegriffen werden kann.(Authentifizierung & Genehmigung sind andere Bedenken, die Sie auch zu handhaben mögen):

api.domain.com/resources/posts => Diese URI verweist auf eine Sammlung von Beiträgen

2) Der Satz von Operationen, Sie wollen mit HTTP-Methoden/Verben müssen definiert unterstützen, als ein Beispiel, das wir nur ein Mitglied der Sammlung, indem Sie diese abrufen möchten vielleicht:

api.domain.com/resources/posts/12

Unten sind Anfragekopf & Körper, der in einem ankommenden gefunden werden könnte Anfrage für diese URI:

Accept: application/json
Content-Type: application/json
URL: http://api.domain.com/resources/posts/12
Anfrage Methode: GET

Ihre Anwendung der Lage sein sollte, diese Art von Griff Anfrage, ohne die Notwendigkeit der Operation in der URI festlegt, uns zurück zu Punkt zu bringen (1),

eher als eine URI auf diese Weise geschrieben hat:

domain.com/api/posts/ alle

Ihr URI Modell so sein sollte:

Ressourcen/posts/12 als resources/Typ/Artikel ein Mitglied aus der Sammlung abzurufen,
Ressourcen/Beiträge als Ressourcen/Typ, um mit der gesamten Sammlung zu arbeiten.

Hier ist ein Beispiel von Codes:

Gemeinsame abstrakte Klasse Hier finden Sie einige gemeinsame Aufgaben implementieren können. Wenn Sie eine service-basierte Implementierung verwenden, könnte dies auch von einem Service durchgeführt werden.

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

Dieser Code ist unvollständig, aber ich hoffe, es gibt Ihnen eine Vorstellung davon, was ein echtes RESTful API aussehen könnte.

Der Schlüssel, um sicherzustellen, dass
"die Anwendung mit einer Ressource interagieren kann, indem zwei Dinge wissen: die Kennung der Ressource und die Aktion erforderlich".

Hoffentlich half dies.