SuperAPI AI 工具集

restapi

编程与开发

查看项目

更新于 10-16 02:12

技能介绍

用途

REST API 技能提供全面的 REST API 设计与实现能力,面向 Golden Armada AI Agent Fleet Platform。

当处理以下内容时,可启用本技能:

  • API 端点设计
  • HTTP 请求/响应处理
  • API 认证
  • OpenAPI 文档
  • API 测试

主要能力

REST API 设计原则

资源命名应使用名词、复数形式:

Good - nouns, plural

GET    /agents
GET    /agents/{id}
POST   /agents
PUT    /agents/{id}
DELETE /agents/{id}

Nested resources

GET    /agents/{id}/tasks
POST   /agents/{id}/tasks

Bad - verbs, actions

GET    /getAgents
POST   /createAgent

HTTP 方法使用与幂等性:

Method Usage Idempotent
GET Read resource Yes
POST Create resource No
PUT Replace resource Yes
PATCH Partial update No
DELETE Delete resource Yes

状态码示例:

Success

200 OK              - Successful GET, PUT, PATCH
201 Created         - Successful POST
204 No Content      - Successful DELETE

Client Errors

400 Bad Request     - Validation error
401 Unauthorized    - Authentication required
403 Forbidden       - Not permitted
404 Not Found       - Resource not found
409 Conflict        - Duplicate/conflict
422 Unprocessable   - Semantic validation error

Server Errors

500 Internal Error  - Server error
502 Bad Gateway     - Upstream error
503 Service Unavailable - Temporary overload

API 实现(FastAPI)

from fastapi import FastAPI, HTTPException, Query, Path, Depends, status
from typing import List, Optional
from pydantic import BaseModel, Field

app = FastAPI(title="Golden Armada API", version="1.0.0")

# Models

class AgentCreate(BaseModel):
    name: str = Field(..., min_length=1, max_length=100)
    type: str = Field(..., pattern="^(claude|gpt|gemini)$")

class AgentResponse(BaseModel):
    id: str
    name: str
    type: str
    status: str
    created_at: datetime

# Endpoints

@app.get("/agents", response_model=List[AgentResponse])
async def list_agents(
    skip: int = Query(0, ge=0),
    limit: int = Query(100, ge=1, le=1000),
    status: Optional[str] = Query(None)
):
    """List all agents with pagination and filtering."""
    return await agent_service.list(skip=skip, limit=limit, status=status)

@app.get("/agents/{agent_id}", response_model=AgentResponse)
async def get_agent(agent_id: str = Path(..., description="Agent ID")):
    """Get a specific agent by ID."""
    agent = await agent_service.get(agent_id)
    if not agent:
        raise HTTPException(status_code=404, detail="Agent not found")
    return agent

@app.post("/agents", response_model=AgentResponse, status_code=201)
async def create_agent(agent: AgentCreate):
    """Create a new agent."""
    return await agent_service.create(agent)

@app.put("/agents/{agent_id}", response_model=AgentResponse)
async def update_agent(agent_id: str, agent: AgentCreate):
    """Replace an existing agent."""
    existing = await agent_service.get(agent_id)
    if not existing:
        raise HTTPException(status_code=404, detail="Agent not found")
    return await agent_service.update(agent_id, agent)

@app.delete("/agents/{agent_id}", status_code=204)
async def delete_agent(agent_id: str):
    """Delete an agent."""
    deleted = await agent_service.delete(agent_id)
    if not deleted:
        raise HTTPException(status_code=404, detail="Agent not found")

认证

JWT 认证:

from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from jose import JWTError, jwt

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

async def get_current_user(token: str = Depends(oauth2_scheme)):
    credentials_exception = HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="Could not validate credentials",
        headers={"WWW-Authenticate": "Bearer"},
    )
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        user_id: str = payload.get("sub")
        if user_id is None:
            raise credentials_exception
    except JWTError:
        raise credentials_exception
    return await get_user(user_id)

# Protected endpoint

@app.get("/protected")
async def protected_route(user: User = Depends(get_current_user)):
    return {"user": user.email}

API Key 认证:

from fastapi.security import APIKeyHeader

api_key_header = APIKeyHeader(name="X-API-Key")

async def verify_api_key(api_key: str = Depends(api_key_header)):
    if api_key != VALID_API_KEY:
        raise HTTPException(status_code=403, detail="Invalid API key")
    return api_key

错误处理

class ErrorResponse(BaseModel):
    error: str
    message: str
    details: Optional[dict] = None

@app.exception_handler(ValueError)
async def value_error_handler(request, exc):
    return JSONResponse(
        status_code=400,
        content=ErrorResponse(
            error="validation_error",
            message=str(exc)
        ).dict()
    )

@app.exception_handler(Exception)
async def general_exception_handler(request, exc):
    return JSONResponse(
        status_code=500,
        content=ErrorResponse(
            error="internal_error",
            message="An unexpected error occurred"
        ).dict()
    )

使用 curl 进行 API 测试

# GET

curl -X GET "http://localhost:8000/agents" \
  -H "Authorization: Bearer TOKEN"

# POST

curl -X POST "http://localhost:8000/agents" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer TOKEN" \
  -d '{"name": "agent-1", "type": "claude"}'

# PUT

curl -X PUT "http://localhost:8000/agents/123" \
  -H "Content-Type: application/json" \
  -d '{"name": "updated-agent", "type": "claude"}'

# DELETE

curl -X DELETE "http://localhost:8000/agents/123" \
  -H "Authorization: Bearer TOKEN"

OpenAPI 文档

from fastapi import FastAPI

app = FastAPI(
    title="Golden Armada API",
    description="AI Agent Fleet Platform API",
    version="1.0.0",
    docs_url="/docs",
    redoc_url="/redoc",
    openapi_url="/openapi.json"
)

访问文档地址:

  • Swagger UI: http://localhost:8000/docs
  • ReDoc: http://localhost:8000/redoc
  • OpenAPI JSON: http://localhost:8000/openapi.json

适用场景

  • 设计或评审 REST API 端点与资源命名
  • 选择并正确使用 HTTP 方法与状态码
  • 为 API 添加 JWT 或 API Key 认证
  • 统一 API 错误响应格式
  • 使用 curl 对接口进行手动测试
  • 配置 OpenAPI/Swagger 文档

限制

关于该技能的收费、价格、平台支持范围、具体效果或额外使用步骤,资料中暂未提供。