github.com/grpc-ecosystem/grpc-gateway/v2@v2.19.1/examples/internal/proto/examplepb/a_bit_of_everything.proto (about) 1 syntax = "proto3"; 2 3 package grpc.gateway.examples.internal.proto.examplepb; 4 5 import "examples/internal/proto/oneofenum/oneof_enum.proto"; 6 import "examples/internal/proto/pathenum/path_enum.proto"; 7 import "examples/internal/proto/sub/message.proto"; 8 import "examples/internal/proto/sub2/message.proto"; 9 import "google/api/annotations.proto"; 10 import "google/api/field_behavior.proto"; 11 import "google/protobuf/duration.proto"; 12 import "google/protobuf/empty.proto"; 13 import "google/protobuf/field_mask.proto"; 14 import "google/protobuf/timestamp.proto"; 15 import "google/protobuf/wrappers.proto"; 16 import "google/rpc/status.proto"; 17 import "protoc-gen-openapiv2/options/annotations.proto"; 18 19 option go_package = "github.com/grpc-ecosystem/grpc-gateway/v2/examples/internal/proto/examplepb"; 20 option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { 21 info: { 22 title: "A Bit of Everything"; 23 version: "1.0"; 24 contact: { 25 name: "gRPC-Gateway project"; 26 url: "https://github.com/grpc-ecosystem/grpc-gateway"; 27 email: "none@example.com"; 28 }; 29 license: { 30 name: "BSD 3-Clause License"; 31 url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; 32 }; 33 extensions: { 34 key: "x-something-something"; 35 value {string_value: "yadda"} 36 } 37 }; 38 // Overwriting host entry breaks tests, so this is not done here. 39 external_docs: { 40 url: "https://github.com/grpc-ecosystem/grpc-gateway"; 41 description: "More about gRPC-Gateway"; 42 } 43 schemes: HTTP; 44 schemes: HTTPS; 45 schemes: WSS; 46 consumes: "application/json"; 47 consumes: "application/x-foo-mime"; 48 produces: "application/json"; 49 produces: "application/x-foo-mime"; 50 security_definitions: { 51 security: { 52 key: "BasicAuth"; 53 value: {type: TYPE_BASIC} 54 } 55 security: { 56 key: "ApiKeyAuth"; 57 value: { 58 type: TYPE_API_KEY; 59 in: IN_HEADER; 60 name: "X-API-Key"; 61 extensions: { 62 key: "x-amazon-apigateway-authtype"; 63 value {string_value: "oauth2"} 64 } 65 extensions: { 66 key: "x-amazon-apigateway-authorizer"; 67 value { 68 struct_value { 69 fields { 70 key: "type"; 71 value {string_value: "token"} 72 } 73 fields { 74 key: "authorizerResultTtlInSeconds"; 75 value {number_value: 60} 76 } 77 } 78 } 79 } 80 } 81 } 82 security: { 83 key: "OAuth2"; 84 value: { 85 type: TYPE_OAUTH2; 86 flow: FLOW_ACCESS_CODE; 87 authorization_url: "https://example.com/oauth/authorize"; 88 token_url: "https://example.com/oauth/token"; 89 scopes: { 90 scope: { 91 key: "read"; 92 value: "Grants read access"; 93 } 94 scope: { 95 key: "write"; 96 value: "Grants write access"; 97 } 98 scope: { 99 key: "admin"; 100 value: "Grants read and write access to administrative information"; 101 } 102 } 103 } 104 } 105 } 106 security: { 107 security_requirement: { 108 key: "BasicAuth"; 109 value: {}; 110 } 111 security_requirement: { 112 key: "ApiKeyAuth"; 113 value: {}; 114 } 115 } 116 security: { 117 security_requirement: { 118 key: "OAuth2"; 119 value: { 120 scope: "read"; 121 scope: "write"; 122 } 123 } 124 security_requirement: { 125 key: "ApiKeyAuth"; 126 value: {}; 127 } 128 } 129 responses: { 130 key: "403"; 131 value: {description: "Returned when the user does not have permission to access the resource."} 132 } 133 responses: { 134 key: "404"; 135 value: { 136 description: "Returned when the resource does not exist."; 137 schema: { 138 json_schema: {type: STRING} 139 } 140 } 141 } 142 responses: { 143 key: "418"; 144 value: { 145 description: "I'm a teapot."; 146 schema: { 147 json_schema: {ref: ".grpc.gateway.examples.internal.proto.examplepb.NumericEnum"} 148 } 149 } 150 } 151 responses: { 152 key: "500"; 153 value: { 154 description: "Server error"; 155 headers: { 156 key: "X-Correlation-Id" 157 value: { 158 description: "Unique event identifier for server requests" 159 type: "string" 160 format: "uuid" 161 default: "\"2438ac3c-37eb-4902-adef-ed16b4431030\"" 162 pattern: "^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$" 163 } 164 }; 165 schema: { 166 json_schema: {ref: ".grpc.gateway.examples.internal.proto.examplepb.ErrorResponse"} 167 } 168 } 169 } 170 tags: { 171 name: "echo rpc" 172 description: "Echo Rpc description" 173 extensions: { 174 key: "x-traitTag"; 175 value {bool_value: true} 176 } 177 } 178 extensions: { 179 key: "x-grpc-gateway-foo"; 180 value {string_value: "bar"} 181 } 182 extensions: { 183 key: "x-grpc-gateway-baz-list"; 184 value { 185 list_value: { 186 values: {string_value: "one"} 187 values: {bool_value: true} 188 } 189 } 190 } 191 }; 192 193 message ErrorResponse { 194 string correlationId = 1 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { 195 pattern: "^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$", 196 title: "x-correlation-id", 197 description: "Unique event identifier for server requests", 198 format: "uuid", 199 example: "\"2438ac3c-37eb-4902-adef-ed16b4431030\"" 200 }]; 201 ErrorObject error = 2; 202 } 203 204 message ErrorObject { 205 int32 code = 1 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { 206 pattern: "^[0-9]$", 207 title: "code", 208 description: "Response code", 209 format: "integer" 210 }]; 211 string message = 2 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { 212 pattern: "^[a-zA-Z0-9]{1, 32}$", 213 title: "message", 214 description: "Response message" 215 }]; 216 } 217 218 // Intentionally complicated message type to cover many features of Protobuf. 219 message ABitOfEverything { 220 option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { 221 json_schema: { 222 title: "A bit of everything" 223 description: "Intentionally complicated message type to cover many features of Protobuf." 224 required: [ 225 "uuid", 226 "int64_value", 227 "double_value", 228 "required_field_schema_json_name" 229 ] 230 extensions: { 231 key: "x-a-bit-of-everything-foo"; 232 value {string_value: "bar"} 233 } 234 } 235 external_docs: { 236 url: "https://github.com/grpc-ecosystem/grpc-gateway"; 237 description: "Find out more about ABitOfEverything"; 238 } 239 example: "{\"int64_value\": 12, \"double_value\": 12.3}" 240 }; 241 242 // Nested is nested type. 243 message Nested { 244 option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {example: "{\"ok\": \"TRUE\"}"}; 245 // name is nested field. 246 string name = 1; 247 uint32 amount = 2; 248 // DeepEnum is one or zero. 249 enum DeepEnum { 250 // FALSE is false. 251 FALSE = 0; 252 // TRUE is true. 253 TRUE = 1; 254 } 255 256 // DeepEnum comment. 257 DeepEnum ok = 3 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {description: "DeepEnum description."}]; 258 } 259 Nested single_nested = 25; 260 261 string uuid = 1 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { 262 pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}", 263 min_length: 1, 264 field_configuration: {path_param_name: "uuidName"}, 265 format: "uuid", 266 extensions: { 267 key: "x-internal"; 268 value {bool_value: true} 269 } 270 }]; 271 repeated Nested nested = 2; 272 float float_value = 3 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { 273 description: "Float value field", 274 default: "0.2", 275 required: ["float_value"] 276 }]; 277 double double_value = 4; 278 int64 int64_value = 5; 279 uint64 uint64_value = 6; 280 int32 int32_value = 7; 281 fixed64 fixed64_value = 8; 282 fixed32 fixed32_value = 9; 283 bool bool_value = 10; 284 string string_value = 11; 285 bytes bytes_value = 29; 286 uint32 uint32_value = 13; 287 NumericEnum enum_value = 14; 288 pathenum.PathEnum path_enum_value = 30; 289 pathenum.MessagePathEnum.NestedPathEnum nested_path_enum_value = 31; 290 sfixed32 sfixed32_value = 15; 291 sfixed64 sfixed64_value = 16; 292 sint32 sint32_value = 17; 293 sint64 sint64_value = 18; 294 repeated string repeated_string_value = 19; 295 oneof oneof_value { 296 google.protobuf.Empty oneof_empty = 20; 297 string oneof_string = 21; 298 } 299 300 map<string, NumericEnum> map_value = 22; 301 map<string, string> mapped_string_value = 23; 302 map<string, Nested> mapped_nested_value = 24; 303 304 string nonConventionalNameValue = 26; 305 306 google.protobuf.Timestamp timestamp_value = 27; 307 308 // repeated enum value. it is comma-separated in query 309 repeated NumericEnum repeated_enum_value = 28; 310 311 // repeated numeric enum comment (This comment is overridden by the field annotation) 312 repeated NumericEnum repeated_enum_annotation = 32 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { 313 title: "Repeated numeric enum title", 314 description: "Repeated numeric enum description." 315 }]; 316 317 // numeric enum comment (This comment is overridden by the field annotation) 318 NumericEnum enum_value_annotation = 33 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { 319 title: "Numeric enum title", 320 description: "Numeric enum description." 321 }]; 322 323 // repeated string comment (This comment is overridden by the field annotation) 324 repeated string repeated_string_annotation = 34 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { 325 title: "Repeated string title", 326 description: "Repeated string description." 327 }]; 328 329 // repeated nested object comment (This comment is overridden by the field annotation) 330 repeated Nested repeated_nested_annotation = 35 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { 331 title: "Repeated nested object title", 332 description: "Repeated nested object description." 333 }]; 334 335 // nested object comments (This comment is overridden by the field annotation) 336 Nested nested_annotation = 36 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { 337 title: "Nested object title", 338 description: "Nested object description." 339 }]; 340 341 int64 int64_override_type = 37 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {type: INTEGER}]; 342 343 // mark a field as required in Open API definition 344 string required_string_via_field_behavior_annotation = 38 [(google.api.field_behavior) = REQUIRED]; 345 346 // mark a field as readonly in Open API definition 347 string output_only_string_via_field_behavior_annotation = 39 [(google.api.field_behavior) = OUTPUT_ONLY]; 348 349 optional string optional_string_value = 40; 350 351 // Test openapiv2 generation of repeated fields 352 repeated string product_id = 41 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { 353 pattern: "^[0-9]+$" 354 max_length: 19 355 min_length: 1 356 description: "Only digits are allowed." 357 }]; 358 359 // Test openapiv2 generation of required fields with annotation and jsonschema to reproduce 360 string optional_string_field = 42; 361 string required_string_field_1 = 43 [(google.api.field_behavior) = REQUIRED]; 362 string required_string_field_2 = 44 [(google.api.field_behavior) = REQUIRED]; 363 364 // Test openapiv2 handling of required json_name fields 365 string required_field_behavior_json_name = 45 [ 366 json_name = "required_field_behavior_json_name_custom", 367 (google.api.field_behavior) = REQUIRED 368 ]; 369 string required_field_schema_json_name = 46 [json_name = "required_field_schema_json_name_custom"]; 370 371 string trailing_only = 47; // Trailing only 372 string trailing_only_dot = 48; // Trailing only dot. 373 // Leading both 374 string trailing_both = 49; // Trailing both. 375 // Leading multiline 376 // 377 // This is an example of a multi-line comment. 378 string trailing_multiline = 50; // Trailing multiline. 379 380 // Specify a custom format of repeated field items 381 repeated string uuids = 51 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {format: "uuid"}]; 382 } 383 384 // ABitOfEverythingRepeated is used to validate repeated path parameter functionality 385 message ABitOfEverythingRepeated { 386 option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {example: "{\"path_repeated_bool_value\": [true, true, false, true], \"path_repeated_int32_value\": [1, 2, 3]}"}; 387 388 // repeated values. they are comma-separated in path 389 repeated float path_repeated_float_value = 1; 390 repeated double path_repeated_double_value = 2; 391 repeated int64 path_repeated_int64_value = 3; 392 repeated uint64 path_repeated_uint64_value = 4; 393 repeated int32 path_repeated_int32_value = 5; 394 repeated fixed64 path_repeated_fixed64_value = 6; 395 repeated fixed32 path_repeated_fixed32_value = 7; 396 repeated bool path_repeated_bool_value = 8; 397 repeated string path_repeated_string_value = 9; 398 repeated bytes path_repeated_bytes_value = 10; 399 repeated uint32 path_repeated_uint32_value = 11; 400 repeated NumericEnum path_repeated_enum_value = 12; 401 repeated sfixed32 path_repeated_sfixed32_value = 13; 402 repeated sfixed64 path_repeated_sfixed64_value = 14; 403 repeated sint32 path_repeated_sint32_value = 15; 404 repeated sint64 path_repeated_sint64_value = 16; 405 } 406 407 message CheckStatusResponse { 408 google.rpc.Status status = 1; 409 } 410 411 message Body { 412 string name = 1; 413 } 414 415 message MessageWithBody { 416 string id = 1; 417 Body data = 2; 418 } 419 420 // NumericEnum is one or zero. 421 enum NumericEnum { 422 // ZERO means 0 423 ZERO = 0; 424 // ONE means 1 425 ONE = 1; 426 } 427 428 // UpdateV2Request request for update includes the message and the update mask 429 message UpdateV2Request { 430 ABitOfEverything abe = 1; 431 // The paths to update. 432 google.protobuf.FieldMask update_mask = 2; 433 } 434 435 // An example resource type from AIP-123 used to test the behavior described in 436 // the CreateBookRequest message. 437 // 438 // See: https://google.aip.dev/123 439 message Book { 440 // The resource name of the book. 441 // 442 // Format: `publishers/{publisher}/books/{book}` 443 // 444 // Example: `publishers/1257894000000000000/books/my-book` 445 string name = 1; 446 447 // Output only. The book's ID. 448 string id = 2; 449 450 // Output only. Creation time of the book. 451 google.protobuf.Timestamp create_time = 3; 452 } 453 454 // A standard Create message from AIP-133 with a user-specified ID. 455 // The user-specified ID (the `book_id` field in this example) must become a 456 // query parameter in the OpenAPI spec. 457 // 458 // See: https://google.aip.dev/133#user-specified-ids 459 message CreateBookRequest { 460 // The publisher in which to create the book. 461 // 462 // Format: `publishers/{publisher}` 463 // 464 // Example: `publishers/1257894000000000000` 465 string parent = 1; 466 467 // The book to create. 468 Book book = 2; 469 470 // The ID to use for the book. 471 // 472 // This must start with an alphanumeric character. 473 string book_id = 3; 474 } 475 476 // A standard Update message from AIP-134 477 // 478 // See: https://google.aip.dev/134#request-message 479 message UpdateBookRequest { 480 // The book to update. 481 // 482 // The book's `name` field is used to identify the book to be updated. 483 // Format: publishers/{publisher}/books/{book} 484 Book book = 1 [(google.api.field_behavior) = REQUIRED]; 485 486 // The list of fields to be updated. 487 google.protobuf.FieldMask update_mask = 2; 488 489 // If set to true, and the book is not found, a new book will be created. 490 // In this situation, `update_mask` is ignored. 491 bool allow_missing = 3; 492 } 493 494 // ABitOfEverything service is used to validate that APIs with complicated 495 // proto messages and URL templates are still processed correctly. 496 service ABitOfEverythingService { 497 option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag) = { 498 name: "ABitOfEverything" 499 description: "ABitOfEverythingService description -- which should not be used in place of the documentation comment!" 500 external_docs: { 501 url: "https://github.com/grpc-ecosystem/grpc-gateway"; 502 description: "Find out more about EchoService"; 503 } 504 }; 505 506 // Create a new ABitOfEverything 507 // 508 // This API creates a new ABitOfEverything 509 rpc Create(ABitOfEverything) returns (ABitOfEverything) { 510 option (google.api.http) = {post: "/v1/example/a_bit_of_everything/{float_value}/{double_value}/{int64_value}/separator/{uint64_value}/{int32_value}/{fixed64_value}/{fixed32_value}/{bool_value}/{string_value=strprefix/*}/{uint32_value}/{sfixed32_value}/{sfixed64_value}/{sint32_value}/{sint64_value}/{nonConventionalNameValue}/{enum_value}/{path_enum_value}/{nested_path_enum_value}/{enum_value_annotation}"}; 511 } 512 rpc CreateBody(ABitOfEverything) returns (ABitOfEverything) { 513 option (google.api.http) = { 514 post: "/v1/example/a_bit_of_everything" 515 body: "*" 516 }; 517 } 518 // Create a book. 519 rpc CreateBook(CreateBookRequest) returns (Book) { 520 option (google.api.http) = { 521 post: "/v1/{parent=publishers/*}/books" 522 body: "book" 523 }; 524 } 525 rpc UpdateBook(UpdateBookRequest) returns (Book) { 526 option (google.api.http) = { 527 patch: "/v1/{book.name=publishers/*/books/*}" 528 body: "book" 529 }; 530 } 531 rpc Lookup(grpc.gateway.examples.internal.proto.sub2.IdMessage) returns (ABitOfEverything) { 532 option (google.api.http) = {get: "/v1/example/a_bit_of_everything/{uuid}"}; 533 } 534 rpc Custom(ABitOfEverything) returns (ABitOfEverything) { 535 option (google.api.http) = {post: "/v1/example/a_bit_of_everything/{uuid}:custom"}; 536 } 537 rpc DoubleColon(ABitOfEverything) returns (ABitOfEverything) { 538 option (google.api.http) = {post: "/v1/example/a_bit_of_everything/{uuid}:custom:custom"}; 539 } 540 rpc Update(ABitOfEverything) returns (google.protobuf.Empty) { 541 option (google.api.http) = { 542 put: "/v1/example/a_bit_of_everything/{uuid}" 543 body: "*" 544 }; 545 } 546 rpc UpdateV2(UpdateV2Request) returns (google.protobuf.Empty) { 547 option (google.api.http) = { 548 put: "/v2/example/a_bit_of_everything/{abe.uuid}" 549 body: "abe" 550 additional_bindings: [ 551 { 552 patch: "/v2/example/a_bit_of_everything/{abe.uuid}" 553 body: "abe" 554 }, 555 { 556 patch: "/v2a/example/a_bit_of_everything/{abe.uuid}" 557 body: "*" 558 } 559 ] 560 }; 561 } 562 563 rpc Delete(grpc.gateway.examples.internal.proto.sub2.IdMessage) returns (google.protobuf.Empty) { 564 option (google.api.http) = {delete: "/v1/example/a_bit_of_everything/{uuid}"}; 565 option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { 566 security: { 567 security_requirement: { 568 key: "ApiKeyAuth"; 569 value: {} 570 } 571 security_requirement: { 572 key: "OAuth2"; 573 value: { 574 scope: "read"; 575 scope: "write"; 576 } 577 } 578 } 579 extensions: { 580 key: "x-irreversible"; 581 value {bool_value: true} 582 } 583 }; 584 } 585 rpc GetQuery(ABitOfEverything) returns (google.protobuf.Empty) { 586 option (google.api.http) = {get: "/v1/example/a_bit_of_everything/query/{uuid}"}; 587 option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { 588 deprecated: true // For testing purposes. 589 external_docs: { 590 url: "https://github.com/grpc-ecosystem/grpc-gateway"; 591 description: "Find out more about GetQuery"; 592 } 593 security: {} 594 }; 595 } 596 rpc GetRepeatedQuery(ABitOfEverythingRepeated) returns (ABitOfEverythingRepeated) { 597 option (google.api.http) = {get: "/v1/example/a_bit_of_everything_repeated/{path_repeated_float_value}/{path_repeated_double_value}/{path_repeated_int64_value}/{path_repeated_uint64_value}/{path_repeated_int32_value}/{path_repeated_fixed64_value}/{path_repeated_fixed32_value}/{path_repeated_bool_value}/{path_repeated_string_value}/{path_repeated_bytes_value}/{path_repeated_uint32_value}/{path_repeated_enum_value}/{path_repeated_sfixed32_value}/{path_repeated_sfixed64_value}/{path_repeated_sint32_value}/{path_repeated_sint64_value}"}; 598 } 599 // Echo allows posting a StringMessage value. 600 // 601 // It also exposes multiple bindings. 602 // 603 // This makes it useful when validating that the OpenAPI v2 API 604 // description exposes documentation correctly on all paths 605 // defined as additional_bindings in the proto. 606 rpc Echo(grpc.gateway.examples.internal.proto.sub.StringMessage) returns (grpc.gateway.examples.internal.proto.sub.StringMessage) { 607 option (google.api.http) = { 608 get: "/v1/example/a_bit_of_everything/echo/{value}" 609 additional_bindings { 610 post: "/v2/example/echo" 611 body: "value" 612 } 613 additional_bindings {get: "/v2/example/echo"} 614 }; 615 option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { 616 description: "Description Echo"; 617 summary: "Summary: Echo rpc"; 618 tags: "echo rpc"; 619 external_docs: { 620 url: "https://github.com/grpc-ecosystem/grpc-gateway"; 621 description: "Find out more Echo"; 622 } 623 responses: { 624 key: "200" 625 value: { 626 examples: { 627 key: "application/json" 628 value: "{\"value\": \"the input value\"}" 629 } 630 } 631 } 632 responses: { 633 key: "503"; 634 value: { 635 description: "Returned when the resource is temporarily unavailable."; 636 extensions: { 637 key: "x-number"; 638 value {number_value: 100} 639 } 640 } 641 } 642 responses: { 643 // Overwrites global definition. 644 key: "404"; 645 value: { 646 description: "Returned when the resource does not exist."; 647 schema: { 648 json_schema: {type: INTEGER} 649 } 650 } 651 } 652 }; 653 } 654 rpc DeepPathEcho(ABitOfEverything) returns (ABitOfEverything) { 655 option (google.api.http) = { 656 post: "/v1/example/deep_path/{single_nested.name}" 657 body: "*" 658 }; 659 } 660 rpc NoBindings(google.protobuf.Duration) returns (google.protobuf.Empty) {} 661 rpc Timeout(google.protobuf.Empty) returns (google.protobuf.Empty) { 662 option (google.api.http) = {get: "/v2/example/timeout"}; 663 } 664 rpc ErrorWithDetails(google.protobuf.Empty) returns (google.protobuf.Empty) { 665 option (google.api.http) = {get: "/v2/example/errorwithdetails"}; 666 } 667 rpc GetMessageWithBody(MessageWithBody) returns (google.protobuf.Empty) { 668 option (google.api.http) = { 669 post: "/v2/example/withbody/{id}", 670 body: "data" 671 }; 672 } 673 rpc PostWithEmptyBody(Body) returns (google.protobuf.Empty) { 674 option (google.api.http) = { 675 post: "/v2/example/postwithemptybody/{name}", 676 body: "*" 677 }; 678 } 679 rpc CheckGetQueryParams(ABitOfEverything) returns (ABitOfEverything) { 680 option (google.api.http) = {get: "/v1/example/a_bit_of_everything/params/get/{single_nested.name}"}; 681 } 682 rpc CheckNestedEnumGetQueryParams(ABitOfEverything) returns (ABitOfEverything) { 683 option (google.api.http) = {get: "/v1/example/a_bit_of_everything/params/get/nested_enum/{single_nested.ok}"}; 684 } 685 rpc CheckPostQueryParams(ABitOfEverything) returns (ABitOfEverything) { 686 option (google.api.http) = { 687 post: "/v1/example/a_bit_of_everything/params/post/{string_value}" 688 body: "single_nested" 689 }; 690 } 691 rpc OverwriteRequestContentType(Body) returns (google.protobuf.Empty) { 692 option (google.api.http) = { 693 post: "/v2/example/overwriterequestcontenttype" 694 body: "*" 695 }; 696 option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {consumes: "application/x-bar-mime"}; 697 } 698 rpc OverwriteResponseContentType(google.protobuf.Empty) returns (google.protobuf.StringValue) { 699 option (google.api.http) = {get: "/v2/example/overwriteresponsecontenttype"}; 700 option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {produces: "application/text"}; 701 } 702 rpc CheckExternalPathEnum(pathenum.MessageWithPathEnum) returns (google.protobuf.Empty) { 703 option (google.api.http) = {get: "/v2/{value}:check"}; 704 } 705 rpc CheckExternalNestedPathEnum(pathenum.MessageWithNestedPathEnum) returns (google.protobuf.Empty) { 706 option (google.api.http) = {get: "/v3/{value}:check"}; 707 } 708 709 rpc CheckStatus(google.protobuf.Empty) returns (CheckStatusResponse) { 710 option (google.api.http) = {get: "/v1/example/checkStatus"}; 711 } 712 713 rpc Exists(ABitOfEverything) returns (google.protobuf.Empty) { 714 option (google.api.http) = { 715 custom: { 716 kind: "HEAD", 717 path: "/v1/example/a_bit_of_everything/{uuid}" 718 } 719 }; 720 } 721 722 rpc CustomOptionsRequest(ABitOfEverything) returns (google.protobuf.Empty) { 723 option (google.api.http) = { 724 custom: { 725 kind: "OPTIONS", 726 path: "/v1/example/a_bit_of_everything/{uuid}" 727 } 728 }; 729 } 730 731 rpc TraceRequest(ABitOfEverything) returns (ABitOfEverything) { 732 option (google.api.http) = { 733 custom: { 734 kind: "TRACE", 735 path: "/v1/example/a_bit_of_everything/{uuid}" 736 } 737 }; 738 } 739 740 rpc PostOneofEnum(grpc.gateway.examples.internal.proto.oneofenum.OneofEnumMessage) returns (google.protobuf.Empty) { 741 option (google.api.http) = { 742 post: "/v1/example/oneofenum" 743 body: "example_enum" 744 }; 745 } 746 747 rpc PostRequiredMessageType(RequiredMessageTypeRequest) returns (google.protobuf.Empty) { 748 option (google.api.http) = { 749 post: "/v1/example/requiredmessagetype" 750 body: "*" 751 }; 752 } 753 } 754 755 // camelCase and lowercase service names are valid but not recommended (use TitleCase instead) 756 service camelCaseServiceName { 757 rpc Empty(google.protobuf.Empty) returns (google.protobuf.Empty) { 758 option (google.api.http) = {get: "/v2/example/empty"}; 759 } 760 } 761 service AnotherServiceWithNoBindings { 762 rpc NoBindings(google.protobuf.Empty) returns (google.protobuf.Empty) {} 763 } 764 765 service SnakeEnumService { 766 rpc SnakeEnum(SnakeEnumRequest) returns (SnakeEnumResponse) { 767 option (google.api.http) = {get: "/v1/example/snake/{who}/{what}/{where}"}; 768 } 769 } 770 771 // Ignoring lint warnings as this enum type exist to validate proper functionality 772 // for projects that don't follow these lint rules. 773 // buf:lint:ignore ENUM_PASCAL_CASE 774 enum snake_case_enum { 775 // buf:lint:ignore ENUM_VALUE_UPPER_SNAKE_CASE 776 value_c = 0; 777 // buf:lint:ignore ENUM_VALUE_UPPER_SNAKE_CASE 778 value_d = 1; 779 } 780 781 // Ignoring lint warnings as this enum type exist to validate proper functionality 782 // for projects that don't follow these lint rules. 783 // buf:lint:ignore ENUM_PASCAL_CASE 784 enum snake_case_0_enum { 785 // buf:lint:ignore ENUM_VALUE_UPPER_SNAKE_CASE 786 value_e = 0; 787 // buf:lint:ignore ENUM_VALUE_UPPER_SNAKE_CASE 788 value_f = 1; 789 } 790 791 message SnakeEnumRequest { 792 snake_case_enum what = 1; 793 snake_case_0_enum who = 2; 794 pathenum.snake_case_for_import where = 3; 795 } 796 797 message SnakeEnumResponse {} 798 799 // Required message type -> OpenAPI 800 // https://github.com/grpc-ecosystem/grpc-gateway/issues/2837 801 message RequiredMessageTypeRequest { 802 string id = 1 [(google.api.field_behavior) = REQUIRED]; 803 Foo foo = 2 [(google.api.field_behavior) = REQUIRED]; 804 } 805 806 message Foo { 807 Bar bar = 1 [(google.api.field_behavior) = REQUIRED]; 808 } 809 810 message Bar { 811 string id = 1 [(google.api.field_behavior) = REQUIRED]; 812 }