Можно ли применять Protobuf Field Mask только для случая с grpc?

Давайте возьмем этот пример из официального документа:

// Updates a book.
rpc UpdateBook(UpdateBookRequest) returns (Book) {
  // Update maps to HTTP PATCH. Resource name is mapped to a URL path.
  // Resource is contained in the HTTP request body.
  option (google.api.http) = {
    // Note the URL template variable which captures the resource name of the
    // book to update.
    patch: "/v1/{book.name=shelves/*/books/*}"
    body: "book"
  };
}

message UpdateBookRequest {
  // The book resource which replaces the resource on the server.
  Book book = 1;

  // The update mask applies to the resource. For the `FieldMask` definition,
  // see https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask
  FieldMask update_mask = 2;
}

Если у меня нет шлюза grpc и я использую только grpc, могу ли я использовать маску таким образом:

// Updates a book.
rpc UpdateBook(UpdateBookRequest) returns (Book);

message UpdateBookRequest {
  // The book resource which replaces the resource on the server.
  Book book = 1;

  // The update mask applies to the resource. For the `FieldMask` definition,
  // see https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask
  FieldMask update_mask = 2;
}

Если да, то как должна работать эта маска - фильтрует запрос? или быть примененным во время сохранения БД и как он узнает о БД... Так что я немного запутался в его использовании. В моем собственном примере grpc я вижу, что маска не фильтрует запрос.

1 ответ

Согласно документации по протоколу:

Маски полей в операциях обновления
Маска поля в операциях обновления указывает, какие поля целевого ресурса будут обновляться. API требуется только для изменения значений полей, указанных в маске, и оставления остальных нетронутыми. Если для описания обновленных значений передается ресурс, API игнорирует значения всех полей, не охватываемых маской.

Когда вы применяете маску поля, она указывает, какие именно поля нужно обновить в запросе gRPC. Имейте в виду, что если вы используете его в HTTP-запросе, который, как я понял, является тем, что вы делаете, должен быть запросом PATCH, а не запросом PUT.

Например, скажем, у вас есть объявление с именем Books со свойствами: title как строка, year_published как int32, author как автор. Декларация Author имеет поля first_name как строка и last_name как строка Если бы вы использовали маску поля author.first_name, вы бы только обновить first_name поле author в book,

Пожалуйста, обратите внимание, что это основано на документации по protobufs, и я могу быть совершенно неверно истолкован, поэтому возьмите его с собой.

Другие вопросы по тегам