作者:手机用户2502923903 | 来源:互联网 | 2023-02-11 11:05
我已经创建了一个原型文件,其中包含要生成的REST Web服务的所有必需消息和rpc函数。使用protoc-gen-swagger插件,我已经设法将该原型文件编译为swagger.json文件,并且看起来很不错,除了两件事,我似乎无法解决。
swagger.json文件中的所有定义都有我原型文件包的名称的前缀。有办法摆脱这种情况吗?
我的邮件的所有字段均为“可选”。没有明确指定它们,但没有指定它们是“必需的”,根据定义,这使它们成为可选的。Proto3不再支持必需/可选/重复,但是即使我使用Proto2并添加了这些关键字,它似乎也不会影响swagger.json输出。如何在proto文件中指定必填字段,以便protoc-gen-swagger将所需部分添加到json输出中?
这是一个非常基本的原始文件的示例:
webservice.proto
syntax = "proto3";
package mypackage;
import "google/api/annotations.proto";
service MyAPIWebService {
rpc MyFunc (MyMessage) returns (MyResponse) {
option (google.api.http) = {
post: "/message"
body: "*"
};
}
}
message MyMessage {
string MyString = 1;
int64 MyInt = 2;
}
message MyResponse {
string MyString = 1;
}
然后使用以下命令将其编译为swagger.json文件:
协议-I。-I“%GOPATH%/ src / github.com / grpc-ecosystem / grpc-gateway / third_party / googleapis” --swagger_out = logtostderr = true :。webservice.proto
产生以下输出:
webservice.swagger.json
{
"swagger": "2.0",
"info": {
"title": "webservice.proto",
"version": "version not set"
},
"schemes": [
"http",
"https"
],
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"paths": {
"/message": {
"post": {
"operationId": "MyFunc",
"responses": {
"200": {
"description": "",
"schema": {
"$ref": "#/definitions/mypackageMyResponse"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/mypackageMyMessage"
}
}
],
"tags": [
"MyAPIWebService"
]
}
}
},
"definitions": {
"mypackageMyMessage": {
"type": "object",
"properties": {
"MyString": {
"type": "string"
},
"MyInt": {
"type": "string",
"format": "int64"
}
}
},
"mypackageMyResponse": {
"type": "object",
"properties": {
"MyString": {
"type": "string"
}
}
}
}
}
请注意如何MyMessage
和MyResponse
在原文件转化为mypackageMyMessage
和mypackageMyResponse
在JSON文件。
例如,如果我需要MyMessage:MyString,则必须在“ definitions”的“ mypackageMyMessage”部分中添加一个部分,如下所示:
“必填”:[“ MyString”]
我绝对希望有一种方法可以在原型文件中指定它,这样我就不必在每次编译时都手动编辑json文件。
1> Jodie Putrin..:
在这里张贴给遇到此问题的任何人,以寻找相同的信息。
UPDATE
这是代码定义定义创建方式的地方。
https://github.com/grpc-ecosystem/grpc-gateway/blob/master/protoc-gen-swagger/genswagger/template.go#L859
这是您可以根据需要表示字段的方式-在消息定义中添加自定义选项:
message MyMessage {
option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = {
json_schema: {
title: "MyMessage"
description: "Does something neat"
required: ["MyString"]
}
};
string MyString = 1;
int64 MyInt = 2;
}