Heim  >  Artikel  >  PHP-Framework  >  Die Yii2-API-Schnittstelle gibt eine einheitliche JSON- und JSONP-Formatierungsmethode aus

Die Yii2-API-Schnittstelle gibt eine einheitliche JSON- und JSONP-Formatierungsmethode aus

angryTom
angryTomnach vorne
2019-11-01 16:00:052456Durchsuche

Die Yii2-API-Schnittstelle gibt eine einheitliche JSON- und JSONP-Formatierungsmethode aus

Wenn Sie eine API erstellen, wie können Sie anderen ein einheitliches und standardmäßiges JSON- oder JSONP-Format ermöglichen, wenn sie Ihre Schnittstelle aufrufen? sind alle einverstanden. Es gibt Unterschiede, daher müssen wir bestimmte Verarbeitungen durchführen, bevor die Daten gesendet werden.

1. Zuerst müssen wir den Aufruf von beforeSend initialisieren, da wir bei beforesend einige Verarbeitungsschritte durchführen müssen. Das Folgende ist der Initialisierungsverarbeitungscode:

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

2. Dann müssen wir die folgenden Verarbeitungspunkte verarbeiten:

1> Ändern Sie das Datenausgabeformat

2> 🎜>

3> Wenn der Client bei der Anfrage den Parameter $_GET['callback'] übergibt, erfolgt die Ausgabe im Jsonp-Format

4> Wenn die Anfrage korrekt ist, sind die Daten {"success" :true,"data":{.. .}}

5>Die Daten beim Anfordern eines Fehlers sind {"success":false,"data":{"name":"Not Found"," message: „Seite nicht gefunden.“, „code“:0, „status“:404}}

6>Der spezifische Code lautet wie folgt:

/**
     * 更改数据输出格式
     * 默认情况下输出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. Einige Ausnahmen können als Reaktion auf Anfragen auftreten, und wir müssen auch Ausnahmen behandeln. Einige standardisierte Verarbeitungen, Ausnahmen in Array-Ausgaben konvertieren, der spezifische Code lautet wie folgt:

/**
     * 将异常转换为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;
    }

Okay, wir haben also das Gleiche Standard-API-Schnittstelle gibt Datenformat zurück, und die Person, die die Schnittstelle aufruft, macht sich auch keine Sorgen über inkonsistente Formate

Empfohlen: „

Praktisches Video-Tutorial zur Yii2.0 Framework-Entwicklung"

Das obige ist der detaillierte Inhalt vonDie Yii2-API-Schnittstelle gibt eine einheitliche JSON- und JSONP-Formatierungsmethode aus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:www.yii-china.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen