如何在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