Yii2 API接口輸出統一Json和jsonp格式方法

Yii2 API接口輸出統一Json和jsonp格式方法

如果做api的話,如何使別人再調用你的接口時能夠有一個統一標準的json或者jsonp格式,然而 json響應的格式和內容,每個人的約定都是有差異的,所以我們必須再數據出去之前做一定的處理。?

1.首先我們需要初始化去調用beforeSend,因為我們需要對beforesend做一些處理,以下是init初始化處理代碼:

/** ?*?(non-PHPdoc) ?*?@see?yiibaseObject::init() ?*/ public?function?init() {??????? ????parent::init();	//綁定beforeSend事件,更改數據輸出格式 ????Yii::$app->getResponse()->on(Response::EVENT_BEFORE_SEND,?[$this,?'beforeSend']); }

2.然后我們就需要對beforesend進行處理,處理點有下面幾個重點:?

1>更改數據輸出格式

2>默認情況下輸出Json數據

3>如果客戶端請求時有傳遞$_GET[‘callback’]參數,輸出Jsonp格式

4>請求正確時數據為 {“success”:true,”data”:{…}}

5>請求錯誤時數據為 {“success”:false,”data”:{“name”:”Not Found”,”message”:”頁面未找到。”,”code”:0,”status”:404}}?

6>具體代碼如下:

/** ?????*?更改數據輸出格式 ?????*?默認情況下輸出Json數據 ?????*?如果客戶端請求時有傳遞$_GET['callback']參數,輸入Jsonp格式 ?????*?請求正確時數據為??{"success":true,"data":{...}} ?????*?請求錯誤時數據為??{"success":false,"data":{"name":"Not?Found","message":"頁面未找到。","code":0,"status":404}} ?????*?@param?yiibaseEvent?$event ?????*/ ????public?function?beforeSend($event) ????{????????/*?@var?$response?yiiwebResponse?*/ ????????$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.針對請求可能會發生一些異常,同樣我們也需要對異常進行一些標準化處理,將異常轉換為array輸出,具體代碼如下:

/** ?????*?將異常轉換為array輸出 ?????*?@see?yiiwebErrorHandle ?????*?@param?Exception?$exception ?????*?@return?multitype:string?NULL?Ambigous?<string>?yiiwebinteger?yiidbarray?multitype:string?NULL?Ambigous?<string>?yiiwebinteger?yiidbarray ?????*/ ????protected?function?convertExceptionToArray($exception) ????{????????if?(!YII_DEBUG?&amp;&amp;?!$exception?instanceof?UserException?&amp;&amp;?!$exception?instanceof?HttpException)?{ ????????????$exception?=?new?HttpException(500,?Yii::t('yii',?'An?internal?server?error?occurred.')); ????????} ????????$array?=?[????????????'name'?=&gt;?($exception?instanceof?Exception?||?$exception?instanceof?ErrorException)???$exception-&gt;getName()?:?'Exception',????????????'message'?=&gt;?$exception-&gt;getMessage(),????????????'code'?=&gt;?$exception-&gt;getCode(), ????????];????????if?($exception?instanceof?HttpException)?{ ????????????$array['status']?=?$exception-&gt;statusCode; ????????}????????if?(YII_DEBUG)?{ ????????????$array['type']?=?get_class($exception);????????????if?(!$exception?instanceof?UserException)?{ ????????????????$array['file']?=?$exception-&gt;getFile(); ????????????????$array['line']?=?$exception-&gt;getLine(); ????????????????$array['stack-trace']?=?explode("n",?$exception-&gt;getTraceAsString());????????????????if?($exception?instanceof?yiidbException)?{ ????????????????????$array['error-info']?=?$exception-&gt;errorInfo; ????????????????} ????????????} ????????}????????if?(($prev?=?$exception-&gt;getPrevious())?!==?null)?{ ????????????$array['previous']?=?$this-&gt;convertExceptionToArray($prev); ????????}????????return?$array; ????}</string></string>

好了,這樣我們就有了標準同一個的api接口返回數據格式了,在調用接口的人員也不用為了格式不統一感到煩惱

推薦:《Yii2.0框架開發實戰視頻教程

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享