HTTP and gRPC Transcoding
APIs that follow [resource-oriented design][resources] are defined using RPCs, but the resource-oriented design framework allows them to also be presented as APIs that largely follow REST/JSON conventions. This is important in order to help developers use their existing knowledge: over 80% of the public APIs available follow most REST conventions, and developers are accustomed to that pattern.
Guidance
Protobuf APIs must provide HTTP definitions for each RPC that they define, except for bi-directional streaming RPCs, which can not be natively supported using HTTP/1.1. When providing a bi-directional streaming method, an API should also offer an alternative method that does not rely on bi-directional streaming.
HTTP method and path
When using protocol buffers, each RPC must define the HTTP method and path
using the google.api.http
annotation:
- The first key (
post
in this example) corresponds to the HTTP method. RPCs may useget
,post
,patch
, ordelete
. - The corresponding value represents the URI.
- URIs must use the
{foo=bar/*}
syntax to represent a variable that should be populated in the request proto. When extracting a resource name, the variable must include the entire resource name, not just the ID component. - URIs may use nested fields for their variable names. (Additionally,
AEP-134 mandates this for
Update
requests.) - URIs must use the
*
character to represent ID components, which matches all URI-safe characters except for/
. URIs may use**
as the final segment of a URI if matching/
is required.
- URIs must use the
- The
body
key defines which single top-level field in the request will be sent as the HTTP body. If the body is*
, then this indicates that the request object itself is the HTTP body. The request body is encoded as JSON as defined by protocol buffers’ canonical JSON encoding.- RPCs must not define a
body
at all for RPCs that use theGET
orDELETE
HTTP verbs. - RPCs must use the prescribed
body
for Create (Create) and Update (AEP-134) requests. - RPCs should use the prescribed
body
for custom methods (Custom Methods). - The
body
must not contain a nested field (or use the.
character), - The
body
must not be the same as a URI parameter. - The
body
must not be arepeated
field. - Fields should not use the
json_name
annotation to alter the field name in JSON, unless doing so for backwards-compatibility reasons.
- RPCs must not define a
Multiple URI bindings
Occasionally, an RPC needs to correspond to more than one URI:
- RPCs may define any number of additional bindings. The structure is
identical to the
google.api.http
annotation (in fact, it is a recursive reference). - RPCs must not define an additional binding within an additional binding.
- The
body
clause must be identical in the top-level annotation and each additional binding.