【问题标题】:Laravel 8 API returns HTML instead of JSONLaravel 8 API 返回 HTML 而不是 JSON
【发布时间】:2021-04-10 22:31:27
【问题描述】:

我正在使用 Laravel 和 Vue 开发一个简单的网站,代码在 Homestead 中运行。当用户访问网站的主页时,视频以网格形式显示。因此调用 API 来获取数据,我得到的返回是 .view 文件的 HTML 而不是 JSON。

// API Routes in Api.php
Route::get('/videos', [VideoController::class, 'getVideos']);
Route::get('/videos/{id}', [VideoController::class, 'getVideo']);
Route::post('/user/login', [AuthController::class, 'login']);
Route::post('/user/check', [UserController::class, 'checkUser']);

// Controller function that returns data from website via ORM
public function getVideos(): JsonResponse{
    return resonse()->json([
        "response" => Video::all()
    ]);
}

调用 API 时我得到的控制台响应

PHP 工匠路线:列表

【问题讨论】:

  • 可能是另一个控制器被击中,检查你的 api 调用,里面有一个 dd()
  • 还可以使用 php artisan route:list 显示您的路线
  • 你的api中间件组里面有什么?
  • 我试过 dd(),但它仍然返回 HTML
  • 我曾经有类似的东西是需要进行身份验证的 api,当我不是时,它会尝试重定向我。但由于它是一个 json 响应,它会尝试在 json 响应中呈现登录页面。

标签: php laravel


【解决方案1】:

如果我没有正确回答您的问题,您的回答是呈现 Html 而不是 JSON?

您可以创建一个全局 JsonMiddleware,它接受标头作为 application/json。为此,请按照以下步骤操作:

第一步:新建中间件

php artisan make:middleware JsonMiddleware

第 2 步:复制此代码并将其放在 JsonMiddleware 中的句柄方法中,然后再 'return $next($request);'

$request->headers->set("Accept", "application/json");

您的最终结果应如下所示:

public function handle(Request $request, Closure $next)
{
    $request->headers->set("Accept", "application/json");
    return $next($request);
}

第 3 步:进入 App\Http\Kernel.php 文件,并在全局 HTTP 中间件堆栈中添加以下代码。

protected $middleware = [
    \App\Http\Middleware\JsonMiddleware::class,
    // Other Middleware::class comes after...
];

第 4 步:清除应用程序配置缓存并转储自动加载

php artisan config:cache or composer dump-autoload

我希望这会有所帮助。谢谢。

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 2017-08-02
    • 2017-03-28
    • 2019-03-31
    • 2022-01-04
    • 2015-08-16
    • 2021-09-25
    • 2015-10-10
    • 2022-01-01
    相关资源
    最近更新 更多