Larabel이 JSON REST API의 커스텀에러를 반환하도록 하려면 어떻게 해야 합니까?
나는 일종의 RESTful API를 개발하고 있다.에러가 발생했을 때, 나는 그것을 던진다.App::abort($code, $message)
에러입니다.
문제는 그가 위의 데이터를 각각 포함하는 "code"와 "message" 키를 가진 json 형식의 배열을 던졌으면 한다는 것입니다.
Array
(
[code] => 401
[message] => "Invalid User"
)
그것이 가능한지, 만약 가능하다면, 어떻게 해야 하는지 아는 사람이 있나요?
에게 가다app/start/global.php
.
그러면 다음 에러가 모두 변환됩니다.401
그리고.404
WOOPS 스택 트레이스 대신 커스텀 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/json
header를 클릭합니다.이것이 도움이 되기를 바랍니다:)
기본 제공과 동일한 유형의 응답을 반환하기 위해 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
'programing' 카테고리의 다른 글
React의 HashRouter와 BrowserRouter의 차이점은 무엇입니까? (0) | 2023.03.28 |
---|---|
JSON을 통한 jQuery loop over JSON 성공으로 인한 결과? (0) | 2023.03.28 |
대응 - TypeScript vs Flow vs. (0) | 2023.03.28 |
오버플로우 y 스크롤바 스타일을 변경하는 방법 (0) | 2023.03.28 |
각도에서의 $location.path(경로)와 $location.url(url)의 비교JS (0) | 2023.03.28 |