如何在Laravel 5.4中生成API错误响应?

Ale*_*lex 6 laravel laravel-5.4

每当我拨打电话时/api/v1/posts/1,呼叫都会转发给该show方法

public function show(Post $post) {
    return $post;
}
Run Code Online (Sandbox Code Playgroud)

PostController.php资源丰富的控制器.如果帖子确实存在,则服务器返回JSON响应.但是,如果后期不存在,服务器尽管回报显然期待JSON请求返回纯HTML.这是Postman的演示.

在此输入图像描述

问题是API应该返回application/json,而不是text/html.所以,这是我的问题:

1.如果在使用隐式路由模型绑定时发生异常,Laravel是否内置支持自动返回JSON(如show上面的方法,当我们有404时)?

2.如果是,我该如何启用它?(默认情况下,我得到纯HTML,而不是JSON)

如果它不是在每个 API控制器上复制以下内容的替代方法

public function show($id) {
    $post = Post::find($id); // findOrFail() won't return JSON, only plain HTML
    if (!$post)
        return response()->json([ ... ], 404);
    return $post;
}
Run Code Online (Sandbox Code Playgroud)

3.是否有一般用法app\Exceptions\Handler

4.标准错误/异常响应包含什么?我搜索了这个,但发现了许多自定义变体.

5.为什么JSON响应仍然没有构建到隐式路由模型绑定中?为什么不简化开发人员生活并自动处理这种低级别的烦恼?

编辑

在Laravel IRC的人们建议我单独留下错误响应之后,我留下了一个难题,认为默认情况下标准的HTTP异常会呈现为HTML,而使用API​​的系统应该处理404而不需要查看正文.我希望更多的人加入讨论,我想知道你们会如何回应.

Jul*_*tto 6

我使用此代码app/Exceptions/Handler.php,可能您需要进行一些更改

public function render($request, Exception $exception)
{
    $exception = $this->prepareException($exception);

    if ($exception instanceof \Illuminate\Http\Exception\HttpResponseException) {
        return $exception->getResponse();
    }
    if ($exception instanceof \Illuminate\Auth\AuthenticationException) {
        return $this->unauthenticated($request, $exception);
    }
    if ($exception instanceof \Illuminate\Validation\ValidationException) {
        return $this->convertValidationExceptionToResponse($exception, $request);
    }

    $response = [];

    $statusCode = 500;
    if (method_exists($exception, 'getStatusCode')) {
        $statusCode = $exception->getStatusCode();
    }

    switch ($statusCode) {
        case 404:
            $response['error'] = 'Not Found';
            break;

        case 403:
            $response['error'] = 'Forbidden';
            break;

        default:
            $response['error'] = $exception->getMessage();
            break;
    }

    if (config('app.debug')) {
        $response['trace'] = $exception->getTrace();
        $response['code'] = $exception->getCode();
    }

    return response()->json($response, $statusCode);
}
Run Code Online (Sandbox Code Playgroud)

此外,如果您将使用formRequest验证,您需要覆盖该方法response,否则您将被重定向,它可能会导致一些错误.

use Illuminate\Http\JsonResponse;

...

public function response(array $errors)
{
    // This will always return JSON object error messages
    return new JsonResponse($errors, 422);
}
Run Code Online (Sandbox Code Playgroud)


小智 4

  1. app\Exceptions\Handler 中是否有通用的方法可以使用?

您可以检查通用异常处理程序中是否需要 json。

// app/Exceptions/Handler.php
public function render($request, Exception $exception) {
    if ($request->expectsJson()) {
        return response()->json(["message" => $exception->getMessage()]);
    }
    return parent::render($request, $exception);
}
Run Code Online (Sandbox Code Playgroud)