api路由应定义在routes/api.php中,因其默认启用api中间件组(禁用session/csrf、自动json响应),避免与web.php混淆;返回json接口须用auth:sanctum而非auth;--api生成控制器仅含rest方法且默认json响应;模型未找到抛modelnotfoundexception导致404,需区分路由404;测试应使用curl/postman并设置accept: application/json头。

API路由写在 routes/api.php 里,别放 web.php
新手常把 API 路由写进 web.php,结果发现带 CSRF token、重定向、Session 自动注入——这些对纯 API 是干扰甚至报错。api.php 默认启用 api 中间件组,已关闭 session 和 CSRF,还自带 JSON 响应头和 419 错误拦截。
实操建议:
- 所有返回 JSON 的接口(尤其是给前端或移动端调用的),只往
routes/api.php里加 - 如果需要登录态校验,用
auth:sanctum或auth:api,别用auth(那是给 web 用的) -
api.php的路由自动加前缀/api,比如Route::get('users', ...)实际访问地址是/api/users
php artisan make:controller --api 生成的是精简版控制器
这个命令生成的控制器不带 create、edit 这类 HTML 页面方法,只留 index、store、show、update、destroy 五个标准 REST 方法,且默认返回 response()->json(...)。
容易踩的坑:
- 它不会自动加请求验证逻辑,
store和update里还得手动调$request->validate(...) - 返回值不是 Eloquent Model 实例而是数组?Laravel 会自动转成 JSON,但如果有循环引用(比如模型含
belongsTo反向关系),可能报Serialization of 'Closure' is not allowed - 别直接
return $user,推荐用return response()->json($user, 200)显式控制状态码
返回 404 不是“找不到路由”,很可能是模型没查到
新手看到 404 Not Found 第一反应是路由错了,但 Laravel API 里更常见的是:路由存在,控制器也执行了,但 User::findOrFail($id) 找不到记录,直接抛出 ModelNotFoundException,被框架捕获后返回 404 响应——这和路由 404 是两回事。
怎么区分:
- 检查日志:如果是模型没找到,log 里会有
Illuminate\Database\Eloquent\ModelNotFoundException - 用
find()替代findOrFail(),然后手动判断并返回不同状态码,比如:if (!$user) return response()->json(['message' => 'User not found'], 404); - 全局异常处理里可以统一转换,但别一刀切把所有 404 都当成业务错误——有些真就是路由不存在
测试 API 别用浏览器直接输地址
浏览器发 GET 请求没问题,但 POST/PUT/DELETE 会被转成 GET,Header 也带不全(比如没 Accept: application/json),导致 Laravel 返回 HTML 错误页而不是 JSON 错误信息。
正确做法:
- 用
curl测试:curl -H "Accept: application/json" http://localhost:8000/api/users - Postman 或 Thunder Client(VS Code 插件)更直观,记得设好
Content-Type: application/json和Accept: application/json - 写单元测试比手点快:
php artisan test --filter=Api/UsersTest,用$this->getJson('/api/users')等断言方法
真正卡住人的往往不是语法,而是中间件组合、异常传播路径、以及 JSON 响应和 HTML 响应在同一应用里混用时的隐性冲突。多看日志里那行红色异常类名,比反复刷新浏览器有用得多。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











