校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Laravel如何實現適合Api的異常處理響應格式

Laravel如何實現適合Api的異常處理響應格式

熱門標簽:臨沂crm外呼系統平臺 如何在世界地圖標注 梧州市機器人外呼系統怎么樣 廈門400電話辦理選易號網 地圖標注符號樣式有 天客通地圖標注 電子地圖標注怎么修改 菏澤語音外呼系統運營商 公司外呼系統中心

前言

Laravel全局捕獲異常后,會把異常轉為相應的數據格式返回給用戶。如果想要規定的數據格式相應,那我們只需重寫異常捕獲后的處理方法即可。

異常處理流程

Illuminate\Foundation\Exception\Handler 中的 render 方法用來將異常轉化為響應。

public function render($request, Exception $e)
{
 if (method_exists($e, 'render')  $response = $e->render($request)) {
 return Router::toResponse($request, $response);
 } elseif ($e instanceof Responsable) {
 return $e->toResponse($request);
 }

 $e = $this->prepareException($e);

 if ($e instanceof HttpResponseException) {
 return $e->getResponse();
 } elseif ($e instanceof AuthenticationException) {
 return $this->unauthenticated($request, $e);
 } elseif ($e instanceof ValidationException) {
 return $this->convertValidationExceptionToResponse($e, $request);
 }

 return $request->expectsJson()
   ? $this->prepareJsonResponse($request, $e)
   : $this->prepareResponse($request, $e);
}

render() 中又調用了 prepareException() 對部分異常進行預處理,但并未執行轉化為響應的操作。

ModelNotFoundException 一般在模型查找不到拋出,prepareException() 中它被轉為 Symfony 包中NotFoundHttpException,默認狀態碼404;

AuthorizationException 在 Policy 權限未通過時拋出,prepareException() 中它被轉為 Symfony 包中 AccessDeniedHttpException,默認狀態碼403;

TokenMismatchException 在 CSRF 驗證未通過時拋出,prepareException() 中它被轉為 Symfony 包中 HttpException,給定狀態碼419;

其他異常直接返回。

protected function prepareException(Exception $e)
{
 if ($e instanceof ModelNotFoundException) {
 $e = new NotFoundHttpException($e->getMessage(), $e);
 } elseif ($e instanceof AuthorizationException) {
 $e = new AccessDeniedHttpException($e->getMessage(), $e);
 } elseif ($e instanceof TokenMismatchException) {
 $e = new HttpException(419, $e->getMessage(), $e);
 }

 return $e;
}

在回到 render() ,預處理異常之后,又分別對 HttpResponseException、AuthenticationException 和 ValidationException 單獨處理,并轉為響應返回。

除此以外的異常,都在 prepareJsonResponse() 或 prepareResponse() 處理 ,expectsJson() 用來判斷返回 json 響應還是普通響應。

修改異常響應格式

了解了異常處理流程,接下來就處理異常響應格式。

修改登錄認證異常格式

由上文可知,AuthenticationException 被捕獲后,調用 unauthenticated() 來處理。

protected function unauthenticated($request, AuthenticationException $exception)
{
 return $request->expectsJson()
    ? response()->json(['message' => $exception->getMessage()], 401)
    : redirect()->guest($exception->redirectTo() ?? route('login'));
}

在 appExceptionsHandler.php 中重寫 unauthenticated() 使其返回我們想要的數據格式。

protected function unauthenticated($request, AuthenticationException $exception)
{
 return $request->expectsJson()
  ? response()->json([
   'code' => 0,
   'data' => $exception->getMessage(),
  ], 401)
  : redirect()->guest($exception->redirectTo() ?? route('login'));
}

修改驗證異常格式

同樣由上文可知,ValidationException 被捕獲后交由 convertValidationExceptionToResponse() 處理,進入此方法后我們需要繼續追蹤,若是需要 json 響應,最終交由 invalidJson() 處理。

protected function convertValidationExceptionToResponse(ValidationException $e, $request)
{
 if ($e->response) {
  return $e->response;
 }

 return $request->expectsJson()
    ? $this->invalidJson($request, $e)
    : $this->invalid($request, $e);
}
protected function invalidJson($request, ValidationException $exception)
{
 return response()->json([
  'message' => $exception->getMessage(),
  'errors' => $exception->errors(),
 ], $exception->status);
}

我們繼續在 appExceptionsHandler.php 重寫 invalidJson() 即可自定義返回格式。

protected function invalidJson($request, ValidationException $exception)
{
 return response()->json([
  'code' => 0,
  'data' => $exception->errors(),
 ], $exception->status);
}

修改其他異常格式

其他異常是調用 prepareJsonResponse() 來處理,此方法又調用 convertExceptionToArray() 來處理響應格式。

