Home  >  Article  >  PHP Framework  >  Yii2 API interface output unified Json and jsonp format method

Yii2 API interface output unified Json and jsonp format method

angryTom
angryTomforward
2019-11-01 16:00:052347browse

Yii2 API interface output unified Json and jsonp format method

If you are making an API, how can you enable others to have a unified and standard json or jsonp format when they call your interface? However, the format and content of the json response are everyone’s agreement. There are differences, so we must do certain processing before the data is sent out.

1. First we need to initialize to call beforeSend, because we need to do some processing on beforesend. The following is the init initialization processing code:

/**
 * (non-PHPdoc)
 * @see \yii\base\Object::init()
 */
public function init()
{       
    parent::init();	//绑定beforeSend事件,更改数据输出格式
    Yii::$app->getResponse()->on(Response::EVENT_BEFORE_SEND, [$this, 'beforeSend']);
}

2. Then we need to process beforesend. The processing points have the following key points:

1>Change the data output format

2>Json data is output by default

3>If the client passes the $_GET['callback'] parameter when requesting, the output will be in Jsonp format

4>When the request is correct, the data will be {"success":true,"data":{.. .}}

5>The data when requesting an error is {"success":false,"data":{"name":"Not Found","message":"Page not found.","code ":0,"status":404}}

6>The specific code is as follows:

/**
     * 更改数据输出格式
     * 默认情况下输出Json数据
     * 如果客户端请求时有传递$_GET['callback']参数,输入Jsonp格式
     * 请求正确时数据为  {"success":true,"data":{...}}
     * 请求错误时数据为  {"success":false,"data":{"name":"Not Found","message":"页面未找到。","code":0,"status":404}}
     * @param \yii\base\Event $event
     */
    public function beforeSend($event)
    {        /* @var $response \yii\web\Response */
        $response = $event->sender;
        $isSuccessful = $response->isSuccessful;        if ($response->statusCode>=400) {            //异常处理
            if (true && $exception = Yii::$app->getErrorHandler()->exception) {
                $response->data = $this->convertExceptionToArray($exception);
            }            //Model出错了
            if ($response->statusCode==422) {
                $messages=[];                foreach ($response->data as $v) {
                    $messages[] = $v['message'];
                }                //请求错误时数据为  {"success":false,"data":{"name":"Not Found","message":"页面未找到。","code":0,"status":404}}
                $response->data = [                    'name'=> 'valide error',                    'message'=> implode("  ", $messages),                    'info'=>$response->data
                ];
            }
            $response->statusCode = 200;
        }        elseif ($response->statusCode>=300) {
            $response->statusCode = 200;
            $response->data = $this->convertExceptionToArray(new ForbiddenHttpException(Yii::t('yii', 'Login Required')));
        }        //请求正确时数据为  {"success":true,"data":{...}}
        $response->data = [            'success' => $isSuccessful,            'data' => $response->data,
        ];
        $response->format = Response::FORMAT_JSON;
        \Yii::$app->getResponse()->getHeaders()->set('Access-Control-Allow-Origin', '*');
        \Yii::$app->getResponse()->getHeaders()->set('Access-Control-Allow-Credentials', 'true');       //jsonp 格式输出
        if (isset($_GET['callback'])) {
            $response->format = Response::FORMAT_JSONP;
            $response->data = [                'callback' => $_GET['callback'],                'data'=>$response->data,
            ];
        }
    }

3. Some exceptions may occur in response to requests, and we also need to handle exceptions. Some standardized processing converts exceptions into array output. The specific code is as follows:

/**
     * 将异常转换为array输出
     * @see \yii\web\ErrorHandle
     * @param \Exception $exception
     * @return multitype:string NULL Ambigous  \yii\web\integer \yii\db\array multitype:string NULL Ambigous  \yii\web\integer \yii\db\array
     */
    protected function convertExceptionToArray($exception)
    {        if (!YII_DEBUG && !$exception instanceof UserException && !$exception instanceof HttpException) {
            $exception = new HttpException(500, Yii::t('yii', 'An internal server error occurred.'));
        }
        $array = [            'name' => ($exception instanceof Exception || $exception instanceof ErrorException) ? $exception->getName() : 'Exception',            'message' => $exception->getMessage(),            'code' => $exception->getCode(),
        ];        if ($exception instanceof HttpException) {
            $array['status'] = $exception->statusCode;
        }        if (YII_DEBUG) {
            $array['type'] = get_class($exception);            if (!$exception instanceof UserException) {
                $array['file'] = $exception->getFile();
                $array['line'] = $exception->getLine();
                $array['stack-trace'] = explode("\n", $exception->getTraceAsString());                if ($exception instanceof \yii\db\Exception) {
                    $array['error-info'] = $exception->errorInfo;
                }
            }
        }        if (($prev = $exception->getPrevious()) !== null) {
            $array['previous'] = $this->convertExceptionToArray($prev);
        }        return $array;
    }

Okay, so we have the same standard api interface return data format, and the person who calls the interface also Don’t worry about inconsistent formats

Recommended: "Yii2.0 Framework Development Practical Video Tutorial"

The above is the detailed content of Yii2 API interface output unified Json and jsonp format method. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:www.yii-china.com. If there is any infringement, please contact admin@php.cn delete