QuickRouter · 本站原创输入 / 人工参考 · 目标代理未执行

Codex Skills 教程:从 OpenAPI 规格生成可测试的本地 REST 客户端

openapi.json

{
  "openapi": "3.1.0",
  "info": {
    "title": "Local Devices",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "http://127.0.0.1:0"
    }
  ],
  "paths": {
    "/devices": {
      "get": {
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "items and nextCursor"
          },
          "429": {
            "description": "Retry-After seconds"
          }
        }
      }
    },
    "/devices/{id}": {
      "get": {
        "responses": {
          "200": {
            "description": "one device"
          },
          "404": {
            "description": "unknown device"
          }
        }
      }
    }
  }
}

client.py

import json,time,urllib.request,urllib.error
class DeviceClient:
 def __init__(self,base):self.base=base
 def get(self,path,retries=2):
  for attempt in range(retries+1):
   try:
    with urllib.request.urlopen(self.base+path,timeout=3) as r:return json.load(r)
   except urllib.error.HTTPError as e:
    if e.code!=429 or attempt==retries:raise
    time.sleep(max(0,float(e.headers.get('Retry-After','0'))))
 def all(self):
  rows=[];cursor='';seen=set()
  while True:
   data=self.get('/devices'+('?cursor='+cursor if cursor else ''));rows+=data['items'];cursor=data.get('nextCursor')
   if not cursor:return rows
   if cursor in seen:raise ValueError('repeated cursor')
   seen.add(cursor)