5 Stimmen

API mit CakePHP erstellen

Ich habe eine einfache CakePHP-Anwendung, die ein Benutzer zu erstellen und zu bearbeiten Beiträge ermöglicht. Und ich bin auf der Suche, um die Anwendung in PhoneGap irgendwann in der Zukunft zu bekommen.

Daher habe ich eine API erstellt, die JSON für die Verwendung in AJAX-Anfragen ausspuckt, aber ich habe das Gefühl, dass ich es falsch mache, da ich nicht REST verwende oder etwas anderes tue, das sich von anderem Code im Controller unterscheidet.

z.B. (HINWEIS: Ich vermisse den Teil, in dem es um die Umwandlung in JSON für dieses Beispiel geht)

class ApiController extends AppController {

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

So erstellen Sie eine Url wie: domain.com/api/posts/all (dazu würde ich eine benutzerdefinierte Route erstellen), die ich dann über AJAX aufrufen kann, um sie in meiner mobilen Anwendung zu verwenden.

Jetzt ist meine Frage, was anders wäre es mit REST tun? Ich bin sehr viel ein Neuling in den Aufbau von Anwendungen und meine Stärken sind in Front-End eher als Back-End-Entwicklung, so dass alle Hinweise, Hilfe mit diesem wäre sehr geschätzt werden.

3voto

jeremyharris Punkte 7830

Die Aktivierung von REST in CakePHP leitet grundsätzlich die richtigen HTTP-Methoden an Aktionen weiter. Eine GET-Anfrage wird also an eine Index- oder View-Aktion weitergeleitet, eine DELETE-Anfrage an die Delete-Aktion und so weiter.

Dies schafft einen sehr einfachen Endpunkt für die Benutzer Ihrer API. Wenn dieser Endpunkt aufgerufen wird, leitet Cake ihn je nach HTTP-Methode an die richtige Aktion weiter (verzeihen Sie etwaige Syntaxfehler bei HTTP-Anfragen):

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

Eine GET-Anfrage, die zu /posts/index.json führt

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

Eine POST-Anfrage, die zu /posts/edit/1.json führt

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

Wenn Sie dies lesen, werden die meisten Ihrer Fragen beantwortet: http://book.cakephp.org/2.0/en/development/rest.html

3voto

bluetazmanian Punkte 106

Wenn es Ihnen darum geht, den Restprinzipien treu zu bleiben.

Dann gibt es in der Regel 4 Punkte, die zu beachten sind:

  • Basis-URI für den Webdienst
  • Der Internet-Medientyp der vom Webdienst unterstützten Daten.
    Dies ist oft JSON, XML oder YAML, kann aber auch jede andere gültige Internet Medientyp sein.
  • Die vom Webdienst unterstützten Operationen unter Verwendung von HTTP-Methoden (z. B. GET, PUT, POST oder DELETE).
  • Die API muss hypertextgesteuert sein

Siehe, http://en.wikipedia.org/wiki/Representational_state_transfer für weitere Einzelheiten.

Nun, mit dieser sagte, würde ich vorschlagen, ändern Sie Ihre oben genannten Code zu sein, was in der Nähe der unten Pseudo-Codes.

1) Das Vorhandensein von Ressourcen ist der Schlüssel. Stellen Sie sich Ihren Beitrag als eine Sammlung von Ressourcen vor, auf die über einen URI zugegriffen werden kann (Authentifizierung und Autorisierung sind weitere Aspekte, die Sie vielleicht auch berücksichtigen möchten):

api.domain.com/resources/posts => Dieser URI verweist auf eine Sammlung von Posts

2) Der Satz von Operationen, die Sie mit HTTP-Methoden/Verben unterstützen wollen, muss definiert werden, z. B. wenn Sie nur ein Mitglied der Sammlung abrufen wollen:

api.domain.com/resources/posts/12

Nachfolgend finden Sie die Kopfzeilen und den Textkörper einer eingehenden Anfrage für diese URI:

Akzeptieren: application/json
Inhalt-Typ: application/json
Url anfordern: http://api.domain.com/resources/posts/12
Methode anfordern: GET

Ihre Anwendung sollte in der Lage sein, diese Art von Anfrage zu bearbeiten, ohne dass die Operation im URI angegeben werden muss, womit wir wieder bei Punkt (1) wären,

als dass ein URI auf diese Weise geschrieben wird:

domain.com/api/posts/ alle

Ihr URI sollte auf diese Weise modelliert werden:

resources/posts/12 als resources/type/item, um ein Mitglied aus der Sammlung abzurufen,
resources/posts als resources/type, um mit der gesamten Sammlung zu arbeiten.

Hier ist ein Beispiel für Codes:

Gemeinsame abstrakte Klasse Hier können Sie einige allgemeine Aufgaben implementieren. Wenn Sie eine dienstbasierte Implementierung verwenden können diese Aufgaben auch durch einen Dienst erledigt 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, er liefert eine Vorstellung davon, wie eine echte Restful-API aussehen könnte.

Der Schlüssel dazu ist, sicherzustellen, dass
"Die Anwendung kann mit einer Ressource interagieren, indem sie zwei Dinge kennt: den Bezeichner der Ressource und die erforderliche Aktion".

Ich hoffe, das hat geholfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X