如何在 Yii2 REST 控制器中返回空白主体?

Evg*_*kiy 1 php rest response yii2

我尝试在休息控制器中返回空白主体,但它返回“null”。

我已经尝试在脚本的最后一行中使用

\Yii::$app->response->setStatusCode(200);
Run Code Online (Sandbox Code Playgroud)

并得到相同的结果。

我使用高级模板和自定义休息逻辑。控制器延伸 yii\rest\Controller

main.php文件中有我的配置

return [
'id' => 'app-api',
'basePath' => dirname(__DIR__),
'controllerNamespace' => 'api\controllers',
'bootstrap' => ['log'],
'modules' => [],
'components' => [
    'request' => [
        'parsers' => [
            'application/json' => 'yii\web\JsonParser',
        ],
    ],
    'user' => [
        'identityClass' => 'common\models\User',
        'enableAutoLogin' => false,
        'enableSession' => false,
    ],
    'urlManager' => [
        'enablePrettyUrl' => true,
        'enableStrictParsing' => true,
        'showScriptName' => false,
        'rules' => [
            'GET add'  => 'api/add',
            'GET feed'  => 'api/feed',
            'GET remove'  => 'api/remove',
        ],
    ],

],
'params' => $params,
Run Code Online (Sandbox Code Playgroud)

];

这是我的行动

public function actionAdd()
{
    try
    {
        \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        $request = \Yii::$app->request;

        $id = $request->get('id');
        $user = $request->get('user');
        $secret = $request->get('secret');

        if(!$id || !$user || !$secret)
        {
            $this->setStatus(500);
            return [
                'error' => 'missing parameter'
            ];
        }

        if(!$this->checkSecret($secret, [$id, $user]))
        {
            $this->setStatus(500);
            return [
                'error' => 'access denied'
            ];
        }

        $existing = Subscribers::find()->where(['user' => $user])->count();

        if($existing)
        {
            $this->setStatus(500);
            return [
                'error' => 'user already exists in database'
            ];
        }

        $subscriber = new Subscribers();
        $subscriber->user = $user;
        //$subscriber->save();

        /*
         * expected 200 OK and blank body
         * returns 200 OK and 'null'
         */
        return \Yii::$app->response->setStatusCode(200)->send();
    }catch (\Exception $exception)
    {
        $this->setStatus(500);
        return [
            'error' => 'internal error'
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有任何行为,也许我应该这样做?

rob*_*006 5

空字符串是无效的 JSON,因此返回带有空正文和content-type: application/json标头的响应是不正确的。Response::FORMAT_RAW在这种情况下你可能想使用而不是Response::FORMAT_JSON

Yii::$app->response->format = Response::FORMAT_RAW;
return;
Run Code Online (Sandbox Code Playgroud)

这将返回带有content-type: text/html标题的空主体。

但如果你真的想假装你的响应是 JSON 并返回空正文,你可以$content直接设置属性 - 这将跳过响应的格式:

Yii::$app->response->format = Response::FORMAT_JSON;
Yii::$app->response->content = '';
return;
Run Code Online (Sandbox Code Playgroud)