我有一个Yii2应用程序,我们希望开始为移动设备构建restful服务。
我的网址为
"users/photos"
"users/videos"
"users/profile"
它们都呈现Html响应。我想要做的是传递URL中的另一个参数并将响应转换为JSON并将所有视图变量作为JSON输出发送。所以,我不担心代码重复。
实现这一目标的最佳方法是什么?
答案 0 :(得分:2)
如果您的结果是数组,您可以这样做:
public function actionPhotos($json = false)
{
if ($json) {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
}
// the rest stays the same
}
如果这只是一些渲染的HTML视图,则必须准备单独的操作(或添加条件返回)。
答案 1 :(得分:1)
您可以在方法中使用此方法甚至在出现条件时,在任何想要更改返回数据格式的地方设置响应数据格式:
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
您还可以使用This API
中Yii2中提供的其他数据响应格式您也可以在某种情况下更改响应格式。 例如,当对控制器的请求是Ajax
时,将响应格式更改为JSON答案 2 :(得分:0)
你可以改变这样做的行为 像这样的例子
public function behaviors() {
$behaviors = parent::behaviors();
$behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;
return $behaviors;
}
答案 3 :(得分:0)
这取决于你的行动回归。
1。对于简单的情况,例如渲染HTML视图或在请求json输出时返回数据数组,我会选择@Bizley suggestion。对于大多数情况来说,这是最简单和最好的。
2. 如果您计划支持和维护许多输出格式,而不仅仅是json,那么另一个选择是实现内置yii\filters\ContentNegotiator,您将能够如果需要,将来可以通过您自己设计的类覆盖\yii\web\Response
:
public function behaviors()
{
return [
'contentNegotiator' => [
'class' => \yii\filters\ContentNegotiator::className(),
'formats' => [
'application/json' => \yii\web\Response::FORMAT_JSON,
'application/javascript' => \yii\web\Response::FORMAT_JSONP,
'application/xml' => \yii\web\Response::FORMAT_XML,
'text/plain' => \yii\web\Response::FORMAT_RAW,
'text/html' => \yii\web\Response::FORMAT_HTML,
],
],
];
}
public function actionAbout()
{
switch (\Yii::$app->response->format) {
case 'json':
case 'xml':
return ['a'=>'b'];
break;
default:
return $this->render('about');
break;
}
}
这可以通过将_format
url属性设置为所需的输出来实现,如:
http://localhost/some_app/web/index.php?r=site/about&_format=json
3. 对于应返回并序列化模型实例的高级情况,支持分页(如GET /data?per-page=5&page=2
),标题中需要与分页相关的链接和元数据,模型验证应该提取错误,...在这种情况下,我建议使用或创建一个类似的Controller类到yii/rest/controller,它构建为yii/web/controller类的子类并使用内置的{输出数据时{3}}类。它的完整源代码并不难理解,可以找到yii/rest/serializer。
4. 如果您需要的是完整的REST实现,支持所有动词,状态代码,CRUD操作,etag缓存......那么我建议实现内置的RESTful Web文档从此处开始的服务API:here。