每个操作页面都会显示由规格构建的 cURL、TypeScript 和 Python 请求。
参数值
- 参数自身的
example,或其第一个examples条目,优先。 - 否则,值会根据参数的 schema 生成,与请求体一样。没有声明值时,是类型猜测,例如
string、0或某个格式的固有值。 - 没有声明值的路径参数会在尖括号中显示其名称,例如
<account_id>:猜出的标识符并不指向真实资源。 - 必填查询参数和 header 保留生成的值,包括猜测值。没有 schema,或生成值是数组或对象的参数,显示
<name>。 - 可选查询参数和 header 不会出现在示例中,即使有
example。
服务器与凭据
- 凭据渲染为占位符:
Bearer <token>、Basic <credentials>或 API key 的名称,例如<X-API-Key>。占位符从不进行 URL 编码;声明的值会。 - 服务器。 示例使用规格中的第一个 server,每个变量设为其
default。没有 default 的变量显示为<region>。 - 没有 server,或使用相对 server(例如
/v1):示例以<base-url>开头,由读者填写。
请求体
请求体使用请求示例,或根据 schema 生成的值。
字符串示例会按原样发送,除非媒体类型是 JSON(application/json 或 +json 类型),此时会作为 JSON 字符串发送。因此 application/x-ndjson 下的字符串会原样到达。
显式的 JSON null 会作为 null 发送,这与没有请求体不同。
表单请求体
application/x-www-form-urlencoded 请求体会作为表单字段发送。没有 encoding 条目时,属性使用大多数表单 API 期望的方括号约定:
| 值 | 发送为 |
|---|---|
| 嵌套对象 | metadata[plan]=pro |
| 标量数组 | tags=a&tags=b |
| 对象数组 | items[0][price]=p_1 |
null 或 "" |
name= |
| 空对象或数组 | 无字段 |
带 encoding 条目的属性会遵循该条目。style、explode 或 allowReserved 会选择查询式序列化,deepObject 会为每个数组建立索引,例如 expand[0]=customer。只有 contentType 的条目会以该类型发送值,因此对象会作为 JSON 发送。
例如,以下媒体类型会发送以逗号连接的 tags,以及方括号形式的 metadata:
application/x-www-form-urlencoded:
schema:
type: object
properties:
tags: { type: array, items: { type: string } }
metadata: { type: object, additionalProperties: { type: string } }
encoding:
tags: { style: form, explode: false }
example:
tags: ["a,b", "c"]
metadata: { plan: pro }tags=a%2Cb,c&metadata%5Bplan%5D=proexplode: false用,(form)、|(pipeDelimited)或%20(spaceDelimited)连接各项。每项先编码,因此项内的分隔符保持区分。explode: true为每项重复该字段一次。allowReserved: true按 OpenAPI 的规定,将项内的,不编码发送,因此["a,b", "c"]和["a", "b,c"]发送相同的字节。表单分隔符(=、&、+)和不安全字符仍保持编码。- JSON
contentType会先对每个值进行 JSON 序列化,因此abc发送为%22abc%22,null发送为null。
字符串示例会被当作已编码的表单读取。
Multipart 请求体
multipart/form-data 请求体会按每个字段一个 part 发送:
- 文件。 带
format: binary的字符串会作为名为<file>的文件发送(字段名在括号中)。文件数组会为每项发送一个 part,生成的示例有两个。文件 part 默认使用application/octet-stream。 - 带
encoding条目的字段。 在 OpenAPI 3.1 中,style、explode和allowReserved会把字段序列化为表单字段,因此deepObject会生成link_options[create]之类的名称。contentType会以该类型发送 part。OpenAPI 3.0 对 multipart 忽略这些。 - 其他字段。 对象或对象数组是一个 JSON part。标量数组会重复该字段。其他任何内容都是文本 part,按原样发送,即使它以
@开头。
只有 format: binary 会让字段成为文件;在 OpenAPI 3.1 中,请使用 encoding.contentType 设置 part 的类型。其他 multipart 类型(例如 multipart/mixed)不会生成示例,页面会改为显示请求示例。
例如,一个包含单个文本字段的文件上传:
curl --request POST \
--url https://api.example.com/v1/files \
--form 'file=@<file>;type=application/octet-stream' \
--form-string 'purpose=identity_document'以及一个没有请求体、带路径参数和 bearer token 的请求:
curl --request GET \
--url 'https://api.example.com/accounts/<account_id>' \
--header 'Authorization: Bearer <token>'手写示例
操作的 x-codeSamples 会替换生成的示例,Nimbus 从不更改其文本。每个条目为 { lang, label?, source }。所有条目都会按顺序显示,包括同一语言的多个条目。手写示例不需要任何生成器包;如果站点手写了所有示例,可以设置 samples.generate: [] 并在没有这些包的情况下构建。两个包都是可选 peer,因此在 pnpm 下,移除会在 lockfile 不再列出它们后生效。
每个条目的 label 会在代码栏和 Markdown 版本中命名它。没有 label 时,使用其 lang,重复项会编号:Python、Python (2)。
手写示例的 lang(不区分大小写)如果是 Shiki 已知的语言,例如 hcl、rust 或 kotlin,就会高亮;其他任何 lang 都会渲染为纯文本。curl 示例会按 bash 高亮,其 Markdown 围栏标记为 bash;其他所有围栏保留手写的 lang。
请求体会出现在代码示例内部,Markdown 版本还会把它列为示例请求。完全没有示例的操作会在页面上改为显示其请求示例。
选择语言
api 条目上的两个设置控制生成的示例,作用于家族的所有版本:
samples.generate选择要生成的语言。默认是全部三种,[]不生成任何语言。samples.keepGenerated在手写示例旁保留生成的语言。每种语言也必须出现在generate中。
有效值为 "curl"、"typescript" 和 "python"。例如,只生成 cURL,并把它显示在任何手写 SDK 示例旁边:
api: [
{
collection: "api",
spec: "./src/api/openapi.yaml",
samples: { generate: ["curl"], keepGenerated: ["curl"] },
},
],保留的示例排在手写示例之后。同一语言的手写示例会替换生成的示例:curl、python 或 py、typescript 或 ts,不区分大小写。shell 或 bash 示例不会替换 cURL。
代码栏记住读者的语言,而不是确切的示例。?lang= 链接会打开具有该 id 的示例,例如 python-2,或该语言中的第一个,例如 python。
在自己的组件中渲染已准备的代码
apiCollection() 在构建内容索引时会高亮请求示例、主请求示例和具名请求示例、响应,以及其他请求体和响应媒体类型的示例。OpenAPI 的 requestBody.content.*.examples 条目可作为 ApiOperationPage.requestExamples 使用,保留每个键、summary、description、媒体类型和内联值。仅外部示例不会被获取。
用户自有的渲染器应使用 Astro 的 set:html 渲染 highlightedHtml,而不是在按请求渲染的路由中导入 Shiki 或 Astro 的 Code 组件:
---
import type { ApiOperationPage } from "@cloudflare/nimbus-docs/api";
interface Props extends Pick<ApiOperationPage, "samples"> {}
const { samples } = Astro.props;
function preparedCode(value: { highlightedHtml?: string }): string {
if (!value.highlightedHtml) {
throw new Error("Nimbus API code was not prepared during content sync.");
}
return value.highlightedHtml;
}
---
{samples.map((sample) => (
<Fragment set:html={preparedCode(sample)} />
))}把缺失的已准备值视为过时或错误构建的 API 索引。更改规格或 API 渲染器类型后请重新构建。