Heim > Artikel > PHP-Framework > 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('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, 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!