以下の内容はhttps://uga-box.hatenablog.com/entry/2024/07/19/000000より取得しました。


【gRPC】repeatedのfieldのサブフィールドに対してfieldMaskしたい

以前、gRPCの更新の際に、FieldMaskを使って余計なフィールドを更新しないようにする方法を調べた

uga-box.hatenablog.com

今度は、repeatedのfield、いわゆる配列の要素のサブフィールドに対してfieldMaskしたい場合はどうするか調べた

例えば、次のような repeated User フィールドをリクエストに持つRPCで

message UpdateUsersRequest {
  repeated User user = 1;
  google.protobuf.FieldMask update_mask = 2;
}

Userは以下のフィールドを持っている場合、

{
  "user": {
    "id": "001",
    "name": "uga",
    "email": "uga@gmail.com"
  }
}

emailだけ更新したい場合どうするか

結論、 sever側でリクエストとして受け取ったrepeatedのfieldをループで処理するしかなさそう

...
updateUserReply {
    val updateUserList = request.userList.map {
        val responseUser = User.newBuilder()
            .setId(it.id)
            .setName(it.name)
            .setEmail(it.email).build()
        val userWithMaskedFields = User.newBuilder()
        FieldMaskUtil.merge(
            request.updateMask,
            responseUser,
            userWithMaskedFields )
        userWithMaskedFields.build()
    }
    // 更新処理
    updateUserList.forEach {
        this.user += it
    }
}

ちなみに、ドキュメントを見ると、何やらワイルドカードというものがあるみたいで、最初これ使うのかな?と思ったが違った

google.aip.dev

これは配列の特定のインデックスのサブフィールドに対してマスクしたい時、"authors.0, authors.0.given_name"のようなインデックスを固定した書き方はNGのため、 "authors.*.given_name"のように*を使ってfieldMaskを指定するという話だった




以上の内容はhttps://uga-box.hatenablog.com/entry/2024/07/19/000000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14