PHP 接口开发:RESTful API 设计与实战

分类:后端开发 时间:2026-02-24 浏览:1
1

一、RESTful API 设计规范

REST(Representational State Transfer)是一种 API 设计风格,核心是 “资源为中心”:

1. HTTP 方法语义

表格

方法用途示例接口
GET查询资源/api/v1/users
POST创建资源/api/v1/users
PUT更新资源/api/v1/users/1
DELETE删除资源/api/v1/users/1
2. 状态码使用

表格

状态码含义场景
200成功查询 / 更新成功
201创建成功POST 创建资源成功
400参数错误缺少必填参数 / 参数格式错误
401未授权未登录 / Toke 过期
403禁止访问权限不足
404资源不存在查询的 ID 不存在
500服务器内部错误代码异常 / 数据库连接失败
3. 接口命名规范
  • 用名词表示资源,不用动词:/users(正确)、/getUsers(错误);

  • 版本号入 URL:/api/v1/users(便于兼容旧版本);

  • 嵌套资源:/api/v1/users/1/orders(用户 1 的订单);

  • 分页 / 筛选:/api/v1/users?page=1&size=10&status=1

二、Laravel 实现 RESTful API

1. 创建路由

修改routes/api.php

// 用户API路由
Route::prefix('v1')->group(function () {
    Route::get('/users', [\App\Http\Controllers\Api\UserController::class, 'index']); // 列表
    Route::post('/users', [\App\Http\Controllers\Api\UserController::class, 'store']); // 创建
    Route::get('/users/{id}', [\App\Http\Controllers\Api\UserController::class, 'show']); // 详情
    Route::put('/users/{id}', [\App\Http\Controllers\Api\UserController::class, 'update']); // 更新
    Route::delete('/users/{id}', [\App\Http\Controllers\Api\UserController::class, 'destroy']); // 删除
});
2. 创建 Controller
<?php
namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;

class UserController extends Controller
{
    /**
     * 获取用户列表
     * @return JsonResponse
     */
    public function index(): JsonResponse
    {
        $users = User::paginate(10); // 分页
        return response()->json([
            'code' => 200,
            'message' => 'success',
            'data' => $users
        ]);
    }

    /**
     * 创建用户
     * @param Request $request
     * @return JsonResponse
     * @throws ValidationException
     */
    public function store(Request $request): JsonResponse
    {
        // 参数验证
        $this->validate($request, [
            'username' => 'required|string|min:3',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:6'
        ]);

        // 创建用户
        $user = User::create([
            'username' => $request->username,
            'email' => $request->email,
            'password' => bcrypt($request->password)
        ]);

        return response()->json([
            'code' => 201,
            'message' => '创建成功',
            'data' => $user
        ], 201);
    }

    /**
     * 获取用户详情
     * @param int $id
     * @return JsonResponse
     */
    public function show(int $id): JsonResponse
    {
        $user = User::find($id);
        if (!$user) {
            return response()->json([
                'code' => 404,
                'message' => '用户不存在'
            ], 404);
        }

        return response()->json([
            'code' => 200,
            'message' => 'success',
            'data' => $user
        ]);
    }

    /**
     * 更新用户
     * @param Request $request
     * @param int $id
     * @return JsonResponse
     * @throws ValidationException
     */
    public function update(Request $request, int $id): JsonResponse
    {
        $user = User::find($id);
        if (!$user) {
            return response()->json([
                'code' => 404,
                'message' => '用户不存在'
            ], 404);
        }

        // 参数验证
        $this->validate($request, [
            'username' => 'string|min:3',
            'email' => 'email|unique:users,email,' . $id
        ]);

        // 更新用户
        $user->update($request->only(['username', 'email']));

        return response()->json([
            'code' => 200,
            'message' => '更新成功',
            'data' => $user
        ]);
    }

    /**
     * 删除用户
     * @param int $id
     * @return JsonResponse
     */
    public function destroy(int $id): JsonResponse
    {
        $user = User::find($id);
        if (!$user) {
            return response()->json([
                'code' => 404,
                'message' => '用户不存在'
            ], 404);
        }

        $user->delete();
        return response()->json([
            'code' => 200,
            'message' => '删除成功'
        ]);
    }
}
?>
3. JWT 身份认证
  1. 安装 JWT 扩展:

composer require tymon/jwt-auth:^1.0
  1. 发布配置:

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
  1. 生成密钥:

php artisan jwt:secret
  1. 修改 User 模型:

use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    // ...

    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    public function getJWTCustomClaims()
    {
        return [];
    }
}
  1. 添加登录接口:

public function login(Request $request)
{
    $credentials = $request->only('email', 'password');
    if (!$token = auth()->attempt($credentials)) {
        return response()->json(['code' => 401, 'message' => '账号或密码错误'], 401);
    }

    return response()->json([
        'code' => 200,
        'message' => '登录成功',
        'data' => [
            'token' => $token,
            'expires_in' => auth()->factory()->getTTL() * 60
        ]
    ]);
}
  1. 路由添加认证中间件:

Route::middleware('auth:api')->group(function () {
    Route::get('/users', [UserController::class, 'index']);
    // 其他需要认证的接口
});

三、API 文档自动生成

使用 Swagger(L5-Swagger):

  1. 安装扩展:

composer require darkaonline/l5-swagger
  1. 发布配置:

php artisan vendor:publish --provider "L5Swagger\L5SwaggerServiceProvider"
  1. 在 Controller 中添加注解:

/**
 * @OA\Get(
 *     path="/api/v1/users",
 *     summary="获取用户列表",
 *     tags={"用户管理"},
 *     @OA\Response(
 *         response=200,
 *         description="成功",
 *         @OA\JsonContent(
 *             @OA\Property(property="code", type="integer", example=200),
 *             @OA\Property(property="message", type="string", example="success"),
 *             @OA\Property(property="data", type="array", @OA\Items(ref="#/components/schemas/User"))
 *         )
 *     )
 * )
 */
public function index()
{
    // ...
}
  1. 访问文档:http://your-domain/api/documentation

文章链接:http://www.qwkf.cn//houduan/26.html
文章标题:PHP 接口开发:RESTful API 设计与实战

相关阅读