Можно ли применять Protobuf Field Mask только для случая с grpc? - PullRequest
0 голосов
/ 27 декабря 2018

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

// 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 Ответ

0 голосов
/ 18 января 2019

В соответствии с протоколом документы :

Маски полей в операциях обновления
Маска поля в операциях обновления указывает, какие поля целевогоресурс будет обновляться.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 и яможет быть полностью неверно истолкован, так что возьмите его с крошкой соли.

...