如果做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?&&?!$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?yiidbException)?{ ????????????????????$array['error-info']?=?$exception->errorInfo; ????????????????} ????????????} ????????}????????if?(($prev?=?$exception->getPrevious())?!==?null)?{ ????????????$array['previous']?=?$this->convertExceptionToArray($prev); ????????}????????return?$array; ????}</string></string>
好了,這樣我們就有了標準同一個的api接口返回數據格式了,在調用接口的人員也不用為了格式不統一感到煩惱
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END