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