HttpRule

Struct HttpRule 

Source
pub struct HttpRule {
    pub selector: String,
    pub body: String,
    pub additional_bindings: Vec<HttpRule>,
    pub pattern: Option<Pattern>,
}
Expand description

HttpRule defines the mapping of an RPC method to one or more HTTP REST APIs. The mapping determines what portions of the request message are populated from the path, query parameters, or body of the HTTP request. The mapping is typically specified as an google.api.http annotation, see “google/api/annotations.proto” for details.

The mapping consists of a field specifying the path template and method kind. The path template can refer to fields in the request message, as in the example below which describes a REST GET operation on a resource collection of messages:

 service Messaging {
   rpc GetMessage(GetMessageRequest) returns (Message) {
     option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}";
   }
 }
 message GetMessageRequest {
   message SubMessage {
     string subfield = 1;
   }
   string message_id = 1; // mapped to the URL
   SubMessage sub = 2;    // `sub.subfield` is url-mapped
 }
 message Message {
   string text = 1; // content of the resource
 }

The same http annotation can alternatively be expressed inside the GRPC API Configuration YAML file.

 http:
   rules:
     - selector: <proto_package_name>.Messaging.GetMessage
       get: /v1/messages/{message_id}/{sub.subfield}

This definition enables an automatic, bidrectional mapping of HTTP JSON to RPC. Example:

HTTPRPC
GET /v1/messages/123456/fooGetMessage(message_id: "123456" sub: SubMessage(subfield: "foo"))

In general, not only fields but also field paths can be referenced from a path pattern. Fields mapped to the path pattern cannot be repeated and must have a primitive (non-message) type.

Any fields in the request message which are not bound by the path pattern automatically become (optional) HTTP query parameters. Assume the following definition of the request message:

 message GetMessageRequest {
   message SubMessage {
     string subfield = 1;
   }
   string message_id = 1; // mapped to the URL
   int64 revision = 2;    // becomes a parameter
   SubMessage sub = 3;    // `sub.subfield` becomes a parameter
 }

This enables a HTTP JSON to RPC mapping as below:

HTTPRPC
GET /v1/messages/123456?revision=2&sub.subfield=fooGetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: "foo"))

Note that fields which are mapped to HTTP parameters must have a primitive type or a repeated primitive type. Message types are not allowed. In the case of a repeated type, the parameter can be repeated in the URL, as in ...?param=A&param=B.

For HTTP method kinds which allow a request body, the body field specifies the mapping. Consider a REST update method on the message resource collection:

 service Messaging {
   rpc UpdateMessage(UpdateMessageRequest) returns (Message) {
     option (google.api.http) = {
       put: "/v1/messages/{message_id}"
       body: "message"
     };
   }
 }
 message UpdateMessageRequest {
   string message_id = 1; // mapped to the URL
   Message message = 2;   // mapped to the body
 }

The following HTTP JSON to RPC mapping is enabled, where the representation of the JSON in the request body is determined by protos JSON encoding:

HTTPRPC
PUT /v1/messages/123456 { "text": "Hi!" }UpdateMessage(message_id: "123456" message { text: "Hi!" })

The special name * can be used in the body mapping to define that every field not bound by the path template should be mapped to the request body. This enables the following alternative definition of the update method:

 service Messaging {
   rpc UpdateMessage(Message) returns (Message) {
     option (google.api.http) = {
       put: "/v1/messages/{message_id}"
       body: "*"
     };
   }
 }
 message Message {
   string message_id = 1;
   string text = 2;
 }

The following HTTP JSON to RPC mapping is enabled:

HTTPRPC
PUT /v1/messages/123456 { "text": "Hi!" }UpdateMessage(message_id: "123456" text: "Hi!")

Note that when using * in the body mapping, it is not possible to have HTTP parameters, as all fields not bound by the path end in the body. This makes this option more rarely used in practice of defining REST APIs. The common usage of * is in custom methods which don’t use the URL at all for transferring data.

It is possible to define multiple HTTP methods for one RPC by using the additional_bindings option. Example:

 service Messaging {
   rpc GetMessage(GetMessageRequest) returns (Message) {
     option (google.api.http) = {
       get: "/v1/messages/{message_id}"
       additional_bindings {
         get: "/v1/users/{user_id}/messages/{message_id}"
       }
     };
   }
 }
 message GetMessageRequest {
   string message_id = 1;
   string user_id = 2;
 }

This enables the following two alternative HTTP JSON to RPC mappings:

