api-integration
2
总安装量
2
周安装量
#65925
全站排名
安装命令
npx skills add https://github.com/dseirz-rgb/worker --skill api-integration
Agent 安装分布
opencode
2
gemini-cli
2
antigravity
2
claude-code
2
github-copilot
2
codex
2
Skill 文档
API Integration (API éæ)
ð æ ¸å¿ç念: 稳å¥ç API éæ = ç±»åå®å ¨ + ä¼é é误å¤ç + æºè½éè¯
ð´ 第ä¸ååï¼é²å¾¡æ§ç¼ç¨
æ°¸è¿å设 API ä¼å¤±è´¥ï¼å好ææåå¤ï¼
â é误æè·¯: "è¿ä¸ª API å¾ç¨³å®ï¼ä¸éè¦é误å¤ç"
â
æ£ç¡®æè·¯: "ä»»ä½ API é½å¯è½å¤±è´¥ï¼å¿
é¡»æå®æ´çé误å¤çåéçº§æ¹æ¡"
â é误æè·¯: "ç´æ¥è°ç¨å°±è¡ï¼ç®åå¿«é"
â
æ£ç¡®æè·¯: "å°è£
ä¸å±ï¼ç»ä¸å¤ç认è¯ãé误ãéè¯ãæ¥å¿"
When to Use This Skill
ä½¿ç¨æ¤æè½å½ä½ éè¦ï¼
- éæç¬¬ä¸æ¹ REST/GraphQL API
- 设计 API 客æ·ç«¯æ¶æ
- å®ç°é误å¤çåéè¯é»è¾
- å¤ç API 认è¯åææ
- ä¼å API è°ç¨æ§è½
Not For / Boundaries
æ¤æè½ä¸éç¨äºï¼
- 设计èªå·±ç APIï¼åè API 设计è§èï¼
- æ°æ®åºç´æ¥æä½ï¼åè database-migration skillï¼
- WebSocket 宿¶éä¿¡ï¼åèä¸é¨ç宿¶éä¿¡æ¹æ¡ï¼
Quick Reference
ð¯ API éæå³çæµç¨
éæ±åæ â 鿩客æ·ç«¯åº â 设计å°è£
å± â å®ç°é误å¤ç â æ·»å éè¯é»è¾ â æµè¯éªè¯
â
ä¼å
使ç¨å®æ¹ SDK
ð éæåå¿ é®æ¸ å
| é®é¢ | ç®ç |
|---|---|
| 1. ææ²¡æå®æ¹ SDKï¼ | ä¼å 使ç¨å®æ¹ç»´æ¤ç客æ·ç«¯ |
| 2. API ææ¡£æ¯å¦å®æ´ï¼ | 确认端ç¹ãåæ°ãååºæ ¼å¼ |
| 3. è®¤è¯æ¹å¼æ¯ä»ä¹ï¼ | API Key / OAuth / JWT |
| 4. ææ²¡æéçéå¶ï¼ | è®¾è®¡éæµçç¥ |
| 5. éè¯¯ç æåªäºï¼ | 设计é误å¤çæ å° |
| 6. æ¯å¦éè¦éè¯ï¼ | ç¡®å®éè¯çç¥ |
ð§ æ¨èææ¯æ
| åºæ¯ | æ¨èæ¹æ¡ |
|---|---|
| HTTP 客æ·ç«¯ | ky, axios, fetch |
| ç±»åçæ | openapi-typescript, graphql-codegen |
| 请æ±ç¼å | @tanstack/react-query, swr |
| éè¯é»è¾ | p-retry, axios-retry |
| éçéå¶ | bottleneck, p-limit |
| Mock æµè¯ | msw, nock |
â API 客æ·ç«¯è®¾è®¡åå
// â
好ç设计ï¼å°è£
ç»ä¸ç API 客æ·ç«¯
class ApiClient {
private baseUrl: string;
private headers: Record<string, string>;
constructor(config: ApiConfig) {
this.baseUrl = config.baseUrl;
this.headers = {
'Content-Type': 'application/json',
'Authorization': `Bearer ${config.apiKey}`,
};
}
async request<T>(endpoint: string, options?: RequestOptions): Promise<T> {
// ç»ä¸å¤çï¼è®¤è¯ãé误ãéè¯ãæ¥å¿
}
}
// â åç设计ï¼å°å¤æ£è½ç fetch è°ç¨
const data = await fetch('https://api.example.com/users', {
headers: { 'Authorization': `Bearer ${apiKey}` }
});
API éæå·¥ä½æµ
Phase 1: éæ±åæä¸åå¤
1. é
读 API ææ¡£ï¼ç解端ç¹åæ°æ®ç»æ
2. ç¡®è®¤è®¤è¯æ¹å¼åè·ååè¯
3. äºè§£éçéå¶åé
é¢
4. ç¡®å®éè¦è°ç¨ç端ç¹å表
5. è®¾è®¡æ°æ®æ¨¡ååç±»åå®ä¹
Phase 2: 客æ·ç«¯æ¶æè®¾è®¡
1. éæ© HTTP 客æ·ç«¯åº
2. 设计åºç¡å®¢æ·ç«¯ç±»/彿°
3. å®ç°è®¤è¯é»è¾
4. 设计请æ±/ååºæ¦æªå¨
5. è§åé误å¤ççç¥
Phase 3: å®ç°ä¸æµè¯
1. å®ç°å端ç¹è°ç¨æ¹æ³
2. æ·»å ç±»åå®ä¹
3. å®ç°é误å¤ç
4. æ·»å éè¯é»è¾
5. ç¼ååå
æµè¯åéææµè¯
Phase 4: ä¼åä¸çæ§
1. æ·»å 请æ±ç¼å
2. å®ç°è¯·æ±åå¹¶/æ¹å¤ç
3. æ·»å æ¥å¿åçæ§
4. æ§è½ä¼å
Examples
Example 1: REST API éæ
Input: “éè¦éæ GitHub API è·åç¨æ·ä»åºå表”
Steps:
- æ£æ¥å®æ¹ SDK:
@octokit/restâ - è¯ä¼°: Stars 5k+, 宿¹ç»´æ¤, TypeScript æ¯æ
- å³ç: 使ç¨å®æ¹ SDK
Expected Output:
pnpm add @octokit/rest
import { Octokit } from '@octokit/rest';
const octokit = new Octokit({
auth: process.env.GITHUB_TOKEN,
});
async function getUserRepos(username: string) {
try {
const { data } = await octokit.repos.listForUser({
username,
sort: 'updated',
per_page: 100,
});
return data;
} catch (error) {
if (error.status === 404) {
throw new UserNotFoundError(username);
}
throw error;
}
}
Example 2: èªå®ä¹ API 客æ·ç«¯
Input: “éè¦éæä¸ä¸ªæ²¡æå®æ¹ SDK çç¬¬ä¸æ¹ API”
Expected Output:
// services/api/customApiClient.ts
import ky from 'ky';
import pRetry from 'p-retry';
interface ApiConfig {
baseUrl: string;
apiKey: string;
timeout?: number;
}
export function createApiClient(config: ApiConfig) {
const client = ky.create({
prefixUrl: config.baseUrl,
timeout: config.timeout ?? 30000,
headers: {
'Authorization': `Bearer ${config.apiKey}`,
'Content-Type': 'application/json',
},
hooks: {
beforeError: [
(error) => {
// ç»ä¸é误å¤ç
const { response } = error;
if (response?.status === 429) {
error.name = 'RateLimitError';
}
return error;
},
],
},
});
return {
async get<T>(endpoint: string): Promise<T> {
return pRetry(
() => client.get(endpoint).json<T>(),
{ retries: 3, onFailedAttempt: logRetry }
);
},
async post<T>(endpoint: string, data: unknown): Promise<T> {
return pRetry(
() => client.post(endpoint, { json: data }).json<T>(),
{ retries: 3, onFailedAttempt: logRetry }
);
},
};
}
Example 3: GraphQL API éæ
Input: “éè¦éæ GraphQL API”
Expected Output:
pnpm add graphql-request graphql
// services/api/graphqlClient.ts
import { GraphQLClient, gql } from 'graphql-request';
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT!, {
headers: {
Authorization: `Bearer ${process.env.API_TOKEN}`,
},
});
// ç±»åå®å
¨çæ¥è¯¢
const GET_USER = gql`
query GetUser($id: ID!) {
user(id: $id) {
id
name
email
}
}
`;
interface User {
id: string;
name: string;
email: string;
}
export async function getUser(id: string): Promise<User> {
const { user } = await client.request<{ user: User }>(GET_USER, { id });
return user;
}
é误å¤çæä½³å®è·µ
é误åç±»ä¸å¤ççç¥
| é误类å | HTTP ç¶æç | å¤ççç¥ |
|---|---|---|
| 客æ·ç«¯é误 | 400-499 | ä¸éè¯ï¼è¿åç¨æ·å好é误 |
| 认è¯é误 | 401, 403 | å·æ° token ææç¤ºéæ°ç»å½ |
| èµæºä¸åå¨ | 404 | è¿å null ææåºç¹å®é误 |
| éçéå¶ | 429 | çå¾ åéè¯ |
| æå¡å¨é误 | 500-599 | ææ°éé¿éè¯ |
| ç½ç»é误 | – | éè¯ + éçº§æ¹æ¡ |
èªå®ä¹é误类
// errors/apiErrors.ts
export class ApiError extends Error {
constructor(
message: string,
public statusCode: number,
public code: string,
public retryable: boolean = false
) {
super(message);
this.name = 'ApiError';
}
}
export class RateLimitError extends ApiError {
constructor(public retryAfter: number) {
super('Rate limit exceeded', 429, 'RATE_LIMIT', true);
}
}
export class AuthenticationError extends ApiError {
constructor() {
super('Authentication failed', 401, 'AUTH_FAILED', false);
}
}
éè¯çç¥
ææ°éé¿éè¯
import pRetry from 'p-retry';
const result = await pRetry(
async () => {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return response.json();
},
{
retries: 3,
minTimeout: 1000, // 馿¬¡éè¯çå¾
1s
maxTimeout: 10000, // æå¤§çå¾
10s
factor: 2, // ææ°å å
onFailedAttempt: (error) => {
console.log(`Attempt ${error.attemptNumber} failed. ${error.retriesLeft} retries left.`);
},
}
);
æ¡ä»¶éè¯
// åªå¯¹ç¹å®é误éè¯
const shouldRetry = (error: Error) => {
if (error instanceof ApiError) {
return error.retryable;
}
// ç½ç»éè¯¯æ»æ¯éè¯
return error.name === 'TypeError' || error.name === 'NetworkError';
};
References
references/rest-template.md: REST API éæå®æ´æ¨¡æ¿references/error-handling.md: API é误å¤ç模å¼è¯¦è§£
Maintenance
- Sources: è¡ä¸æä½³å®è·µ, 弿ºç¤¾åºç»éª
- Last Updated: 2025-01-01
- Known Limits:
- å ·ä½ API çç¹æ®å¤çéè¦æ ¹æ®ææ¡£è°æ´
- æäº API å¯è½éè¦ç¹æ®çè®¤è¯æµç¨