Cách nhận phản hồi dưới dạng định dạng json (ứng dụng/json) trong yii?Cách nhận phản hồi dưới dạng định dạng json (ứng dụng/json) trong yii?
Trả lời
Tạo chức năng này trong (cơ sở) điều khiển của bạn:
/**
* Return data to browser as JSON and end application.
* @param array $data
*/
protected function renderJSON($data)
{
header('Content-type: application/json');
echo CJSON::encode($data);
foreach (Yii::app()->log->routes as $route) {
if($route instanceof CWebLogRoute) {
$route->enabled = false; // disable any weblogroutes
}
}
Yii::app()->end();
}
Sau đó, chỉ cần gọi vào cuối hành động của bạn:
$this->renderJSON($yourData);
$this->layout=false;
header('Content-type: application/json');
echo json_encode($arr);
Yii::app()->end();
json_encode không hoạt động với các kiểu –
Một vài tewaks: sử dụng CJSON :: encode() cho các mô hình; không cần phải làm '$ this-> layout = false' vì' Yii :: app() -> end() 'sẽ chấm dứt ứng dụng mà không xuất ra layout. – Ethan
Tôi nghĩ tốt hơn là bạn nên thay đổi câu trả lời hay nhất cho @marcovtwout –
$this->layout=false;
header('Content-type: application/json');
echo CJavaScript::jsonEncode($arr);
Yii::app()->end();
Cũng đừng quên vô hiệu hóa WebLogRoutes trước khi gọi Yii :: app() -> end() hoặc thông tin gỡ lỗi có thể được thêm vào json của bạn và có khả năng hiển thị nó không hợp lệ . – marcovtwout
khá chắc chắn rằng kết thúc() tắt các bản ghi, đó là lý do tại sao tôi thêm nó ở đây –
Nó không. end(): "Chấm dứt ứng dụng. Phương thức này thay thế hàm exit() của PHP bằng cách gọi onEndRequest trước khi thoát." Và trong CLogRouter (http://www.yiiframework.com/doc/api/1.1/CLogRouter#processLogs-detail): "Phương thức này là một trình xử lý sự kiện cho sự kiện CApplication :: onEndRequest." – marcovtwout
Yii::app()->end()
Tôi nghĩ rằng giải pháp này không phải là cách tốt nhất để kết thúc dòng chảy ứng dụng, vì nó sử dụng exit()
chức năng của PHP, phù thủy có nghĩa là thoát ngay lập tức từ dòng chảy thực hiện. Có, có bộ xử lý onEndRequest
của Yii và số register_shutdown_function
của PHP nhưng nó vẫn quá tàn bạo.
Đối với tôi, cách tốt hơn là này
public function run($actionID)
{
try
{
return parent::run($actionID);
}
catch(FinishOutputException $e)
{
return;
}
}
public function actionHello()
{
$this->layout=false;
header('Content-type: application/json');
echo CJavaScript::jsonEncode($arr);
throw new FinishOutputException;
}
Vì vậy, dòng chảy ứng dụng tiếp tục thực hiện ngay cả sau khi.
Nếu bạn đã đặt layout = false, một 'return' đơn giản sẽ làm gì? Thậm chí có thể được bỏ qua. Tôi thấy không có lý do để thử/bắt và tạo ngoại lệ tùy chỉnh. – marcovtwout
Điều đó thật tệ. Ném một ngoại lệ để xuất đáp ứng. – grantwparks
Bây giờ, sau một thời gian, tôi hoàn toàn đồng ý rằng việc sử dụng các ngoại lệ để quản lý logic điều khiển/trình bày là sai. – Mihailoff
thêm một cách đơn giản bằng cách sử dụng
echo CJSON::encode($result);
mã ví dụ:
public function actionSearch(){
if (Yii::app()->request->isAjaxRequest && isset($_POST['term'])) {
$models = Model::model()->searchNames($_POST['term']);
$result = array();
foreach($models as $m){
$result[] = array(
'name' => $m->name,
'id' => $m->id,
);
}
echo CJSON::encode($result);
}
}
cổ vũ :)
class JsonController extends CController {
protected $jsonData;
protected function beforeAction($action) {
ob_clean(); // clear output buffer to avoid rendering anything else
header('Content-type: application/json'); // set content type header as json
return parent::beforeAction($action);
}
protected function afterAction($action) {
parent::afterAction($action);
exit(json_encode($this->jsonData)); // exit with rendering json data
}
}
class ApiController extends JsonController {
public function actionIndex() {
$this->jsonData = array('test');
}
}
Đối Yii2 bên trong một bộ điều khiển :
public function actionSomeAjax() {
$returnData = ['someData' => 'I am data', 'someAnotherData' => 'I am another data'];
$response = Yii::$app->response;
$response->format = \yii\web\Response::FORMAT_JSON;
$response->data = $returnData;
return $response;
}
Điều này đáng lẽ phải là câu trả lời được chấp nhận. 1 để theo dõi api của Yii. – Gogol
Cảm ơn bạn!^- ^ –
- 1. Jquery - Lưu trữ phản hồi Ajax jSON dưới dạng biến
- 2. Gửi phản hồi Json dưới dạng Chuỗi và Số nguyên ...
- 3. Định dạng phản hồi API Stackoverflow
- 4. HTTPResponse dưới dạng JSON trong Java
- 5. Google Chrome hiển thị phản hồi JSON AJAX dưới dạng cây chứ không phải dưới dạng văn bản thuần túy
- 6. Loại nội dung phản hồi dưới dạng CSV
- 7. Bản vẽ ASCII xuất hiện dưới dạng phản hồi JSON theo yêu cầu cho Google
- 8. Cách nhận phản hồi dưới dạng Tài liệu XML với Apache Httpclient api?
- 9. Cách nhận nội dung gửi gzip dưới dạng phản hồi PHP
- 10. Hiển thị phản hồi theo định dạng được mong đợi
- 11. Rails 4 - Tùy chỉnh định dạng (json) của các đối tượng phản hồi trong Rails
- 12. IE8 xử lý phản hồi json dưới dạng tệp và cố gắng tải xuống nó
- 13. Cách trả về giá trị từ Python dưới dạng JSON?
- 14. Cách trả về định dạng ngày tháng cụ thể dưới dạng JSON trong Grails?
- 15. Phản hồi json rất dài dừng và gửi tiêu đề HTTP dưới dạng văn bản rồi tiếp tục
- 16. phím json dưới dạng số
- 17. Làm cách nào để trả lại tệp HTML tĩnh dưới dạng phản hồi trong Django?
- 18. Cách phân tích cú pháp phản hồi HTTP thô dưới dạng HttpListenerResponse?
- 19. cách định dạng đầu ra Json?
- 20. Cách định dạng int dưới dạng tiền tệ trong C#?
- 21. Định dạng JSON trong Perl
- 22. Phản hồi JSON trong postPath AFHTTPClient
- 23. Phản ứng của Amazon S3 trong JSON?
- 24. Html, xử lý phản hồi JSON
- 25. MVC trả về một phần xem dưới dạng JSON
- 26. Làm cách nào tôi có thể nhận tiêu đề từ phản hồi dưới dạng ServletResponse(). GetHeader (chuỗi) không hiển thị?
- 27. Xử lý JSON $ .post Phản hồi JSON
- 28. SQLAlchemy JSON dưới dạng blob/text
- 29. Điều gì làm cho quá trình xuất hiện dưới dạng Không phản hồi trong Windows?
- 30. window.location.search truy vấn dưới dạng JSON
Tôi đã nhận thấy rằng việc đặt tiêu đề **() ** hoặc ** Yii :: app() -> end(); ** không tạo ra bất kỳ sự khác biệt nào.Trong Công cụ nhà phát triển Chrome, nếu bạn nhận thấy ** Tiêu đề phản hồi ** trong tab ** Tiêu đề **, tất cả đều cung cấp cùng một Độ dài nội dung. Nếu ajax đã được thực hiện với đầu ra được mong đợi ở định dạng "json", thì ngay cả khi HTML được gửi đi, trình duyệt/jQuery xử lý đáp ứng đó là json. Và dường như nó hoạt động trong tất cả các trình duyệt hiện đại. Mặc dù, tôi không phủ nhận rằng việc đặt tiêu đề() là một điều tốt. – mohitp
Thay vì tắt các tuyến nhật ký web, phương pháp này sẽ mạnh mẽ hơn (chưa được thử nghiệm): ~~~ ob_start(); Yii :: app() -> end (0, false); ob_end_clean(); thoát (0); – marcovtwout