CakePHP jest obsługa to prawidłowo, ponieważ JSON jest rodzajem odpowiedzi a nie typu wniosku. Warunki żądania i odpowiedzi mogą powodować pewne zamieszanie. Obiekt żądania reprezentuje informacje o nagłówku żądania HTTP wysłanego na serwer. Przeglądarka zazwyczaj wysyła żądania POST lub GET do serwera, a te żądania mogą być , a nie sformatowane jako JSON. Tak więc nie jest możliwe, aby wniosek był typu JSON.
Po tym, serwer może dać odpowiedź JSON i przeglądarka może umieścić w nagłówku żądania, że obsługuje odpowiedź JSON. Więc zamiast sprawdzać, co było prośbą. Sprawdź, jakie zaakceptowane odpowiedzi są obsługiwane przez przeglądarkę.
Zamiast więc pisać $this->request->isJson()
powinieneś napisać: $this->request->accepts('application/json')
.
Ta informacja jest niejednoznacznie wyświetlana w document here, ale nie ma odnośników see also
w dokumentacji see also
. Tak wielu ludzi najpierw tam patrzy. Nie widzisz JSON i zakładam, że czegoś brakuje.
Jeśli chcesz użyć detektora żądań w celu sprawdzenia, czy przeglądarka obsługuje odpowiedź JSON, możesz z łatwością dodać jedną linijkę do swojego filtru beforeFilter.
$this->request->addDetector('json',array('callback'=>function($req){return $req->accepts('application/json');}));
Istnieje ryzyko związane z tym podejściem, ponieważ przeglądarka może wysłać wiele odpowiedzi jako możliwą odpowiedź z serwera. W tym symbol wieloznaczny dla wszystkich typów. Ogranicza to zatem tylko żądania, które wskazują, że odpowiedź JSON jest obsługiwana.Ponieważ JSON jest formatem tekstowym, typ text/plain
jest poprawnym typem odpowiedzi dla przeglądarki oczekującej JSON.
Możemy zmodyfikować naszą regułę, dodając text/plain
dla takich odpowiedzi JSON.
$this->request->addDetector('json',array('callback'=>function($req){
return $req->accepts('application/json') || $req->accepts('text/plain');
}));
Który zawiera żądania tekst/zwykły jako typ odpowiedzi JSON, ale teraz mamy problem. To, że przeglądarka obsługuje odpowiedź tekstową/zwykłą, nie oznacza, że oczekuje odpowiedzi JSON.
Dlatego lepiej wprowadzić do adresu URL konwencję nazewnictwa, aby wskazać odpowiedź JSON. Możesz użyć rozszerzenia pliku .json
lub prefiksu /json/controller/action
.
Wolę używać nazwanego prefiksu dla adresów URL. To pozwala na tworzenie metod json_action
w kontrolerze. Następnie możesz utworzyć wykrywacz dla takiego prefiksu.
Teraz detektor będzie działał poprawnie, ale twierdzę, że jest to nieprawidłowe użycie wykrycia żądania JSON. Ponieważ nie ma czegoś takiego jak żądanie JSON. Tylko odpowiedzi JSON.
Dzięki za odpowiedź, może moje pytanie jest nieco mylące. Chcę, aby strona zwróciła dane JSON, gdy ma '.json' na końcu adresu URL, w przeciwnym razie zwróci normalny widok HTML – hrsetyono
jesteś mile widziany .. :) –