API의 예외 답장 JSON

13285 단어 LaravelAPIJSONtech

API 요청에 예외가 발생하면 Laavel 기본 HTML이 반환됩니다.


JSON을 받아들이려고 했는데 HTML이 왔어요.
예외가 생겼네.알고 있습니다.
HTML이 교부되어도 처리하기 힘들죠.

JSON에서 예외 응답 응답 응답 응답 응답


문서에도 예가 있지만 App\Exceptions\Handler에 사용자 정의 렌더기를 등록하면 다시 쓸 수 있습니다.
Laavel의 기본 오류 페이지 템플릿에는 다음과 같은 상태 코드가 있기 때문에 이러한 예외가 발생한 경우 대신 JSON 응답을 반환합니다.
  • 401: Unauthorized
  • 403: Forbidden
  • 404: Not Found
  • 419: Page Expired
  • 429: Too Many Requests
  • 500: Server Error
  • 503: Service Unavailable
  • 실제 클론


    app/Exceptions/Handler.php의register방법에서renderable 방법으로 등록합니다.
    경로가 appi/로 시작할 때만 처리 대상입니다.값을 반환하지 않으면 기본 예외 거리 측정기가 사용되고 조건에 맞지 않으면 원래의 HTML이 복원됩니다.
    HttpException의 상태 코드 스위치를 사용하여 응답의 내용을 변경합니다.
    JSON은 오류 페이지 템플릿과 동일한 형식으로 RFC 7807 스타일을 사용합니다.상황에 따라 더 자세한 정보를 제공할 수 있을 수도 있다.
    app/Exceptions/Handler.php
    // :
    use Symfony\Component\HttpKernel\Exception\HttpException;
    // :
    
    class Handler extends ExceptionHandler
    {
    
        // :
    
        /**
         * Register the exception handling callbacks for the application.
         *
         * @return void
         */
        public function register()
        {
    
            // :
    
            $this->renderable(function (HttpException $e, $request) {
                if ($request->is('api/*')) {
                    $title = '';
                    $detail = '';
    
                    switch ($e->getStatusCode()) {
                        case 401:
                            $title = __('Unauthorized');
                            $detail =  __('Unauthorized');
                            break;
                        case 403:
                            $title = __('Forbidden');
                            $detail = __($e->getMessage() ?: 'Forbidden');
                            break;
                        case 404:
                            $title = __('Not Found');
                            $detail = __('Not Found');
                            break;
                        case 419:
                            $title = __('Page Expired');
                            $detail = __('Page Expired');
                            break;
                        case 429:
                            $title = __('Too Many Requests');
                            $detail = __('Too Many Requests');
                            break;
                        case 500:
                            $title = __('Server Error');
                            $detail = __('Server Error');
                            break;
                        case 503:
                            $title = __('Service Unavailable');
                            $detail = __('Service Unavailable');
                            break;
                        default:
                            return;
                    }
    
                    return response()->json([
                        'title' => $title,
                        'status' => $e->getStatusCode(),
                        'detail' => $detail,
                    ], $e->getStatusCode(), [
                        'Content-Type' => 'application/problem+json',
                    ]);
                }
            });
    
            // :
    
        }
    }
    
    404 같은 건 시도하기 쉬워요.존재하지 않는 적당한 경로를 입력하면 appi/시작할 때와 존재하지 않을 때의 응답 차이를 확인할 수 있습니다.

    좋은 웹페이지 즐겨찾기