AgentSkillsCN

API Design

API 设计模式与 REST 约定。适用于各类 API 开发——端点设计、响应格式、错误处理、分页机制、状态码等。汇集了在 Laravel 与 Next.js API 开发中总结出的常用偏好与最佳实践。

SKILL.md
--- frontmatter
name: API Design
description: API design patterns and REST conventions. Use for any API work - endpoint design, response formats, error handling, pagination, status codes. Contains learned preferences for Laravel and Next.js API patterns.

API Design

API design patterns and conventions. Updated by the Reflect skill.

Last Updated

2025-01-28

RESTful Conventions

Endpoint Structure

PatternExampleDescription
GET /resourcesGET /usersList all resources
GET /resources/{id}GET /users/123Get single resource
POST /resourcesPOST /usersCreate new resource
PUT /resources/{id}PUT /users/123Replace resource
PATCH /resources/{id}PATCH /users/123Partial update
DELETE /resources/{id}DELETE /users/123Delete resource

Relationships

  • Use nested paths for 1:1 relationships: /users/{id}/profile
  • Use query params for 1:N relationships: /users/{id}/posts?limit=10
  • Avoid nesting deeper than 2 levels

Response Format

Success Response

json
{
  "success": true,
  "data": {
    "id": 123,
    "name": "Example"
  },
  "meta": {
    "page": 1,
    "per_page": 20,
    "total": 100
  }
}

Error Response

json
{
  "success": false,
  "error": {
    "message": "User not found",
    "code": "USER_NOT_FOUND",
    "details": {
      "field": "user_id",
      "value": 999
    }
  }
}

HTTP Status Codes

CodeUsageExample
200Success (GET, PATCH)User retrieved successfully
201Created (POST)User created successfully
204No Content (DELETE)User deleted successfully
400Bad RequestValidation failed
401UnauthorizedNot logged in
403ForbiddenLogged in, no permission
404Not FoundResource doesn't exist
422Unprocessable EntityValidation error
500Server ErrorSomething went wrong

Pagination

Query Parameters

code
GET /users?page=1&per_page=20&sort=created_at&order=desc

Response Structure

json
{
  "data": [...],
  "meta": {
    "page": 1,
    "per_page": 20,
    "total": 100,
    "pages": 5
  },
  "links": {
    "first": "/users?page=1",
    "last": "/users?page=5",
    "prev": null,
    "next": "/users?page=2"
  }
}

Laravel Implementation

Controller Structure

php
class UserController extends Controller
{
    public function index(Request $request): JsonResponse
    {
        $page = $request->input('page', 1);
        $perPage = $request->input('per_page', 20);

        $users = User::paginate($perPage);

        return response()->json([
            'success' => true,
            'data' => $users->items(),
            'meta' => [
                'page' => $page,
                'per_page' => $perPage,
                'total' => $users->total(),
            ]
        ]);
    }
}

Next.js Implementation

API Route Structure

code
app/api/
├── users/
│   ├── route.ts          # GET /api/users, POST /api/users
│   └── [id]/
│       └── route.ts      # GET/PATCH/DELETE /api/users/[id]

Learned Patterns

This section grows as the Reflect skill learns from sessions

Session 2025-01-28

  • Learned: Always include success boolean in responses for easy error checking
  • Learned: Use ISO 8601 format for all timestamps
  • Learned: Return 204 No Content for DELETE (not 200 with empty body)