如何让Laravel为JSON REST API返回自定义错误

Den*_*aga 27 php rest json restful-architecture laravel-4

我正在开发某种RESTful API.发生一些错误时,我抛出一个App::abort($code, $message)错误.

问题是:我希望他抛出一个带有"代码"和"消息"键的json形成的数组,每个数组包含上面提到的数据.

Array
(
    [code] => 401
    [message] => "Invalid User"
)
Run Code Online (Sandbox Code Playgroud)

有没有人知道它是否可能,如果可能,我该怎么做?

maj*_*rif 44

去你的app/start/global.php.

这将转换所有的错误的401404一个自定义的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);        
    }

});
Run Code Online (Sandbox Code Playgroud)

这是处理此错误的众多选项之一.


制作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);
}
Run Code Online (Sandbox Code Playgroud)

  • @thanks,请问Laravel 5解决方案吗? (3认同)

Phi*_*lip 32

您可以将数组传递给返回的JSON响应:

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

  • 谢谢!在laravel 5中它将是:return response() - > json($ returnData,500) (27认同)

Ibr*_*wal 16

这是我使用的(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;
    }
Run Code Online (Sandbox Code Playgroud)

在此之后,您需要做的就是确保所有API请求都指定Accept: application/json标头.希望这可以帮助 :)


kjd*_*n84 10

下面是我在5.6中使用的内容,以便返回与内置validate方法相同类型的响应:

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


Sap*_*aik 10

拉拉维尔 6:

您必须Accept:application/json在客户端的 API 请求中设置标头,Laravel 将自动返回 JSON 格式错误。

 {     
    "message": "Unauthenticated."
 }
Run Code Online (Sandbox Code Playgroud)


Eli*_*hen 7

根据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);
}
Run Code Online (Sandbox Code Playgroud)