Web services 将移动应用程序的Yii2响应转换为Json响应

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

我有一个Yii2应用程序,我们想开始为移动设备构建restful服务

我的网址是

"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()视图变量。