CakePHP là xử lý này một cách chính xác, bởi vì JSON là một loại phản ứng và không phải là một loại yêu cầu. Yêu cầu và phản hồi của các điều khoản có thể gây ra một số khó hiểu. Đối tượng yêu cầu thể hiện thông tin tiêu đề của yêu cầu HTTP được gửi đến máy chủ. Trình duyệt thường gửi yêu cầu POST hoặc GET tới máy chủ và các yêu cầu đó có thể không phải được định dạng là JSON. Vì vậy, nó không thể cho một yêu cầu được loại JSON.
Với điều đó đã nói, máy chủ có thể trả lời JSON và trình duyệt có thể đặt vào tiêu đề yêu cầu hỗ trợ phản hồi JSON. Vì vậy, thay vì kiểm tra xem yêu cầu là gì. Kiểm tra những phản hồi được chấp nhận được hỗ trợ bởi trình duyệt.
Vì vậy, thay vì viết $this->request->isJson()
bạn nên viết $this->request->accepts('application/json')
.
Thông tin này được hiển thị mơ hồ trong document here, nhưng không có tham chiếu see also
liên kết trong tài liệu is(..)
. Vì vậy, nhiều người nhìn có đầu tiên. Không thấy JSON và giả sử một cái gì đó bị thiếu.
Nếu bạn muốn sử dụng bộ dò tìm yêu cầu để kiểm tra xem trình duyệt có hỗ trợ phản hồi JSON hay không, thì bạn có thể dễ dàng thêm một lớp lót vào bộ lọc trước của mình.
$this->request->addDetector('json',array('callback'=>function($req){return $req->accepts('application/json');}));
Có rủi ro liên quan đến phương pháp này, bởi vì trình duyệt có thể gửi nhiều loại phản hồi dưới dạng phản hồi có thể từ máy chủ. Bao gồm ký tự đại diện cho tất cả các loại. Vì vậy, điều này giới hạn bạn chỉ yêu cầu chỉ ra một phản ứng JSON được hỗ trợ.Vì JSON là định dạng văn bản, kiểu text/plain
là loại phản hồi hợp lệ cho trình duyệt mong đợi JSON.
Chúng tôi có thể sửa đổi quy tắc của chúng tôi để bao gồm text/plain
cho các phản hồi JSON như thế này.
$this->request->addDetector('json',array('callback'=>function($req){
return $req->accepts('application/json') || $req->accepts('text/plain');
}));
Điều đó sẽ bao gồm yêu cầu văn bản/đơn giản làm loại phản hồi JSON, nhưng giờ chúng tôi gặp sự cố. Chỉ vì trình duyệt hỗ trợ trả lời văn bản/đồng bằng không có nghĩa là nó đang mong đợi một phản hồi JSON.
Đây là lý do tại sao nên kết hợp quy ước đặt tên vào URL của bạn để biểu thị phản hồi JSON. Bạn có thể sử dụng tiện ích mở rộng tệp .json
hoặc tiền tố /json/controller/action
.
Tôi thích sử dụng tiền tố được đặt tên cho URL. Điều đó cho phép bạn tạo các phương thức json_action
trong bộ điều khiển của mình. Sau đó, bạn có thể tạo bộ dò tìm cho tiền tố như thế này.
$this->request->addDetector('json',array('callback'=>function($req){return isset($req->params['prefix']) && $req->params['prefix'] == 'json';}));
Trình phát hiện sẽ luôn hoạt động chính xác, nhưng tôi cho rằng đó là việc sử dụng không chính xác phát hiện yêu cầu JSON. Vì không có thứ gì như một yêu cầu JSON. Chỉ trả lời JSON.
Cảm ơn câu trả lời, có lẽ câu hỏi của tôi hơi khó hiểu. Tôi muốn trang web trả lại dữ liệu JSON khi nó có '.json' ở cuối URL, nếu không, hãy quay lại chế độ xem HTML bình thường – hrsetyono
bạn được chào đón .. :) –