HTTPRPC
GET /v1/messages/123456GetMessage(message_id: "123456")
GET /v1/users/me/messages/123456GetMessage(user_id: "me" message_id: "123456")

§Rules for HTTP mapping

The rules for mapping HTTP path, query parameters, and body fields to the request message are as follows:

  1. The body field specifies either * or a field path, or is omitted. If omitted, it assumes there is no HTTP body.
  2. Leaf fields (recursive expansion of nested messages in the request) can be classified into three types: (a) Matched in the URL template. (b) Covered by body (if body is *, everything except (a) fields; else everything under the body field) (c) All other fields.
  3. URL query parameters found in the HTTP request are mapped to (c) fields.
  4. Any body sent with an HTTP request can contain only (b) fields.

The syntax of the path template is as follows:

 Template = "/" Segments [ Verb ] ;
 Segments = Segment { "/" Segment } ;
 Segment  = "*" | "**" | LITERAL | Variable ;
 Variable = "{" FieldPath [ "=" Segments ] "}" ;
 FieldPath = IDENT { "." IDENT } ;
 Verb     = ":" LITERAL ;

The syntax * matches a single path segment. It follows the semantics of RFC 6570 Section 3.2.2 Simple String Expansion.

The syntax ** matches zero or more path segments. It follows the semantics of RFC 6570 Section 3.2.3 Reserved Expansion. NOTE: it must be the last segment in the path except the Verb.

The syntax LITERAL matches literal text in the URL path.

The syntax Variable matches the entire path as specified by its template; this nested template must not contain further variables. If a variable matches a single path segment, its template may be omitted, e.g. {var} is equivalent to {var=*}.

NOTE: the field paths in variables and in the body must not refer to repeated fields or map fields.

Use CustomHttpPattern to specify any HTTP method that is not included in the pattern field, such as HEAD, or “*” to leave the HTTP method unspecified for a given URL path rule. The wild-card rule is useful for services that provide content to Web (HTML) clients.

Fields§

§selector: String

Selects methods to which this rule applies.

Refer to [selector][google.api.DocumentationRule.selector] for syntax details.

§body: String

The name of the request field whose value is mapped to the HTTP body, or * for mapping all fields not captured by the path pattern to the HTTP body. NOTE: the referred field must not be a repeated field and must be present at the top-level of request message type.

§additional_bindings: Vec<HttpRule>

Additional HTTP bindings for the selector. Nested bindings must not contain an additional_bindings field themselves (that is, the nesting may only be one level deep).

§pattern: Option<Pattern>

Determines the URL pattern is matched by this rules. This pattern can be used with any of the {get|put|post|delete|patch} methods. A custom method can be defined using the ‘custom’ field.

Trait Implementations§

Source§

impl Clone for HttpRule

Source§

fn clone(&self) -> HttpRule

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for HttpRule

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for HttpRule

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Message for HttpRule

Source§

fn encoded_len(&self) -> usize

Returns the encoded length of the message without a length delimiter.
Source§

fn clear(&mut self)

Clears the message, resetting all fields to their default.
Source§

fn encode<B>(&self, buf: &mut B) -> Result<(), EncodeError>
where B: BufMut, Self: Sized,

Encodes the message to a buffer. Read more
Source§

fn encode_to_vec(&self) -> Vec<u8>
where Self: Sized,

Encodes the message to a newly allocated buffer.
Source§

fn encode_length_delimited<B>(&self, buf: &mut B) -> Result<(), EncodeError>
where B: BufMut, Self: Sized,

Encodes the message with a length-delimiter to a buffer. Read more
Source§

fn encode_length_delimited_to_vec(&self) -> Vec<u8>
where Self: Sized,

Encodes the message with a length-delimiter to a newly allocated buffer.
Source§

fn decode<B>(buf: B) -> Result<Self, DecodeError>
where B: Buf, Self: Default,

Decodes an instance of the message from a buffer. Read more
Source§

fn decode_length_delimited<B>(buf: B) -> Result<Self, DecodeError>
where B: Buf, Self: Default,

Decodes a length-delimited instance of the message from the buffer.
Source§

fn merge<B>(&mut self, buf: B) -> Result<(), DecodeError>
where B: Buf, Self: Sized,

Decodes an instance of the message from a buffer, and merges it into self. Read more
Source§

fn merge_length_delimited<B>(&mut self, buf: B) -> Result<(), DecodeError>
where B: Buf, Self: Sized,

Decodes a length-delimited instance of the message from buffer, and merges it into self.
Source§

impl PartialEq for HttpRule

Source§

fn eq(&self, other: &HttpRule) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for HttpRule

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more