簡體   English   中英

Protobuf3:使用正則表達式進行字符串驗證

[英]Protobuf3: String validation with regex

我一直在使用Protobuf3來定義PB消息:

syntax = "proto3";
package vioozer_protobuf;

message Update
{
  string sensor_id = 1;
  ...
}

在我的系統中,傳感器具有唯一的id格式(a-la SENSOR-1342r43 ),可以使用正則表達式輕松驗證。

有沒有辦法將一個正則表達式驗證器添加到protobuf字段,以便只有符合正則表達式的字符串才會被接受到該字段中?

Protobuf不支持開箱即用的消息驗證,但可以使用插件添加它(這是唯一的方法,但並不簡單)。

您可以嘗試查找現有插件,也可以創建自己的插件(如果您的語言沒有現有的插件)。

如果您決定編寫自己的插件,那么第一步是為字段定義自定義選項

package yourcompany;

import "google/protobuf/descriptor.proto";

extend google.protobuf.FieldOptions {
    optional string validator = 51234;
}

此選項允許您為具體字段指定正則表達式。 然后,您應用新的自定義選項:

message Update {
    string sensor_id = 1 [(yourcompany.validator) = "SENSOR-???????"];
    // ...
}

其次,更具挑戰性的步驟是編寫自己的插件 ,以便為生成的代碼添加驗證邏輯:

此外,插件能夠將代碼插入其他代碼生成器生成的文件中。 有關詳細信息,請參閱plugin.proto中有關“插入點”的注釋。 例如,這可用於編寫一個插件,該插件生成為特定RPC系統定制的RPC服務代碼。 請參閱每種語言中生成的代碼的文檔,以了解它們提供的插入點。

您的插件必須檢查自定義選項的值,並為字段生成其他驗證代碼。

請檢查此項目protoc-gen-validate https://github.com/envoyproxy/protoc-gen-validate

我在這里為Golang寫了一個例子https://github.com/alexcpn/golang_grpc_test

有了這個,您可以將語義驗證作為proto中的注釋,並將其作為protobuff生成的一部分自動生成

message SearchRequest {
  string query = 1 [(validate.rules).string = {
                      pattern:   "([A-Za-z]+) ([A-Za-z]+)*$",
                      max_bytes: 50,
                   }];
  string email_id= 2 [(validate.rules).string.email = true];
  int32 page_number = 3;  // Which page number do we want?
  int32 result_per_page = 4;  // Number of results to return per page.
}

使用生成存根的服務器驗證

func (s *Server)Search(ctx context.Context, in *pb.SearchRequest) (*pb.SearchResponse, error){
    log.Printf("Received Emailid: %v", in.EmailId)
    log.Printf("Received Query: %v", in.Query)

    // Note this is the only place we use validate
    err := in.Validate()
    if err != nil {
        log.Warn("SearchRequest validation failed: %v", err)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM