programing

Larabel이 JSON REST API의 커스텀에러를 반환하도록 하려면 어떻게 해야 합니까?

codeshow 2023. 3. 28. 22:21
반응형

Larabel이 JSON REST API의 커스텀에러를 반환하도록 하려면 어떻게 해야 합니까?

나는 일종의 RESTful API를 개발하고 있다.에러가 발생했을 때, 나는 그것을 던진다.App::abort($code, $message)에러입니다.

문제는 그가 위의 데이터를 각각 포함하는 "code"와 "message" 키를 가진 json 형식의 배열을 던졌으면 한다는 것입니다.

Array
(
    [code] => 401
    [message] => "Invalid User"
)

그것이 가능한지, 만약 가능하다면, 어떻게 해야 하는지 아는 사람이 있나요?

에게 가다app/start/global.php.

그러면 다음 에러가 모두 변환됩니다.401그리고.404WOOPS 스택 트레이스 대신 커스텀 json 오류로 이동합니다.추가:

App::error(function(Exception $exception, $code)
{
    Log::error($exception);

    $message = $exception->getMessage();

    // switch statements provided in case you need to add
    // additional logic for specific error code.
    switch ($code) {
        case 401:
            return Response::json(array(
                    'code'      =>  401,
                    'message'   =>  $message
                ), 401);
        case 404:
            $message            = (!$message ? $message = 'the requested resource was not found' : $message);
            return Response::json(array(
                    'code'      =>  404,
                    'message'   =>  $message
                ), 404);        
    }

});

이것은 이 오류를 처리하기 위한 많은 옵션 중 하나입니다.


API를 만들려면 다음과 같은 도우미를 직접 만드는 것이 가장 좋습니다.Responser::error(400, 'damn')를 확장하다Response학급.

어느 정도:

public static function error($code = 400, $message = null)
{
    // check if $message is object and transforms it into an array
    if (is_object($message)) { $message = $message->toArray(); }

    switch ($code) {
        default:
            $code_message = 'error_occured';
            break;
    }

    $data = array(
            'code'      => $code,
            'message'   => $code_message,
            'data'      => $message
        );

    // return an error
    return Response::json($data, $code);
}

반환된 JSON 응답에 배열을 전달할 수 있습니다.

$returnData = array(
    'status' => 'error',
    'message' => 'An error occurred!'
);
return Response::json($returnData, 500);

사용하고 있는 것은 다음과 같습니다(Laravel 5.2).

https://laravel.com/docs/5.2/errors 에 의하면, 에러에 대해서 커스텀 렌더 함수를 지정할 수 있습니다.app\Exceptions\Handler.php렌더링 기능을 다음과 같이 변경했을 뿐입니다.

    /**
     * Render an exception into an HTTP response.
     * Updated to return json for a request that wantsJson 
     * i.e: specifies 
     *      Accept: application/json
     * in its header
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $e
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $e)
    {
        if ($request->ajax() || $request->wantsJson()) {
            return response()->json(
                          $this->getJsonMessage($e), 
                          $this->getExceptionHTTPStatusCode($e)
                        );
        }
        return parent::render($request, $e);
    }

    protected function getJsonMessage($e){
        // You may add in the code, but it's duplication
        return [
                  'status' => 'false',
                  'message' => $e->getMessage()
               ];
    }

    protected function getExceptionHTTPStatusCode($e){
        // Not all Exceptions have a http status code
        // We will give Error 500 if none found
        return method_exists($e, 'getStatusCode') ? 
                         $e->getStatusCode() : 500;
    }

그 후, 필요한 것은 모든 API 요청이 다음 명령을 지정하도록 하는 것입니다.Accept: application/jsonheader를 클릭합니다.이것이 도움이 되기를 바랍니다:)

기본 제공과 동일한 유형의 응답을 반환하기 위해 5.6에서 사용한 내용입니다.validate방법:

response()->json(['errors' => ['email' => ['The email is invalid.']]], 422);

Ibrahim의 답변에 따르면 모든 Ajax 요청이 JSON, "상태 코드" "상태"를 원하는 것은 아닙니다. 둘 다 같은 의미이기 때문입니다.게다가 응답 코드에 「상태」라고 쓰여져 있기 때문에, 응답에 「상태」라고 기재할 필요는 없습니다.이와 같은 것이 완벽하게 작동해야 합니다.

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $e
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $e)
{
    if ($request->wantsJson())
        return response()->json(
            ['message' => $e->getMessage()],
            method_exists($e, 'getStatusCode') ? $e->getStatusCode() : 500);

    return parent::render($request, $e);
}

라라벨 6:

클라이언트 측에서 API 요청에 헤더를 설정해야 하며 Larabel은 자동으로 JSON 형식 오류를 반환합니다.

 {     
    "message": "Unauthenticated."
 }

라라벨8의 경우

에게 가다\app\Exceptions\Handler.php및 덮어쓰기invalidJson다음과 같은 방법을 사용합니다.

// Add this line at the top of the class
use Illuminate\Validation\ValidationException;


/**
 * Convert a validation exception into a JSON response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Illuminate\Validation\ValidationException  $exception
 * @return \Illuminate\Http\JsonResponse
 */
protected function invalidJson($request, ValidationException $exception)
{
    // You can return json response with your custom form
    return response()->json([
        'success' => false,
        'data' => [
            'code' => $exception->status,
            'message' => $exception->getMessage(),
            'errors' => $exception->errors()
        ]
    ], $exception->status);
}

응답 샘플:

{
  "success": false,
  "data": {
    "code": 422,
    "message": "The given data was invalid.",
    "errors": {
      "password": [
        "The password field is required."
      ]
    }
  }
}

원래 방법은 다음과 같습니다.

/**
 * Convert a validation exception into a JSON response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Illuminate\Validation\ValidationException  $exception
 * @return \Illuminate\Http\JsonResponse
 */
protected function invalidJson($request, ValidationException $exception)
{
    return response()->json([
        'message' => $exception->getMessage(),
        'errors' => $exception->errors(),
    ], $exception->status);
}

응답 샘플:

{
  "message": "The given data was invalid.",
  "errors": {
    "password": [
      "The password field is required."
    ]
  }
}

주의:unauthenticated응답은 별도의 메서드로 이루어지므로 덮어쓸 수도 있습니다.

/**
 * Convert an authentication exception into a response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Illuminate\Auth\AuthenticationException  $exception
 * @return \Symfony\Component\HttpFoundation\Response
 */
protected function unauthenticated($request, AuthenticationException $exception)
{
    return $request->expectsJson()
        // Here you can change the form of the json response
        ? response()->json(['message' => $exception->getMessage()], 401) // <-
        : redirect()->guest($exception->redirectTo() ?? route('login'));
}
$response['message'] ="The given data was invalid";
$error['country_id'] = ["The country field is required"];
$error['state_id'] = ["The state field is required"];
$error['name'] = ["The name field is required"];
$response['error'] = $error;
return response()->json($response,422);

Laravel 5.6에서는 보통 에러에 대한 커스텀 렌더 함수를 지정합니다.app\Exceptions\Handler.php렌더링 기능을 다음과 같이 변경했을 뿐입니다.

/**
 * Render an exception into an HTTP response.
 *
 * @param \Illuminate\Http\Request $request
 * @param \Exception               $e
 *
 * @return Response
 */
public function render($request, Exception $e)
{
    if ($request->wantsJson() && !($e instanceof ValidationException)) {
        $response = [
            'message' => (string)$e->getMessage(),
            'status_code' => 400,
        ];

        if ($e instanceof HttpException) {
            $response['message'] = Response::$statusTexts[$e->getStatusCode()];
            $response['status_code'] = $e->getStatusCode();
        } else if ($e instanceof ModelNotFoundException) {
            $response['message'] = Response::$statusTexts[Response::HTTP_NOT_FOUND];
            $response['status_code'] = Response::HTTP_NOT_FOUND;
        }

        if ($this->isDebugMode()) {
            $response['debug'] = [
                'exception' => get_class($e),
                'trace' => $e->getTrace()
            ];
        }

        return response()->json([
            'status'      => 'failed',
            'status_code' => $response['status_code'],
            'massage'     => $response['message'],
        ], $response['status_code']);
    }

    return parent::render($request, $e);
}
public function register()
{
   
    $this->renderable(function (NotFoundHttpException $e, $request) {
        $returnData = array(
            'status' => 'error',
            'message' => 'Record not found'
        );
        return response()->json($returnData, "404");
    });
}

언급URL : https://stackoverflow.com/questions/22414524/how-can-i-make-laravel-return-a-custom-error-for-a-json-rest-api

반응형