sistema parte integrar consumir con autenticación php json rest laravel-4 restful-architecture

php - parte - response json laravel



¿Cómo puedo hacer que Laravel devuelva un error personalizado para una API REST de JSON? (6)

Aquí está lo que utilicé en 5.6 para devolver el mismo tipo de respuesta que el método de validate integrado:

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

Estoy desarrollando algún tipo de API REST. Cuando se produce algún error, lanzo un error de App::abort($code, $message) .

El problema es: quiero que lance una matriz formada por json con las teclas "código" y "mensaje", cada una de las cuales contiene los datos mencionados anteriormente.

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

¿Alguien sabe si es posible, y si lo es, cómo lo hago?


De acuerdo con la respuesta de Ibrahim, no todas las solicitudes de ajax quieren JSON, responder el "código de estado" y el "estado" es innecesario ya que ambos significan lo mismo. Más que eso, no hay necesidad de mencionar en la respuesta "estado" en absoluto, ya que el código de respuesta "dice" eso. Algo así debería funcionar perfectamente:

/** * 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); }


En Laravel5.6, normalmente especifico una función de renderización personalizada para errores en app/Exceptions/Handler.php . Todo lo que hice fue cambiar mi función de render a esto:

/** * 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); }


Esto es lo que uso (Laravel 5.2):

De acuerdo con: https://laravel.com/docs/5.2/errors , podemos especificar una función de procesamiento personalizada para los errores en la app/Exceptions/Handler.php . Todo lo que hice fue cambiar mi función de render a esto:

/** * 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; }

Después de esto, todo lo que necesita hacer es asegurarse de que todas sus solicitudes de API especifiquen el encabezado Accept: application/json . Espero que esto ayude :)


Puede pasar una matriz a la respuesta JSON devuelta:

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


Ve a tu app/start/global.php .

Esto convertirá todos los errores de 401 y 404 en un error json personalizado en lugar de la pila de Whoops. Agrega esto:

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); } });

Esta es una de las muchas opciones para manejar estos errores.

Para crear una API, es mejor crear su propio ayudante como Responser::error(400, ''damn'') que amplíe la clase Response .

Algo así como

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); }