Laravel API开发需严格遵循四原则:①路由必须置于api中间件组内以启用限流与模型绑定;②统一响应结构,封装success()/error()方法并规范code/message/data字段;③重写convertExceptionToArray()透出业务错误码;④API控制器须继承专用基类并使用--api生成。

routes/api.php是 Laravel API 的入口,所有接口路由默认走这里,但直接往里写闭包或控制器调用,上线后大概率会出问题——权限校验漏掉、响应格式不统一、错误码缺失、跨域被拦、调试信息泄露。别急着写逻辑,先理清这四个关键动作。
API 路由必须走 api 中间件组,不能只靠 auth:api
很多人在 routes/api.php 里加一条 Route::get('/user', [...]) 就以为完事了,结果发现没登录也能访问,或者请求头带了 Authorization 却报 401。根本原因是:Laravel 的 api 中间件组(定义在 app/Http/Kernel.php)自带 throttle:60,1 和 SubstituteBindings,而 auth:api 只负责认证,不自动启用限流和模型绑定。
- 必须确保路由在
Route::middleware('api')组内,或通过Route::prefix('api')->group(...)包裹 -
auth:api是可选的,仅当需要用户上下文时才加;没加它,$request->user()就是null,不会报错但可能引发空指针 - 自定义中间件(如权限检查)应放在
auth:api之后,否则认证失败前就执行鉴权逻辑,容易绕过
response()->json() 不够用,得封装统一响应结构
直接 return response()->json(['data' => $users]) 看似简单,但线上环境会暴露调试信息、缺少业务错误码、HTTP 状态码混乱(比如数据库异常返回 500,但业务校验失败也返回 200 + message 字段),前端无法稳定解析。
- 建议在
app/Http/Controllers/Api/Controller.php基类中提供success()和error()方法,强制返回固定字段:code、message、data(或errors) - 不要在控制器里手动拼
['code' => 0, 'message' => 'ok', 'data' => ...],避免重复、遗漏、大小写不一致 - 对集合数据,用
Resource类做转换(如UserResource::collection($users)),而不是裸数组,否则日期格式、隐藏字段、关系加载都失控
异常要重写 convertExceptionToArray(),否则前端收不到 code
默认 Laravel 抛出 ValidationException 或自定义 HttpException,前端收到的只有 message 和 HTTP 状态码,没有业务 code(比如 1003 表示未登录、2001 表示参数错误)。这是因为 app/Exceptions/Handler.php 的 convertExceptionToArray() 方法没透出 $e->getCode()。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 重写该方法,在非 debug 模式下也返回
'code' => $e->getCode() - 控制器里别用
abort(403, 'xxx'),改用throw new HttpException(403, 'xxx', null, [], 1005),第 5 个参数才是业务 code - 验证失败时,
ValidateRequest默认抛ValidationException,它的getCode()是 0,需在failedValidation()里手动 throw 新异常并设 code
API 控制器别继承 Controller,要用专用基类 + --api 生成
运行 php artisan make:controller Api/UserController --api 生成的控制器,方法只有 index、show、store、update、destroy,没有 create 和 edit —— 这不是偷懒,是明确拒绝 HTML 页面跳转语义。但很多人手建控制器或继承通用 Controller,导致方法名含糊、返回类型混杂(有时 json,有时 view)。
- 所有 API 控制器应放在
app/Http/Controllers/Api/目录,并继承自你自己的App\Http\Controllers\Api\Controller - 这个基类应禁用
middleware('web'),预加载常用 trait(如AuthorizesRequests),并内置success()/error() -
--api选项不会自动注册资源路由,仍需在routes/api.php显式写Route::resource('users', 'Api\UserController')
真正难的不是写出能跑的接口,而是让每个接口在认证失败时返回一致的 code、在参数错误时有可读的 errors 结构、在高并发下不被刷垮、在日志里能快速定位是哪个字段校验没过——这些全藏在中间件顺序、异常处理、响应封装的细节里,漏一个,前端就得多写三行判断逻辑。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










