当前位置: 首页 > 知识库问答 >
问题:

从原始文件创建swagger.json文件的混淆

湛文乐
2023-03-14

我已经创建了一个proto文件,其中包含我打算生成的REST Web服务的所有必要消息和rpc函数。使用proc-gen-swagger插件,我设法将该proto文件编译成一个swagger.json文件,一切似乎都很好,除了两件事,我似乎无法解决。

>

  • swagger.json文件中的所有定义都以我的原始文件包的名称为前缀。有没有办法摆脱这个?

    我的消息的所有字段都是“可选的”。它们没有被明确指定为这样,但它们没有被指定为“必需”,根据定义,这使得它们是可选的。Proto3不再支持required/optional/repeating,但即使我使用Proto2并添加这些关键字,它似乎也不会影响招摇过市。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;
    }
    

    然后,这被编译成一种炫耀。带有以下命令的json文件:

    协议-I.-I“%GOPATH%/src/github.com/grpc生态系统/grpc网关/第三方/googleapis”--swagger\u out=logtostderr=true:。webservice。原型

    产生以下输出: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"
            }
          }
        }
      }
    }
    

    >

  • 注意proto文件中的MyMessageMyACK如何转换为json文件中的mypack ageMyMessagemypack ageMyACK

    例如,如果我希望需要MyMessage: MyString,我必须在“定义”中的“mypack ageMyMessage”部分中添加一个部分,如下所示:

    “必需”:[“MyString”]

    如果有一种方法可以在proto文件中指定,那么我肯定会更喜欢,这样我就不必每次编译json文件时都手动编辑它。

  • 共有2个答案

    牧飞鹏
    2023-03-14

    您的前缀mypackage是中命名空间的一部分。原型文件。它来自以下行:package-mypackage 删除此行并重新生成json

    公英哲
    2023-03-14

    在这里发帖给任何遇到这个问题寻找相同信息的人。

    更新这是代码定义如何创建定义的地方。

    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;
    }
    
     类似资料:
    • 我很难让swashbuckle.aspnetcore(1.0.0)包生成任何输出。我读到swagger.json文件应该写到'~/swagger/docs/v1'。然而,我没有得到任何输出。 我从一个全新的ASP.NET核心API项目开始。我应该提到这是ASP.NET Core2。API可以工作,我可以从values控制器检索值。 我的启动类的配置与本文描述的完全相同(GitHub上的swashb

    • 问题内容: 我需要一些帮助来创建文件 我在过去的几个小时中尝试使用RandomAccessFile并尝试实现下一个逻辑: 获取文件对象 创建一个具有相似名称的临时文件(我如何确保将临时文件与给定的原始文件放置在同一位置?) 写入此文件 用临时文件替换磁盘上的原始文件(应使用原始文件名)。 我正在寻找一个简单的代码,谁喜欢使用RandomAccessFile,我只是不正确地解决这几个步骤。 编辑:好

    • 问题内容: 我是Scala的新手,也不了解Java。我想从一个简单的Scala文件中创建一个jar文件。所以我有了我的HelloWorld.scala,生成了一个HelloWorld.jar。 Manifest.mf: 在控制台中,我运行: 问题答案: 示例目录结构: HelloWorld.scala: MANIFEST.MF: build.bat: 为了成功使用 -jar 开关,您需要在 MET

    • 在我的项目中,我正在上传一个文件。上传时,我将其原始文件名和扩展名保存在数据库中,并将该文件与一些一起保存在服务器上,生成的GUID也与文件名和扩展名一起存储在数据库中。 比如-- -用于上载的文件名为Questions.docx -则orignalFileName将为“问题” -文件扩展名将为“.docx” -上传文件,文件名为“0C1B96D3-AF54-40D1-814D-B863B7528

    • 问题内容: 我正在尝试在Android Studio的res \ raw文件中保留一个.txt文件,并读取/解析该文件。我在“ res”目录(未创建)中创建的名为“ raw”的文件夹中有一个文件“ my_file.txt”。 我认为我的主要问题是:创建File对象(与Scanner对象一起使用)时,应该为文本文件传递什么路径? 这是我的代码: 问题答案: 认为您正在寻找符合以下条件的东西 其中ct

    • 问题内容: 因此,有很多关于如何使用puttyGen将PEM转换为PPK的教程。但是我的问题是我的Windows计算机只有唯一的PEM副本,我将其转换为PPK并删除了它。现在,我需要弄清楚如何将PPK转换为PEM,以便我的Mac可以通过SSH进入服务器。我仍然可以访问服务器,因此,如果需要的话,我也可以创建一个新密钥,有人知道如何将PPK转换为PEM吗? 问题答案: 安装 PuttyTools 生