Maison > cadre php > YII > L'interface API Yii2 produit une méthode de format Json et jsonp unifiée

L'interface API Yii2 produit une méthode de format Json et jsonp unifiée

angryTom
Libérer: 2019-11-01 18:01:31
avant
2645 Les gens l'ont consulté

L'interface API Yii2 produit une méthode de format Json et jsonp unifiée

Si vous créez une API, comment pouvez-vous permettre aux autres d'avoir un format json ou jsonp standard unifié lorsqu'ils appellent votre interface. Cependant, le format et le contenu de la réponse json sont les mêmes ? tout le monde est d'accord. Il y a des différences, nous devons donc procéder à certains traitements avant l'envoi des données.

1. Nous devons d'abord initialiser pour appeler beforeSend, car nous devons effectuer un traitement sur beforesend. Voici le code de traitement d'initialisation :

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

<. 🎜>2. Ensuite, nous devons traiter avant l'envoi. Les points de traitement ont les points clés suivants :

1> Modifier le format de sortie des données

2> 🎜>

3> Si le client passe le paramètre $_GET['callback'] lors de la requête, la sortie est au format Jsonp

4> :true,"data":{.. .}}

5>Les données lors de la demande d'erreur sont {"success":false,"data":{"name":"Not Found"," message":"Page introuvable.","code ":0,"status":404}}

6>Le code spécifique est le suivant :

/**
     * 更改数据输出格式
     * 默认情况下输出Json数据
     * 如果客户端请求时有传递$_GET[&#39;callback&#39;]参数,输入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[&#39;message&#39;];
                }                //请求错误时数据为  {"success":false,"data":{"name":"Not Found","message":"页面未找到。","code":0,"status":404}}
                $response->data = [                    &#39;name&#39;=> &#39;valide error&#39;,                    &#39;message&#39;=> implode("  ", $messages),                    &#39;info&#39;=>$response->data
                ];
            }
            $response->statusCode = 200;
        }        elseif ($response->statusCode>=300) {
            $response->statusCode = 200;
            $response->data = $this->convertExceptionToArray(new ForbiddenHttpException(Yii::t(&#39;yii&#39;, &#39;Login Required&#39;)));
        }        //请求正确时数据为  {"success":true,"data":{...}}
        $response->data = [            &#39;success&#39; => $isSuccessful,            &#39;data&#39; => $response->data,
        ];
        $response->format = Response::FORMAT_JSON;
        \Yii::$app->getResponse()->getHeaders()->set(&#39;Access-Control-Allow-Origin&#39;, &#39;*&#39;);
        \Yii::$app->getResponse()->getHeaders()->set(&#39;Access-Control-Allow-Credentials&#39;, &#39;true&#39;);       //jsonp 格式输出
        if (isset($_GET[&#39;callback&#39;])) {
            $response->format = Response::FORMAT_JSONP;
            $response->data = [                &#39;callback&#39; => $_GET[&#39;callback&#39;],                &#39;data&#39;=>$response->data,
            ];
        }
    }
Copier après la connexion

3. Certaines exceptions peuvent survenir en réponse aux demandes, et nous devons également gérer les exceptions. Certains traitements standardisés, convertissent les exceptions en sortie de tableau, le code spécifique est le suivant :

/**
     * 将异常转换为array输出
     * @see \yii\web\ErrorHandle
     * @param \Exception $exception
     * @return multitype:string NULL Ambigous <string, \yii\base\string> \yii\web\integer \yii\db\array multitype:string NULL Ambigous <string, \yii\base\string> \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(&#39;yii&#39;, &#39;An internal server error occurred.&#39;));
        }
        $array = [            &#39;name&#39; => ($exception instanceof Exception || $exception instanceof ErrorException) ? $exception->getName() : &#39;Exception&#39;,            &#39;message&#39; => $exception->getMessage(),            &#39;code&#39; => $exception->getCode(),
        ];        if ($exception instanceof HttpException) {
            $array[&#39;status&#39;] = $exception->statusCode;
        }        if (YII_DEBUG) {
            $array[&#39;type&#39;] = get_class($exception);            if (!$exception instanceof UserException) {
                $array[&#39;file&#39;] = $exception->getFile();
                $array[&#39;line&#39;] = $exception->getLine();
                $array[&#39;stack-trace&#39;] = explode("\n", $exception->getTraceAsString());                if ($exception instanceof \yii\db\Exception) {
                    $array[&#39;error-info&#39;] = $exception->errorInfo;
                }
            }
        }        if (($prev = $exception->getPrevious()) !== null) {
            $array[&#39;previous&#39;] = $this->convertExceptionToArray($prev);
        }        return $array;
    }
Copier après la connexion
D'accord, nous avons donc le même L'interface API standard renvoie le format de données, et la personne qui appelle l'interface également Ne vous inquiétez pas des formats incohérents

Recommandé : "

Tutoriel vidéo pratique de développement de framework Yii2.0"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:www.yii-china.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal