2013-10-05 8 views
9

Sto lavorando alla creazione di un'API REST che otterrà e restituirà solo dati JSON.L'API RIP di Cakephp elimina la necessità di .format

Sto seguendo la guida torta e miei percorsi di default sono in questo modo:

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

Tuttavia, mi piace davvero la necessità di usare il ".format" (".json" nel mio caso) dal Accetterò sempre e solo il json.

Mi sento come ci deve essere un modo per rimuovere questa necessità. Potrei usare .htaccess per riscrivere gli URL, ma credo che ci debba essere un modo per farlo in un file di configurazione/config di torta da qualche parte.

In breve, voglio essere abe a GET /recipes e farlo emettere la stessa cosa di GET /recipes.json sarebbe.

GRAZIE!

risposta

15

Presumo che si stia utilizzando il RequestHandler component. Un modo potrebbe quindi essere quella di codificare il extension nel vostro controller beforeFilter() callback:

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

In questo modo sarebbe sempre utilizzare il JSON View e appropriate intestazioni di risposta, anche se extension parsing è abilitato e l'estensione non è stato fornito .json nell'URL.

Un'altra opzione sarebbe quella di utilizzare RequestHandlerComponent::renderAs() nelle vostre singole azioni del controller:

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

che avrebbe avuto lo stesso effetto, ma si avrebbe bisogno di fare questo in tutte le vostre azioni, così nel caso in cui i controllori esclusivamente lo scopo è gestire le richieste REST, probabilmente è meglio ignorare l'estensione.

+0

entrambi funzionano molto bene e semplice. Grazie mille, penso che finirò per andare con l'override di beforeFilter. Molto semplice, grazie! – Thomas

+0

wtf? Perché questo manca in ogni manuale REST? Lavora per me. Grazie MOLTO :) – west44

+0

funziona bene con la torta 3.2 – Rito

4

Prima di tutto, impostare il router nel file routes.php.

Router::parseExtensions("json");

Poi aggiungere il componente RequestHandler al controller (è necessario per il riconoscimento automatico tipo MIME per le intestazioni HTTP e la scelta corretta visione di classe).

public $components = array('RequestHandler');

Ora, siete in grado di ricevere JSON interrogazione qualsiasi metodo di controllo con l'estensione .json, o specificando HTTP Accept intestazione con lo stesso effetto, senza bisogno di specificare l'estensione.

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

+0

questo funziona bene, grazie, anche se alla fine sto rotolando con la soluzione fornita da ndm in quanto nega la necessità di inviare intestazioni aggiuntive ad ogni richiesta. Grazie comunque! – Thomas

Problemi correlati