• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..03-May-2022-

.bazelci/H28-Oct-2020-

.circleci/H28-Oct-2020-

.devcontainer/H28-Oct-2020-

.github/H28-Oct-2020-

bin/H28-Oct-2020-

codegenerator/H28-Oct-2020-

docs/H28-Oct-2020-

examples/internal/H28-Oct-2020-

internal/H28-Oct-2020-

protoc-gen-grpc-gateway/H28-Oct-2020-

protoc-gen-swagger/H28-Oct-2020-

runtime/H28-Oct-2020-

third_party/googleapis/H28-Oct-2020-

utilities/H28-Oct-2020-

.bazelversionH A D28-Oct-20206

.gitignoreH A D28-Oct-2020171

.goreleaser.ymlH A D28-Oct-2020590

ADOPTERS.mdH A D28-Oct-2020978

BUILDH A D28-Oct-2020535

CHANGELOG.mdH A D28-Oct-202074.5 KiB

CONTRIBUTING.mdH A D28-Oct-20203.9 KiB

MakefileH A D28-Oct-202015.3 KiB

README.mdH A D28-Oct-202015.7 KiB

WORKSPACEH A D28-Oct-20203.1 KiB

fuzzit.shH A D28-Oct-2020739

go.modH A D28-Oct-2020588

go.sumH A D28-Oct-20208.7 KiB

renovate.jsonH A D28-Oct-20201.1 KiB

repositories.bzlH A D28-Oct-20207.4 KiB

README.md

