2013-10-05 9 views
9

Ich arbeite an der Erstellung einer REST-API, die nur JSON-Daten erhalten und zurückgeben wird.CakePHP REST API entfernen Sie die Notwendigkeit .format

Ich folge den Kuchen Führer und meine Standard-Routen sind wie folgt aus:

GET  /recipes.format 
GET  /recipes/123.format 
POST /recipes.format 
PUT  /recipes/123.format 
DELETE /recipes/123.format 
POST /recipes/123.format 

Allerdings Ich mag nicht wirklich die Notwendigkeit, die „.format“ zu verwenden („.json“ in meinem Fall), da Ich werde nur json akzeptieren.

Ich glaube, es muss einen Weg geben, diese Notwendigkeit zu beseitigen. Ich könnte .htaccess verwenden, um URLs umzuschreiben, aber ich habe das Gefühl, dass es eine Möglichkeit geben muss, dies in einer Cake-Setting-/Konfigurationsdatei irgendwo zu tun.

Kurz gesagt, ich möchte auf GET /recipes abe sein und dieselbe Ausgabe wie GET /recipes.json ausgeben lassen.

DANKE!

Antwort

15

Ich nehme an, Sie verwenden die RequestHandler component. Eine Möglichkeit wäre dann die extension in Ihrem Controller beforeFilter() Rückruf zu codieren:

public function beforeFilter() 
{ 
    parent::beforeFilter(); 
    $this->RequestHandler->ext = 'json'; 
} 

diese Weise ist es immer die JSON-Ansicht und entsprechende Antwort-Header verwenden würde, selbst wenn extension parsing aktiviert ist und eine nicht-.json Erweiterung wurde geliefert in der URL.

wäre eine weitere Option RequestHandlerComponent::renderAs() in Ihrem individuellen Controller-Aktionen zu verwenden sein:

public function index() 
{ 
    $this->RequestHandler->renderAs($this, 'json'); 
    ... 
} 

, die denselben Effekt haben würde, aber Sie würden dies in alle Ihre Aktionen müssen tun, also für den Fall, die Controller allein Zweck ist es, REST-Anforderungen zu behandeln, Sie sind wahrscheinlich besser dran, die Erweiterung zu überschreiben.

+0

beide funktionieren sehr nett & einfach. Vielen Dank, ich denke, ich werde am Ende mit dem overFilter Override gehen. Sehr einfach, danke! – Thomas

+0

wtf? Warum fehlt dies in jedem REST-Handbuch? Arbeite für mich. Vielen Dank :) – west44

+0

funktioniert gut mit Kuchen 3,2 – Rito

4

Zunächst, richten Sie Ihren Router in routes.php Datei.

Router::parseExtensions("json");

Dann Request Komponente an den Controller hinzuzufügen (es ist für die automatische MIME-Typ-Erkennung erforderlich durch HTTP-Header und korrekt anzeigen Klasse wählen).

public $components = array('RequestHandler');

Jetzt sind Sie in der Lage JSON zu erhalten jede Controller-Methode mit .json Erweiterung abfragt, oder von HTTP-Header Accept mit dem gleichen Effekt Angabe ohne Erweiterung angegeben werden muss.

curl -H "Accept: application/json" http://example.com/recipies

+0

dies funktioniert gut, danke, obwohl ich schließlich mit der Lösung von ndm rollen rollen, da es die Notwendigkeit negiert, zusätzliche Header mit jeder Anfrage senden. Trotzdem danke! – Thomas