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)