
Spec
Swagger Proto生成
本说明描述如何在 Service、消息和字段上使用 swagger 目录下的定义,将 gRPC 风格的接口补充为可通过 HTTP 访问的 API,并生成相应的
OpenAPI/Swagger 信息。
service 映射到 HTTP 路径空间,并分组管理。rpc 补充 HTTP 动词、路径、说明、权限等元数据。主要依赖:
apihug/protobuf/swagger/swagger.protoapihug/protobuf/swagger/annotations.protoapihug/protobuf/mock/mock.proto(在需要 mock 数据时)在对外暴露的 service 上添加服务级选项:
import "apihug/protobuf/swagger/annotations.proto";
service PetService {
option (hope.swagger.svc) = {
path: "/pet";
description: "Pet Manager service";
};
}
path:服务的基础路径,一般使用资源名或其复数形式,如 /user、/orders。description:对该服务的简要说明,可使用中文。在每个外部 API 的 rpc 上配置 HTTP 映射:
rpc AddPersonalProject (RequestType) returns (ResponseType) {
option (hope.swagger.operation) = {
post: "/upload-meta";
description: "开放平台上传API元数据";
tags: "open";
};
}
get。post。put。patch。delete。{} 包裹,例如 "/pet/{id}"。pageable = true:表示该操作为分页查询,框架会对请求参数和返回结构进行分页包装。input_repeated / out_repeated:表示请求体或响应体为列表结构(非分页)。request_name:给请求体一个逻辑名称,用于生成器或文档,可选。response_media_type:从 Operation.MediaType 中选择响应媒体类型,常用值包括:
APPLICATION_JSONTEXT_PLAINAPPLICATION_PDF 等import "apihug/protobuf/swagger/annotations.proto";
message PlaceOrderRequest {
option (hope.swagger.schema) = {
json_schema: {
title: "PlaceOrder";
description: "下单请求";
};
};
}
title:对象名称,可选,建议在核心对象上设置。description:对象用途说明,建议设置为清晰的自然语言描述。在对外可见的字段上使用字段级扩展:
string name = 1 [(hope.swagger.field) = {
description: "名称";
example: "物流助手";
empty: FALSE;
}];
description:字段含义说明。example:示例值,用于文档和前端联调。JSONSchema 的 oneof 中选择一种):
empty:控制是否允许为空或空集合。blank:仅对字符串,控制是否允许空白串。nullable:控制是否允许为 null(多用于非字符串类型)。可在 JSONSchema 中组合使用以下常用约束:
max_length / min_length:字符串长度范围。max_items / min_items:集合中元素个数范围。maximum / minimum(配合 exclusive_maximum / exclusive_minimum)。pattern:使用正则表达式约束字符串格式。enum:允许值列表(字符串形式)。time_constraint_type:指定时间约束类型,如 FUTURE、PAST 等。date_format:使用预定义的 DateFormat,如 YYYY_MM_DD_HH_MM_SS。customized_date_format:使用自定义格式字符串。email:标记需要符合邮箱格式的字符串。如需为字段生成测试数据,可在字段的 JSONSchema 中使用 mock 字段,并结合 mock 命令规则进行配置。
对于路径、查询、头部、Cookie、Session 等参数,可以通过 Operation.parameters 显式定义:
option (hope.swagger.operation) = {
get: "/pet/{id}";
parameters: {
parameter: [{
name: "id";
in: PATH;
schema: {
format: INTEGER;
minimum: 1;
};
}];
};
};
name:参数名称,与路径或查询参数名一致。in:参数位置:QUERY、HEADER、PATH、COOKIE、SESSION。schema:使用 JSONSchema 描述该参数的类型和约束。plural:使用 BoolType 指示该参数是否为数组形式。authorization.low_limit_risky_mode:
ANONYMOUS:无需登录即可访问。LOGIN:需登录用户。ACTIVE:需登录且账号处于有效状态。authorization.rbac:option (hope.swagger.operation) = {
post: "/admin/user";
authorization: {
rbac: {
roles: { roles: ["ROLE_ADMIN"]; };
authorities: ["USER_ADD", "USER_DELETE"];
combinator: AND;
};
};
};
roles.roles:角色列表。authorities:权限标识列表,需要能与业务中的 Authority 枚举对上。combinator:角色与权限的组合方式(如 AND)。group 标记接口所属的前端场景:
CUSTOMER:面向终端用户。TENANT:面向租户管理后台。PLATFORM:面向平台运营后台。questions
option (hope.swagger.operation) = {
get: "/orders";
questions: [
"如何获取当前用户的订单列表?",
"查询最近一页订单数据"
];
};
questions 可填写若干自然语言问题,帮助大模型理解接口用途与调用方式。internal 与 hideinternal = true:接口仅供内部使用,不面向前端或外部调用方。hide = true:在生成文档时隐藏该接口(如调试或运维接口)。在 Operation 中,可以通过响应相关字段对返回结构进行细化:
body_empty:允许接口返回空 body,适用于纯命令式操作。mock:为简单类型响应定义 mock 数据。response_schema:直接提供响应体的 JSONSchema 描述,用于特殊场景下覆盖默认推断。service 和 rpc 补充必要的路径、说明和分组信息,使 API 文档清晰可读。(hope.swagger.schema),并为字段配置 (hope.swagger.field) 中的描述、示例和约束。mock 字段结合 mock 目录规则进行配置。authorization 和 group 清晰表达访问边界。