【问题标题】:Laravel API returns a view 404 error instead of JSON errorLaravel API 返回视图 404 错误而不是 JSON 错误
【发布时间】:2019-10-17 11:01:34
【问题描述】:

我正在尝试使用 laravel 创建一个 RESTful API,我正在尝试获取具有无效 ID 的资源,结果是 404,因为它没有找到,但我的问题是响应不是 JSON 格式,但是带有 HTML 的 View 404(默认情况下)。有没有办法将响应转换为 JSON?对于这种情况,我使用 Homestead。

我尝试包含一个后备路由,但它似乎不适合这种情况。

Route::fallback(function () {
    return response()->json(['message' => 'Not Found.'], 404);
});

我尝试修改处理程序(App\Exceptions),但没有任何改变。

public function render($request, Exception $e)
{
    if ($e instanceof ModelNotFoundException) {
        if ($request->ajax()) {
            return response()->toJson([
                'message' => 'Not Found.',
            ], 404);
        }
    }

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

【问题讨论】:

  • $e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException 工作吗?
  • 您需要发送正确的内容类型:'content-type':'application/json'
  • 关于 ModelNotFoundException - 不,它似乎直接通过了。我不明白。当我使用 GET 方法来捕获所有结果时,可以(Json 响应),但是在一种情况下(例如,一个特定的 ID),所有结果都是 HTML 响应

标签: laravel api


【解决方案1】:

您需要在您的请求中发送正确的 Accept 标头:'Accept':'application/json'

然后Illuminate\Foundation\Exceptions\Handler 将在您的响应中处理render 方法中的格式:

return $request->expectsJson()
                    ? $this->prepareJsonResponse($request, $e)
                    : $this->prepareResponse($request, $e);

【讨论】:

  • return response()->json() 已经设置了正确的标题。
  • 我说的是请求而不是响应。不过,请欣赏反对票。
  • expectsJson 会检查 Accept: application/json,而不是 Content-Type。应该确保传递该标头。
【解决方案2】:

如果您的项目只有一个 RESTful API 并且没有视图,您可以添加一个新的 middleware['accept' => 'application/json'] 标头添加到所有请求。这将确保所有响应都将返回一个 json,而不是视图

<?php

namespace App\Http\Middleware;

use Closure;

class AddAjaxHeader
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $request->headers->add(['accept' => 'application/json']);
        return $next($request);
    }
}

并将其添加到Kernel.php

【讨论】:

  • 在这种情况下,我不只使用 API。这个项目有一个前端。但我会尝试使用你的例子,并给你一些反馈。谢谢
  • 我将此添加到我的 api 中间件组中,它适用于这些路由,这对许多情况很有帮助(例如,当从控制器中的策略身份验证失败返回 403 时。)显然它赢了'不适用于使用完全错误的 URI 的情况!
【解决方案3】:
     /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Throwable  $exception
     * @return \Symfony\Component\HttpFoundation\Response
     *
     * @throws \Throwable
     */
    public function render($request, Throwable $exception)
    {
        switch (class_basename($exception)) {
            case 'NotFoundHttpException':
            case 'ModelNotFoundException':
                $exception = new NotFoundHttpException('Not found');
                break;
        }

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

【讨论】:

    猜你喜欢
    • 2022-10-17
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    相关资源
    最近更新 更多