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

时间:2016-11-23 14:46:16

标签: web-services rest yii2

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

我的网址为

"users/photos"
"users/videos"
"users/profile"

它们都呈现Html响应。我想要做的是传递URL中的另一个参数并将响应转换为JSON并将所有视图变量作为JSON输出发送。所以,我不担心代码重复。

实现这一目标的最佳方法是什么?

4 个答案:

答案 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