如何在yii中獲得響應爲json格式(application/json)?如何在yii中獲得響應爲json格式(application/json)?
回答
在(基地)控制器創建此功能:
/**
* 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();
}
然後只需在動作結束致電:
$this->renderJSON($yourData);
$this->layout=false;
header('Content-type: application/json');
echo json_encode($arr);
Yii::app()->end();
json_encode不適用於模型 – 2010-12-18 00:25:06
幾個tewaks:對模型使用CJSON :: encode();因爲'Yii :: app() - > end()'將終止應用程序而不輸出佈局,所以不需要執行'$ this-> layout = false'。 – Ethan 2011-07-21 02:07:22
我認爲你最好改變@marcovtwout的最佳答案 – 2014-04-02 18:21:11
$this->layout=false;
header('Content-type: application/json');
echo CJavaScript::jsonEncode($arr);
Yii::app()->end();
也不要忘記在調用Yii :: app() - > end()之前禁用WebLogRoutes,否則調試信息可能會附加到你的json中並可能使其無效。 – marcovtwout 2012-10-15 15:20:24
很確定end()關閉日誌,這就是爲什麼我在這裏添加它 – 2012-10-15 18:37:28
它不。 end():「終止應用程序,該方法在退出之前通過調用onEndRequest函數替換PHP的exit()函數。」並且在CLogRouter(http://www.yiiframework.com/doc/api/1.1/CLogRouter#processLogs-detail)中:「此方法是CApplication :: onEndRequest事件的事件處理程序。」 – marcovtwout 2012-10-23 13:14:10
Yii::app()->end()
我覺得這個解決方案是不結束應用程序流的最好方式,因爲它使用PHP的exit()
功能,女巫指執行流立即退出。是的,Yii的onEndRequest
處理程序和PHP的register_shutdown_function
,但它仍然過於宿命。
對我來說,更好的辦法是這樣的
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;
}
因此,應用程序流繼續即使後執行。
如果你已經把layout = false,一個簡單的'return'會做什麼?甚至可以省略。我沒有理由嘗試/捕捉並創建自定義異常。 – marcovtwout 2012-10-15 15:23:46
這真是太糟糕了。拋出一個異常來輸出響應。 – grantwparks 2014-08-25 15:44:30
現在,過了一段時間我完全同意使用異常來管理控制器/表示邏輯是錯誤的。 – Mihailoff 2014-08-25 22:18:44
一個更簡單的方法,通過使用
echo CJSON::encode($result);
示例代碼:
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);
}
}
歡呼:)
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');
}
}
對於Yii2控制器內:
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;
}
這應該是被接受的答案。跟隨Yii的api +1。 – Gogol 2015-12-07 07:21:00
謝謝先生!^- ^ – 2016-11-22 02:40:49
- 1. 如何在webview中獲得json響應
- 2. 如何格式化參數JSON以獲得SOAP響應?
- 3. 如何格式化JSON顯示和獲得響應
- 4. 如何獲得在控制檯響應(JSON格式),同時擊中的URL
- 5. 如何從Facebook獲得JSON響應
- 6. 如何從JSON響應獲得價值
- 7. 如何更改JSON響應格式
- 8. 如何獲得在HAL-格式與Spring-HATEOAS響應
- 9. Testcafe獲得json響應
- 10. 無法獲得json響應
- 11. 如何在Spring註釋中獲得響應正文中的JSON
- 12. 在div表格格式中顯示角度獲得響應
- 13. 在JSON響應中格式化日期
- 14. 如何獲得這樣的json格式?
- 15. 如何在Sencha Touch中獲得服務器JSON響應?
- 16. 如何在swift 3.0中獲得Json響應?
- 17. 如何獲得在codeigniter視圖中json ajax調用的響應?
- 18. 如何在改進版本2.0.2中獲得Json響應?
- 19. 如何在JavaScript文件中獲得Alfresco webscript JSON響應
- 20. 在codeigniter中創建webservice時無法獲得json格式的響應
- 21. 如何在QtWebKit中獲得響應
- 22. 如何獲取特定格式的JSON響應?
- 23. 如何以XML/JSON格式獲取HttpClient的GEtMethod響應
- 24. JSON響應打開爲對話框在PHP和JSON響應格式
- 25. 如何在Laravel 5.2中以JSON格式返回403響應?
- 26. 如何使用KSoap2 Android API以xml格式獲得webservices響應?
- 27. 如何獲得Lambda API的常見響應格式?
- 28. 如何獲得CSS表格到100%的響應式設計
- 29. 如何在Drupal 8中爲節點/ {nid}獲得乾淨的JSON響應?
- 30. 如何獲得API響應
我注意到設置** header()**或** Yii :: app() - > end(); **沒有任何區別。在Chrome開發者工具中,如果您注意到**標題**選項卡下的**響應標題**,則它們都會提供相同的內容長度。如果ajax已經以「json」格式輸出,那麼即使發送了HTML,瀏覽器/ jQuery也會將該響應視爲json。它似乎適用於所有現代瀏覽器。雖然,我不否認設置標題()是一件好事。 – mohitp 2013-03-02 08:31:21
而不是禁用Web日誌路由,這種方法將更強大(尚未測試): ~~~ ob_start(); Yii :: app() - > end(0,false); ob_end_clean(); exit(0); – marcovtwout 2013-03-14 09:34:42