1# grpc-gateway
2
3[![release](https://img.shields.io/github/release/grpc-ecosystem/grpc-gateway.svg?style=flat-square)](https://github.com/grpc-ecosystem/grpc-gateway/releases)
4[![CircleCI](https://img.shields.io/circleci/project/github/grpc-ecosystem/grpc-gateway/master.svg?style=flat-square)](https://circleci.com/gh/grpc-ecosystem/grpc-gateway)
5[![coverage](https://img.shields.io/codecov/c/github/grpc-ecosystem/grpc-gateway/master.svg?style=flat-square)](https://codecov.io/gh/grpc-ecosystem/grpc-gateway)
6[![license](https://img.shields.io/github/license/grpc-ecosystem/grpc-gateway.svg?style=flat-square)](LICENSE.txt)
7[![Slack](https://img.shields.io/badge/slack-%23grpc--gateway-brightgreen?style=flat-square)](https://join.slack.com/t/gophers/shared_invite/zt-gmw97q11-1OWgj2Dqsc13eqoSPwvNDQ)
8
9The grpc-gateway is a plugin of the Google protocol buffers compiler
10[protoc](https://github.com/protocolbuffers/protobuf).
11It reads protobuf service definitions and generates a reverse-proxy server which
12translates a RESTful HTTP API into gRPC. This server is generated according to the
13[`google.api.http`](https://github.com/googleapis/googleapis/blob/master/google/api/http.proto#L46)
14annotations in your service definitions.
15
16This helps you provide your APIs in both gRPC and RESTful style at the same time.
17
18![architecture introduction diagram](https://docs.google.com/drawings/d/12hp4CPqrNPFhattL_cIoJptFvlAqm5wLQ0ggqI5mkCg/pub?w=749&h=370)
19
20## Testimonials
21
22 > We use the gRPC-Gateway to serve millions of API requests per day,
23   and have been since 2018, and through all of that,
24   we have never had any issues with it.
25>
26> _- William Mill, [Ad Hoc](http://adhocteam.us/)_
27
28## Check out our [documentation](https://grpc-ecosystem.github.io/grpc-gateway/)!
29
30## Background
31gRPC is great -- it generates API clients and server stubs in many programming
32languages, it is fast, easy-to-use, bandwidth-efficient and its design is
33combat-proven by Google. However, you might still want to provide a traditional
34RESTful JSON API as well. Reasons can range from maintaining
35backward-compatibility, supporting languages or clients that are not well supported by
36gRPC, to simply maintaining the aesthetics and tooling involved with a RESTful
37JSON architecture.
38
39This project aims to provide that HTTP+JSON interface to your gRPC service.
40A small amount of configuration in your service to attach HTTP semantics is all
41that's needed to generate a reverse-proxy with this library.
42
43## Installation
44
45The grpc-gateway requires a local installation of the Google protocol buffers
46compiler `protoc` v3.0.0 or above. Please install this via your local package
47manager or by downloading one of the releases from the official repository:
48
49https://github.com/protocolbuffers/protobuf/releases
50
51The following instructions assume you are using
52[Go Modules](https://github.com/golang/go/wiki/Modules) for dependency
53management. Use a
54[tool dependency](https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module)
55to track the versions of the following executable packages:
56
57```go
58// +build tools
59
60package tools
61
62import (
63    _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway"
64    _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger"
65    _ "github.com/golang/protobuf/protoc-gen-go"
66)
67```
68
69Run `go mod tidy` to resolve the versions. Install by running
70
71```sh
72$ go install \
73    github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway \
74    github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger \
75    github.com/golang/protobuf/protoc-gen-go
76```
77
78This will place three binaries in your `$GOBIN`;
79
80* `protoc-gen-grpc-gateway`
81* `protoc-gen-swagger`
82* `protoc-gen-go`
83
84Make sure that your `$GOBIN` is in your `$PATH`.
85
86## Usage
87
881. Define your [gRPC](https://grpc.io/docs/) service using protocol buffers
89
90   `your_service.proto`:
91   ```protobuf
92   syntax = "proto3";
93   package example;
94   message StringMessage {
95     string value = 1;
96   }
97
98   service YourService {
99     rpc Echo(StringMessage) returns (StringMessage) {}
100   }
101   ```
102
1032. Generate gRPC stubs
104
105    This step generates the gRPC stubs that you can use to implement the service and consume from clients:
106
107    Here's an example of what a `protoc` command might look like to generate Go stubs:
108
109    ```sh
110    protoc -I . --go_out ./gen/go/ --go_opt plugins=grpc --go_opt paths=source_relative your/service/v1/your_service.proto
111    ```
112
1133. Implement your service in gRPC as usual
114
115   1. (Optional) Generate gRPC stub in the [other programming languages](https://grpc.io/docs/).
116
117     For example, the following generates gRPC code for Ruby based on `your/service/v1/your_service.proto`:
118     ```sh
119     protoc -I . --ruby_out ./gen/ruby your/service/v1/your_service.proto
120
121     protoc -I . --grpc-ruby_out ./gen/ruby your/service/v1/your_service.proto
122     ```
123   2. Add the googleapis-common-protos gem (or your language equivalent) as a dependency to your project.
124   3. Implement your gRPC service stubs
125
1264. Generate reverse-proxy using `protoc-gen-grpc-gateway`
127
128    At this point, you have 3 options:
129
130    * no further modifications, use the default mapping to HTTP semantics (method, path, etc.)
131        * this will work on any `.proto` file, but will not allow setting HTTP paths, request parameters or similar
132    * additional `.proto` modifications to use a custom mapping
133        * relies on parameters in the `.proto` file to set custom HTTP mappings
134    * no `.proto` modifications, but use an external configuration file
135        * relies on an external configuration file to set custom HTTP mappings
136        * mostly useful when the source proto file isn't under your control
137
138    1. Using the default mapping
139
140    This requires no additional modification to the `.proto` file, but does require enabling a specific option when executing the plugin.
141    The `generate_unbound_methods` should be enabled.
142
143    Here's what a `protoc` execution might look like with this option enabled:
144
145    ```sh
146       protoc -I . --grpc-gateway_out ./gen/go \
147         --grpc-gateway_opt logtostderr=true \
148         --grpc-gateway_opt paths=source_relative \
149         --grpc-gateway_opt generate_unbound_methods=true \
150         your/service/v1/your_service.proto
151    ```
152
153    2. With custom annotations
154
155    Add a [`google.api.http`](https://github.com/googleapis/googleapis/blob/master/google/api/http.proto#L46)
156    annotation to your .proto file
157
158   `your_service.proto`:
159   ```diff
160    syntax = "proto3";
161    package example;
162   +
163   +import "google/api/annotations.proto";
164   +
165    message StringMessage {
166      string value = 1;
167    }
168
169    service YourService {
170   -  rpc Echo(StringMessage) returns (StringMessage) {}
171   +  rpc Echo(StringMessage) returns (StringMessage) {
172   +    option (google.api.http) = {
173   +      post: "/v1/example/echo"
174   +      body: "*"
175   +    };
176   +  }
177    }
178   ```
179
180   >You will need to provide the required third party protobuf files to the `protoc` compiler.
181   >They are included in this repo under the `third_party/googleapis` folder, and we recommend copying
182   >them into your `protoc` generation file structure. If you've structured your proto files according
183   >to something like [the Buf style guide](https://buf.build/docs/style-guide#files-and-packages),
184   >you could copy the files into a top-level `./google` folder.
185
186   See [a_bit_of_everything.proto](examples/internal/proto/examplepb/a_bit_of_everything.proto)
187   for examples of more annotations you can add to customize gateway behavior
188   and generated Swagger output.
189
190   Here's what a `protoc` execution might look like:
191
192    ```sh
193       protoc -I . --grpc-gateway_out ./gen/go \
194         --grpc-gateway_opt logtostderr=true \
195         --grpc-gateway_opt paths=source_relative \
196         your/service/v1/your_service.proto
197    ```
198
199    3. External configuration
200   If you do not want to (or cannot) modify the proto file for use with grpc-gateway you can
201   alternatively use an external
202   [gRPC Service Configuration](https://cloud.google.com/endpoints/docs/grpc/grpc-service-config) file.
203   [Check our documentation](https://grpc-ecosystem.github.io/grpc-gateway/docs/grpcapiconfiguration.html)
204   for more information.
205
206   Here's what a `protoc` execution might look like with this option enabled:
207
208    ```sh
209       protoc -I . --grpc-gateway_out ./gen/go \
210         --grpc-gateway_opt logtostderr=true \
211         --grpc-gateway_opt paths=source_relative \
212         --grpc-gateway_opt grpc_api_configuration=path/to/config.yaml \
213         your/service/v1/your_service.proto
214    ```
215
2165. Write an entrypoint for the HTTP reverse-proxy server
217
218   ```go
219   package main
220
221   import (
222     "context"
223     "flag"
224     "net/http"
225
226     "github.com/golang/glog"
227     "github.com/grpc-ecosystem/grpc-gateway/runtime"
228     "google.golang.org/grpc"
229
230     gw "github.com/yourorg/yourrepo/proto/gen/go/your/service/v1/your_service"  // Update
231   )
232
233   var (
234     // command-line options:
235     // gRPC server endpoint
236     grpcServerEndpoint = flag.String("grpc-server-endpoint",  "localhost:9090", "gRPC server endpoint")
237   )
238
239   func run() error {
240     ctx := context.Background()
241     ctx, cancel := context.WithCancel(ctx)
242     defer cancel()
243
244     // Register gRPC server endpoint
245     // Note: Make sure the gRPC server is running properly and accessible
246     mux := runtime.NewServeMux()
247     opts := []grpc.DialOption{grpc.WithInsecure()}
248     err := gw.RegisterYourServiceHandlerFromEndpoint(ctx, mux,  *grpcServerEndpoint, opts)
249     if err != nil {
250       return err
251     }
252
253     // Start HTTP server (and proxy calls to gRPC server endpoint)
254     return http.ListenAndServe(":8081", mux)
255   }
256
257   func main() {
258     flag.Parse()
259     defer glog.Flush()
260
261     if err := run(); err != nil {
262       glog.Fatal(err)
263     }
264   }
265   ```
266
2676. (Optional) Generate swagger definitions using `protoc-gen-swagger`
268
269   ```sh
270   protoc -I . --swagger_out ./gen/swagger --swagger_opt logtostderr=true your/service/v1/your_service.proto
271   ```
272
273   Note that this plugin also supports generating swagger definitions for unannotated methods; use the `generate_unbound_methods` option to enable this.
274
275## Video intro
276
277This GopherCon UK 2019 presentation from our maintainer
278[@JohanBrandhorst](https://github.com/johanbrandhorst) provides a good intro to
279using the grpc-gateway. It uses the following boilerplate repo as a base:
280https://github.com/johanbrandhorst/grpc-gateway-boilerplate.
281
282[![gRPC-Gateway presentation](https://img.youtube.com/vi/Pq1paKC-fXk/0.jpg)](https://www.youtube.com/watch?v=Pq1paKC-fXk)
283
284## Parameters and flags
285
286During code generation with `protoc`, flags to grpc-gateway tools must be passed
287through protoc using one of 2 patterns:
288
289* as part of the `--<tool_suffix>_out` `protoc` parameter: `--<tool_suffix>_out=<flags>:<path>`
290
291```sh
292--grpc-gateway_out=logtostderr=true,repeated_path_param_separator=ssv:.
293--swagger_out=logtostderr=true,repeated_path_param_separator=ssv:.
294```
295
296* using additional `--<tool_suffix>_opt` parameters: `--<tool_suffix>_opt=<flag>[,<flag>]*`
297
298```sh
299--grpc-gateway_opt logtostderr=true,repeated_path_param_separator=ssv
300# or separately
301--grpc-gateway_opt logtostderr=true --grpc-gateway_opt repeated_path_param_separator=ssv
302
303--swagger_opt logtostderr=true,repeated_path_param_separator=ssv
304# or separately
305--swagger_opt logtostderr=true --swagger_opt repeated_path_param_separator=ssv
306```
307
308`protoc-gen-grpc-gateway` supports custom mapping from Protobuf `import` to
309Golang import paths. They are compatible with
310[the parameters with the same names in `protoc-gen-go`](https://github.com/golang/protobuf#parameters).
311
312In addition we also support the `request_context` parameter in order to use the
313`http.Request`'s Context (only for Go 1.7 and above). This parameter can be
314useful to pass the request-scoped context between the gateway and the gRPC service.
315
316`protoc-gen-grpc-gateway` also supports some more command line flags to control
317logging. You can give these flags together with parameters above. Run
318`protoc-gen-grpc-gateway --help` for more details about the flags.
319
320Similarly, `protoc-gen-swagger` supports command-line flags to control Swagger
321output (for example, `json_names_for_fields` to output JSON names for fields
322instead of protobuf names). Run `protoc-gen-swagger --help` for more flag
323details. Further Swagger customization is possible by annotating your `.proto`
324files with options from
325[openapiv2.proto](protoc-gen-swagger/options/openapiv2.proto) - see
326[a_bit_of_everything.proto](examples/internal/proto/examplepb/a_bit_of_everything.proto)
327for examples.
328
329## More Examples
330More examples are available under `examples` directory.
331* `proto/examplepb/echo_service.proto`, `proto/examplepb/a_bit_of_everything.proto`, `proto/examplepb/unannotated_echo_service.proto`: service definition
332  * `proto/examplepb/echo_service.pb.go`, `proto/examplepb/a_bit_of_everything.pb.go`, `proto/examplepb/unannotated_echo_service.pb.go`: [generated] stub of the service
333  * `proto/examplepb/echo_service.pb.gw.go`, `proto/examplepb/a_bit_of_everything.pb.gw.go`, `proto/examplepb/uannotated_echo_service.pb.gw.go`: [generated] reverse proxy for the service
334  * `proto/examplepb/unannotated_echo_service.yaml`: gRPC API Configuration for ```unannotated_echo_service.proto```
335* `server/main.go`: service implementation
336* `main.go`: entrypoint of the generated reverse proxy
337
338To use the same port for custom HTTP handlers (e.g. serving `swagger.json`),
339gRPC-gateway, and a gRPC server, see
340[this example by CoreOS](https://github.com/philips/grpc-gateway-example/blob/master/cmd/serve.go)
341(and its accompanying [blog post](https://coreos.com/blog/grpc-protobufs-swagger.html)).
342
343## Features
344
345### Supported
346
347* Generating JSON API handlers.
348* Method parameters in the request body.
349* Method parameters in the request path.
350* Method parameters in query string.
351* Enum fields in the path parameter (including repeated enum fields).
352* Mapping streaming APIs to newline-delimited JSON streams.
353* Mapping HTTP headers with `Grpc-Metadata-` prefix to gRPC metadata (prefixed with `grpcgateway-`)
354* Optionally emitting API definitions for
355[OpenAPI (Swagger) v2](https://swagger.io/docs/specification/2-0/basic-structure/).
356* Setting [gRPC timeouts](https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests)
357through inbound HTTP `Grpc-Timeout` header.
358* Partial support for [gRPC API Configuration](https://cloud.google.com/endpoints/docs/grpc/grpc-service-config)
359files as an alternative to annotation.
360* Automatically translating PATCH requests into Field Mask gRPC requests. See
361[the docs](https://grpc-ecosystem.github.io/grpc-gateway/docs/patch.html)
362for more information.
363
364### No plan to support
365But patch is welcome.
366* Method parameters in HTTP headers.
367* Handling trailer metadata.
368* Encoding request/response body in XML.
369* True bi-directional streaming.
370
371# Mapping gRPC to HTTP
372
373* [How gRPC error codes map to HTTP status codes in the response](https://github.com/grpc-ecosystem/grpc-gateway/blob/master/runtime/errors.go#L15).
374* HTTP request source IP is added as `X-Forwarded-For` gRPC request header.
375* HTTP request host is added as `X-Forwarded-Host` gRPC request header.
376* HTTP `Authorization` header is added as `authorization` gRPC request header.
377* Remaining Permanent HTTP header keys (as specified by the IANA
378[here](http://www.iana.org/assignments/message-headers/message-headers.xhtml)
379are prefixed with `grpcgateway-` and added with their values to gRPC request
380header.
381* HTTP headers that start with 'Grpc-Metadata-' are mapped to gRPC metadata
382(prefixed with `grpcgateway-`).
383* While configurable, the default {un,}marshaling uses
384[jsonpb](https://pkg.go.dev/github.com/golang/protobuf/jsonpb) with
385`OrigName: true`.
386
387# Contribution
388See [CONTRIBUTING.md](http://github.com/grpc-ecosystem/grpc-gateway/blob/master/CONTRIBUTING.md).
389
390# License
391grpc-gateway is licensed under the BSD 3-Clause License.
392See [LICENSE.txt](https://github.com/grpc-ecosystem/grpc-gateway/blob/master/LICENSE.txt) for more details.
393