Web services 将移动应用程序的Yii2响应转换为Json响应
我有一个Yii2应用程序,我们想开始为移动设备构建restful服务 我的网址是Web services 将移动应用程序的Yii2响应转换为Json响应,web-services,rest,yii2,Web Services,Rest,Yii2,我有一个Yii2应用程序,我们想开始为移动设备构建restful服务 我的网址是 "users/photos" "users/videos" "users/profile" 它们都呈现Html响应。我想做的是在URL中传递另一个参数,将响应转换为JSON,并将所有视图变量作为JSON输出发送。所以,我不担心代码重复 实现这一点的最佳方法是什么?如果您的结果是一个数组,您可以这样做: public function actionPhotos($json = false) { if ($j
"users/photos"
"users/videos"
"users/profile"
它们都呈现Html响应。我想做的是在URL中传递另一个参数,将响应转换为JSON,并将所有视图变量作为JSON输出发送。所以,我不担心代码重复
实现这一点的最佳方法是什么?如果您的结果是一个数组,您可以这样做:
public function actionPhotos($json = false)
{
if ($json) {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
}
// the rest stays the same
}
如果这只是一些呈现的HTML视图,则必须准备单独的操作(或添加条件返回)。如果结果是数组,则可以这样做:
public function actionPhotos($json = false)
{
if ($json) {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
}
// the rest stays the same
}
如果这只是某个呈现的HTML视图,您必须准备单独的操作(或添加条件返回)。您可以为此更改行为 作为一个例子,我喜欢它
public function behaviors() {
$behaviors = parent::behaviors();
$behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;
return $behaviors;
}
你可以改变这样做的行为 作为一个例子,我喜欢它
public function behaviors() {
$behaviors = parent::behaviors();
$behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;
return $behaviors;
}
这取决于你的行动回报了什么 1.对于简单的情况,如呈现HTML视图或在请求json输出时返回数据数组,我会选择。对于大多数情况,这是最简单和最好的 2.如果您计划支持和维护多种输出格式,而不仅仅是json格式,那么另一个选择是实现内置格式,在将来需要时,您可以通过自己设计的类覆盖
\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;
}
}
这应该通过将\u format
url属性设置为所需的输出来实现,如:
http://localhost/some_app/web/index.php?r=site/about&_format=json
3.对于应返回和序列化模型实例的高级情况,应支持分页(如GET/data?per page=5&page=2
),页眉中应包含与分页相关的链接和元,应获取模型验证错误,。。。在这种情况下,我建议使用或创建一个类似的控制器类,该类作为类的子类构建,并在输出数据时使用内置类。它的完整源代码并不难理解,而且可以找到
4.如果您需要的是通过支持所有谓词、状态代码、CRUD操作、etag缓存实现的完整REST实现。。。然后我建议实现内置的RESTfulWeb服务API,文档从这里开始:。这取决于您的操作返回的内容 1.对于简单的情况,如呈现HTML视图或在请求json输出时返回数据数组,我会选择。对于大多数情况,这是最简单和最好的 2.如果您计划支持和维护多种输出格式,而不仅仅是json格式,那么另一个选择是实现内置格式,在将来需要时,您可以通过自己设计的类覆盖
\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;
}
}
这应该通过将\u format
url属性设置为所需的输出来实现,如:
http://localhost/some_app/web/index.php?r=site/about&_format=json
3.对于应返回和序列化模型实例的高级情况,应支持分页(如GET/data?per page=5&page=2
),页眉中应包含与分页相关的链接和元,应获取模型验证错误,。。。在这种情况下,我建议使用或创建一个类似的控制器类,该类作为类的子类构建,并在输出数据时使用内置类。它的完整源代码并不难理解,而且可以找到
4.如果您需要的是通过支持所有谓词、状态代码、CRUD操作、etag缓存实现的完整REST实现。。。然后,我建议实现内置的RESTful Web服务API,文档从这里开始:。您可以在任何地方设置响应数据格式,只要您想更改返回的数据格式,就可以在您的方法中使用此方法,甚至出现以下情况:
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
您还可以使用Yii2中提供的其他数据响应格式
您还可以在特定条件下更改响应格式。
例如,当对控制器的请求是Ajax时,将响应格式更改为JSON。您可以在任何地方设置响应数据格式,只要您想更改返回的数据格式,就可以在您的方法中使用此方法,甚至在出现以下情况时:
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
您还可以使用Yii2中提供的其他数据响应格式
您还可以在特定条件下更改响应格式。
例如,当对控制器的请求是Ajax时,将响应格式更改为JSON,这将是太多的工作。我不能在每一个方法中都添加一个额外的参数——这会耗费时间。我采用了一种更好的方法,创建了一个新的控制器类,并将其扩展到“yii\web\controller”,然后覆盖render函数。我能够实现我所需要的大部分功能,但我仍然不确定如何处理$this->redect()。如果覆盖该函数,则无法获取$this->render()视图变量。这将是太多的工作。我不能在每一个方法中都添加一个额外的参数——这会耗费时间。我采用了一种更好的方法,创建了一个新的控制器类,并将其扩展到“yii\web\controller”,然后覆盖render函数。我能够实现我所需要的大部分功能,但我仍然不确定如何处理$this->redect()。如果覆盖该函数,则不会获得$this->render()视图变量。