CakePHP sta gestendo correttamente, perché JSON è un tipo di risposta e non un tipo di richiesta I termini richiesta e risposta potrebbero causare confusione. L'oggetto request rappresenta le informazioni di intestazione della richiesta HTTP inviata al server. Generalmente un browser invia richieste POST o GET a un server e tali richieste possono essere non essere formattate come JSON. Quindi non è possibile che una richiesta sia di tipo JSON.
Detto ciò, il server può fornire una risposta di JSON e un browser può inserire nell'intestazione della richiesta che supporta una risposta JSON. Quindi, piuttosto che controllare quale fosse la richiesta. Verifica quali risposte accettate sono supportate dal browser.
Quindi, anziché scrivere $this->request->isJson()
, è necessario scrivere $this->request->accepts('application/json')
.
Queste informazioni sono visualizzate in modo ambiguo nello document here, ma non vi sono riferimenti see also
nella documentazione is(..)
. Così tante persone ci guardano prima. Non vedere JSON e supponiamo che manchi qualcosa.
Se si desidera utilizzare un rilevatore di richieste per verificare se il browser supporta una risposta JSON, è possibile aggiungere facilmente un solo liner in beforeFilter.
$this->request->addDetector('json',array('callback'=>function($req){return $req->accepts('application/json');}));
V'è un rischio associato a questo approccio, perché un browser può inviare più tipi di risposta come una possibile risposta dal server. Compreso un carattere jolly per tutti i tipi. Quindi questo limita solo le richieste che indicano che una risposta JSON è supportata.Poiché JSON è un formato di testo, un tipo di text/plain
è un tipo di risposta valido per un browser che si aspetta JSON.
Potremmo modificare la nostra regola per includere text/plain
per le risposte JSON come questa.
$this->request->addDetector('json',array('callback'=>function($req){
return $req->accepts('application/json') || $req->accepts('text/plain');
}));
Ciò include le richieste di testo/semplici come un tipo di risposta JSON, ma ora abbiamo un problema. Solo perché il browser supporta una risposta testuale/semplice non significa che si aspetta una risposta JSON.
Ecco perché è meglio incorporare una convenzione di denominazione nel proprio URL per indicare una risposta JSON. È possibile utilizzare un'estensione di file .json
o un prefisso /json/controller/action
.
Preferisco utilizzare un prefisso denominato per gli URL. Ciò consente di creare metodi json_action
nel controller. È quindi possibile creare un rilevatore per il prefisso come questo.
$this->request->addDetector('json',array('callback'=>function($req){return isset($req->params['prefix']) && $req->params['prefix'] == 'json';}));
Ora che rilevatore sarà sempre funziona correttamente, ma io sostengo che è un uso non corretto di rilevare una richiesta JSON. Poiché non esiste una richiesta JSON. Solo le risposte JSON.
Grazie per la risposta, forse la mia domanda è un po 'confusa. Voglio che il sito restituisca i dati JSON quando ha '.json' alla fine dell'URL, altrimenti restituisce il normale HTML View – hrsetyono
sei il benvenuto .. :) –