yii2 - 如何在 json 中强制做出安静的响应?
问题描述
我想向我的 Yii2 站点添加一些 api。Api 必须仅在 json 中。我不想Accept: application/json
为每个请求设置标头。我可以 'response' => ['format' => \yii\web\Response::FORMAT_JSON]
在应用程序配置中进行设置,但它会破坏所有页面。我的 api 函数也以 xml 格式返回数据。
我试图将其rest\ActiveRecord
用于我的目的。也许我这样做是错误的。我想要的是。
让我的基于 Yii2 的站点通过https://example.com/api/controller/action
. 在项目中,我想查看controllers/api
包含我的控制器的文件夹。控制器必须使用基于标准\yii\db\ActiveRecord
的模型。此外,控制器仅在 json 正文中或作为部分 url 输入参数,并仅在 json 中输出数据。
解决方案
更优雅的解决方案是使用yii\filters\ContentNegotiator
. 当Accept
标头丢失时,假定它允许任何类型并以其属性ContentNegotiator
中定义的第一种格式发送响应。$formats
如果请求的格式不在接受的格式中,内容协商器将抛出yii\web\NotAcceptableHttpException
并且应用程序将以 http status 响应406 Not Acceptable
。
您可以使用behaviors()
以下方法将其添加到控制器中:
public function behaviors()
{
return [
[
'class' => 'yii\filters\ContentNegotiator',
'formats' => [
'application/json' => \yii\web\Response::FORMAT_JSON,
],
],
];
}
如果您的控制器扩展yii\rest\Controller
它已经ContentNegotiator
在其行为中添加了过滤器。您只需要限制允许的格式,如下所示:
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['contentNegotiator']['formats'] = [
'application/json' => \yii\web\Response::FORMAT_JSON,
];
return $behaviors;
}
如果将来需要,使用ContentNegotiator
而不是显式强制JSON
格式将允许更轻松地添加其他格式。beforeAction()
推荐阅读
- r - 方差比 - 过程
- node.js - 如何在使用节点调度的当天只运行一次任务
- jenkins - 詹金斯:PasswordParameterValue.value 需要 String 但收到 Secret
- rdf - 对象属性断言的 Protege 推理
- kubernetes - Kubernetes:如何在开始作业之前测试是否存在具有足够资源的节点
- r - 如何在 Rstudio 中转换日期格式
- javascript - JSX 没有相应的结束标记。ts(17014)
- python - 识别 pandas 数据框中的重叠事件(日期时间记录)
- html - 在移动视图中定位视频叠加层
- sql - 搜索所有包含单词大小并以 a? 结尾的记录