好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 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的異常處理響應格式的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 在线91av| 韩国三级理论在线电影a| free性乌克兰高清videos| 欧洲人A片在7777| 精品亚洲AV无码喷奶水东京热| 亚洲人成网站6969| 天天综合网色中文字幕| 全免费A级毛片免费看表情包桃豆| 公主该戴玉器了| 日本高清com| 打屁股眼小说| 久久久久久精品人妻一区四寸| 99热这里只有精品在在| 国产精品成人无码AⅤ试看三分钟| 韩国一级毛片免费高清看在线| 日本色噜噜| 91狠狠色综合久久久夜色撩人| 女人被狂躁60分钟视频| 抱着娇妻让粗大玩3p| 国产乱码精品一区二区三区抖音| 重温张拍芝艳照无删减| 后进极品美女圆润翘臀| 国产精品大全国产精品| 白袜校草被绑脱裤玩j| 免费精品精品国产欧美在线| 和搜子同屋的日子2在线私人| 国产在线一区二区三区| 免费看a级片| 国产伦子伦对白视频| 国产一区二区在线观看app| 激情艳女三级2在线观看| 国产露脸精品一区二区| 机机桶机机免费完整版| 动漫老师裸体?羞羞视频软件| 男人的天堂爱爱AV在线观看 | 男女激烈gif动态图片| 久久久久精品一级毛片野外互动| 91在线无码精品秘?入口楼乃| 中国胖女人一级毛片aaaaa| 女人下面的样子| 啦啦啦观看免费完整4版高清|