根據接口文檔生成前端請求層提示詞(OpenAPI / Swagger → TypeScript 類型 + 請求函數 + 統一錯誤處理)

後端給了 Swagger / OpenAPI 文檔,前端要寫請求函數和類型定義時用:AI 根據文檔生成帶完整類型的請求層,統一處理鑑權、錯誤、超時和取消,並建議是否改用代碼生成工具,讓接口變化時類型能自動同步。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
你是一名前端架構師。請根據接口文檔為前端生成請求層代碼。

- 接口文檔(OpenAPI 3 的 JSON 或 YAML,或 Swagger 頁面上相關接口的描述):
  [粘貼接口文檔]
- 前端技術棧:[前端技術棧](例:React + TypeScript + TanStack Query)
- 請求庫:[請求庫](例:fetch、axios)
- 鑑權方式:[鑑權方式](例:Bearer Token,過期返回 401 需刷新)
- 後端統一返回格式與錯誤格式:[返回格式]

請輸出:
1. 方案建議:手寫請求層還是使用代碼生成工具從 OpenAPI 文檔自動生成類型和客戶端;說明各自適合的情況。如果接口多、變化頻繁,推薦生成方案並給出配置示例,同時下面的封裝仍然適用。
2. 類型定義:根據文檔的模型生成 TypeScript 類型;可選字段、可為空字段、枚舉、日期字符串要準確對應;不要用 any。文檔中類型不明確的地方列出來,便於向後端確認。
3. 請求基礎封裝:
   - 基礎地址與環境配置;
   - 自動攜帶令牌;遇到 401 時刷新令牌並重試一次,多個請求同時遇到 401 時只刷新一次;
   - 統一錯誤類型:網絡錯誤、超時、業務錯誤(帶錯誤碼和提示)、未授權;
   - 超時與請求取消;
   - 查詢參數與請求體的序列化。
4. 按資源組織的請求函數:每個接口一個函數,參數和返回值都有類型。
5. 與數據請求庫結合(如果使用):查詢鍵的組織方式、修改數據後讓相關緩存失效。
6. 一個調用示例與對請求層的單元測試示例(模擬請求庫)。

高亮處換成你自己的內容:[粘貼接口文檔]、[前端技術棧]、[請求庫]、[鑑權方式]、[返回格式]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:[接口文檔] 最好直接貼 OpenAPI 的 JSON 或 YAML(Swagger 頁面通常提供下載連結),比複製頁面文字準確。文檔很大時,只貼本次要用的接口和它們引用的模型。[後端統一返回格式與錯誤格式] 決定錯誤處理怎麼寫,一定要給出示例。

常見坑:

  • 手寫類型時把可空字段寫成必填,運行時拿到 null 就報錯。可選和可為空要區分清楚。
  • 多個請求同時返回 401,每個都去刷新令牌,結果刷新接口被調用多次,甚至互相把對方的新令牌作廢。要讓並發的刷新共用同一個請求。
  • 接口改了字段名,手寫的類型沒跟着改,編譯通過、運行出錯。接口多時用代碼生成,並在流程中加入「文檔更新後重新生成」的步驟。

追問技巧:追問「把這個請求層改造成支持多個後端服務(不同基礎地址與鑑權)」,或「後端返回的日期是字符串,如何在請求層統一轉換為日期對象」。

示例輸出

示例,僅供參考(節選)
ts
export type OrderStatus = 'PENDING' | 'PAID' | 'CANCELLED'

export interface Order {
  id: number
  status: OrderStatus
  amountCents: number
  paidAt: string | null        // 文檔標註 nullable,ISO 8601 字符串
  remark?: string              // 文檔中非必需字段
}

export class ApiError extends Error {
  constructor(public status: number, public code: string, message: string) { super(message) }
}

let refreshing: Promise<void> | null = null   // 並發 401 時共用同一次刷新

async function request<T>(path: string, init: RequestInit = {}, retried = false): Promise<T> {
  const res = await fetch(`${BASE_URL}${path}`, {
    ...init,
    headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${getToken()}`, ...init.headers },
  })
  if (res.status === 401 && !retried) {
    refreshing ??= refreshToken().finally(() => { refreshing = null })
    await refreshing
    return request<T>(path, init, true)
  }
  if (!res.ok) {
    const body = await res.json().catch(() => ({}))
    throw new ApiError(res.status, body.code ?? 'UNKNOWN', body.message ?? '請求失敗')
  }
  return res.json() as Promise<T>
}

export const getOrder = (id: number) => request<Order>(`/orders/${id}`)

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~