protected function prepareJsonResponse($request, Exception $e)
{
 return new JsonResponse(
  $this->convertExceptionToArray($e),
  $this->isHttpException($e) ? $e->getStatusCode() : 500,
  $this->isHttpException($e) ? $e->getHeaders() : [],
  JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES
 );
}
protected function convertExceptionToArray(Exception $e)
{
 return config('app.debug') ? [
  'message' => $e->getMessage(),
  'exception' => get_class($e),
  'file' => $e->getFile(),
  'line' => $e->getLine(),
  'trace' => collect($e->getTrace())->map(function ($trace) {
   return Arr::except($trace, ['args']);
  })->all(),
 ] : [
  'message' => $this->isHttpException($e) ? $e->getMessage() : 'Server Error',
 ];
}

在 appExceptionsHandler.php 中重寫 convertExceptionToArray() 來自定義其他異常響應格式。

protected function convertExceptionToArray(Exception $e)
{
 return config('app.debug') ? [
  'code' => 0,
  'data' => $e->getMessage(),
  'exception' => get_class($e),
  'file' => $e->getFile(),
  'line' => $e->getLine(),
  'trace' => collect($e->getTrace())->map(function ($trace) {
   return Arr::except($trace, ['args']);
  })->all(),
 ] : [
  'code' => 0,
  'data' => $this->isHttpException($e) ? $e->getMessage() : 'Server Error',
 ];
}

強制 json 響應

代碼中多次出現了 expectsJson() ,此方法是用來判斷返回 json 響應還是普通響應。

public function expectsJson()
{
 return ($this->ajax()  ! $this->pjax()  $this->acceptsAnyContentType()) || $this->wantsJson();
}

以下兩種條件下,會返回json響應。

非XML請求、非pjax并且 Headers 中 Accept 設置為接收所有格式響應;

Headers Accept 設置為 /json、+json。如:Accept:application/json。

除此之外的情況,將不會響應json。我們可以利用中間件強制追加 Accept:application/json,使異常響應時都返回json。(參考教程 L03 6.0 中提到的方法)

創建中間件 AcceptHeader

?php

namespace App\Http\Middleware;

use Closure;

class AcceptHeader
{
 public function handle($request, Closure $next)
 {
  $request->headers->set('Accept', 'application/json');

  return $next($request);
 }
}

在 app/Http/Kernel.php 中,將中間件加入路由組即可。

protected $middlewareGroups = [
 'web' => [
  .
  .
  .
 'api' => [
  \App\Http\Middleware\AcceptHeader::class,
  'throttle:60,1',
  'bindings',
 ],
];

大功告成。

總結

到此這篇關于Laravel如何實現適合Api的異常處理響應格式的文章就介紹到這了,更多相關Laravel適合Api的異常處理響應格式內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Laravel5.5+ 使用API Resources快速輸出自定義JSON方法詳解
  • laravel接管Dingo-api和默認的錯誤處理方式
  • 在Laravel中使用GuzzleHttp調用第三方服務的API接口代碼
  • Laravel實現ApiToken認證請求
  • laravel框架 api自定義全局異常處理方法
  • laravel dingo API返回自定義錯誤信息的實例
  • laravel 配置路由 api和web定義的路由的區別詳解
  • Laravel5.4簡單實現app接口Api Token認證方法
  • 詳解Laravel制作API接口

標簽:白城 黃石 郴州 瀘州 迪慶 綿陽 貴陽 雞西

巨人網絡通訊聲明:本文標題《Laravel如何實現適合Api的異常處理響應格式》,本文關鍵詞  Laravel,如何,實現,適合,Api,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Laravel如何實現適合Api的異常處理響應格式》相關的同類信息!
  • 本頁收集關于Laravel如何實現適合Api的異常處理響應格式的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    91精品久久久久久久久99蜜臂| 精品福利av导航| 欧美日韩精品三区| 亚洲国产视频直播| 欧美另类久久久品| 久久精品国产精品亚洲红杏| 91精品国产高清一区二区三区蜜臀| 日韩主播视频在线| 精品福利av导航| thepron国产精品| 亚洲一区二区3| 欧美一三区三区四区免费在线看| 久久99九九99精品| 亚洲三级小视频| 欧美一区二区国产| www.激情成人| 免费成人深夜小野草| 国产亚洲人成网站| 69av一区二区三区| 不卡视频一二三四| 男人的天堂久久精品| 国产精品你懂的在线| 欧美肥妇bbw| 色婷婷综合在线| 国产一区二区伦理| 亚洲成人激情自拍| 亚洲国产成人自拍| 欧美疯狂性受xxxxx喷水图片| 丰满少妇久久久久久久| 日本不卡视频在线| 亚洲精品视频观看| 国产精品网站在线| 精品不卡在线视频| 91超碰这里只有精品国产| 97se亚洲国产综合在线| 国产精品99久久久久久宅男| 日韩精品乱码免费| 亚洲午夜国产一区99re久久| 国产日韩欧美一区二区三区综合| 日韩一区二区中文字幕| 欧美日韩高清影院| 欧美三级中文字幕在线观看| 99视频一区二区| 国产福利一区二区三区视频在线| 欧美aaaaaa午夜精品| 偷窥国产亚洲免费视频| 亚洲一区二区三区四区在线免费观看| 国产精品欧美精品| 国产精品天干天干在观线| 久久久久久久久久久久久夜| 宅男在线国产精品| 制服丝袜国产精品| 欧美精品三级日韩久久| 欧美电影一区二区| 欧美日韩综合一区| 在线观看91精品国产麻豆| 91色.com| 欧美日韩亚洲不卡| 在线综合亚洲欧美在线视频| 欧美高清激情brazzers| 91精品在线观看入口| 欧美一级黄色片| 久久婷婷国产综合国色天香| 欧美成人a∨高清免费观看| 精品国产髙清在线看国产毛片| 欧美成人三级电影在线| 日韩一级高清毛片| 久久影院午夜论| 国产精品久久久久aaaa樱花 | 91美女蜜桃在线| 91麻豆国产福利精品| 欧美日韩亚州综合| 欧美va在线播放| 国产精品麻豆久久久| 亚洲精品免费播放| 久久国产精品99精品国产| 国产乱码精品一品二品| 91丨九色丨尤物| 欧美一三区三区四区免费在线看| 久久免费视频一区| 亚洲日本在线a| 免费成人美女在线观看.| 丁香网亚洲国际| 欧美人妖巨大在线| 日本一区二区三区四区在线视频| 亚洲一区二区av在线| 国产一区二区三区高清播放| 91亚洲永久精品| 26uuuu精品一区二区| 亚洲欧美成人一区二区三区| 日本三级亚洲精品| 不卡的电视剧免费网站有什么| 欧美精品久久一区| 亚洲日本在线天堂| 国产福利一区二区三区| 欧美精品视频www在线观看 | 成人av在线资源网| 欧美蜜桃一区二区三区| 国产精品水嫩水嫩| 美女免费视频一区二区| 欧美亚洲动漫制服丝袜| 国产欧美一区二区精品性| 五月天久久比比资源色| 99在线精品视频| 中文字幕精品三区| 狠狠久久亚洲欧美| 欧美日韩精品一区视频| 国产精品成人网| 国产成人在线免费| 欧美精品一区二区在线播放| 亚洲国产精品久久久久秋霞影院| 北条麻妃一区二区三区| 久久精品欧美日韩| 激情综合五月婷婷| 日韩小视频在线观看专区| 亚洲综合另类小说| 99视频国产精品| 国产精品国产精品国产专区不蜜| 国产美女精品人人做人人爽 | 日韩和欧美一区二区| 欧美中文字幕一区二区三区 | 777奇米四色成人影色区| 亚洲欧洲性图库| 91日韩精品一区| 精品国产第一区二区三区观看体验| 亚洲国产综合91精品麻豆| 91在线一区二区| 综合中文字幕亚洲| 99久久久免费精品国产一区二区| 国产欧美一区视频| 色综合久久中文综合久久97| 亚洲三级免费电影| 欧美视频一区二| 免费观看一级特黄欧美大片| 91精品久久久久久久99蜜桃| 日本欧美韩国一区三区| 欧美一级电影网站| 看片网站欧美日韩| 欧美高清一级片在线观看| 成人国产精品视频| 亚洲精品亚洲人成人网在线播放| 色婷婷综合久久久| 香蕉久久夜色精品国产使用方法 | 国产精品一区二区黑丝| 国产午夜精品福利| 91丨porny丨在线| 亚洲第一成年网| 久久亚洲一区二区三区四区| 国产 日韩 欧美大片| 中文字幕日韩一区二区| 欧洲一区在线观看| 久久精品国产成人一区二区三区 | 亚洲在线视频网站| 91精品国产综合久久香蕉的特点| 国产一区激情在线| 亚洲综合一二三区| 精品99999| 91色婷婷久久久久合中文| 男男视频亚洲欧美| 亚洲欧洲精品一区二区精品久久久| 欧美日韩在线播放一区| 久久99九九99精品| 亚洲一区二区欧美激情| 国产亚洲福利社区一区| 欧美精品vⅰdeose4hd| 9色porny自拍视频一区二区| 秋霞电影一区二区| 亚洲精品亚洲人成人网在线播放| 日韩视频中午一区| 91久久奴性调教| 欧美午夜精品电影| 国产精品自产自拍| 日韩精品免费专区| 亚洲丝袜美腿综合| 国产婷婷色一区二区三区在线| 欧美日韩国产综合久久| 成人不卡免费av| 国产伦理精品不卡| 日韩中文字幕av电影| 亚洲欧美韩国综合色| 国产偷国产偷精品高清尤物| 欧美一级黄色录像| 欧美日韩国产精品成人| 91丨九色porny丨蝌蚪| 国产精品一区二区在线看| 日本成人在线看| 亚洲成人av中文| 亚洲国产视频一区二区| 亚洲男人天堂一区| 中文字幕免费一区| 久久影院视频免费| 精品少妇一区二区三区在线播放| 69堂成人精品免费视频| 欧美日精品一区视频| 欧美午夜片在线观看| 在线观看免费一区| 色综合久久综合网欧美综合网| 成人高清视频免费观看| 成人国产一区二区三区精品| 成人亚洲一区二区一|