protovalidate
es una serie de bibliotecas diseñadas para validar mensajes de Protobuf en tiempo de ejecución según reglas de validación definidas por el usuario. Impulsado por el lenguaje de expresión común (CEL) de Google, proporciona una base flexible y eficiente para definir y evaluar reglas de validación personalizadas. El objetivo principal de protovalidate
es ayudar a los desarrolladores a garantizar la coherencia e integridad de los datos en toda la red sin necesidad de generar código.
Nota
protovalidate
es el sucesor espiritual de protoc-gen-validate. No requiere generación de código y admite restricciones personalizadas.
Recomendamos que los proyectos nuevos y existentes pasen al uso de protovalidate
en lugar de protoc-gen-validate
.
Lea nuestra publicación de blog si desea obtener más información sobre las limitaciones de protoc-gen-validate
y cómo hemos diseñado protovalidate
para que sea mejor.
Este repositorio es el núcleo del proyecto protovalidate
. Contiene:
protovalidate
de manera efectivaprotoc-gen-validate
.proto
de ejemplo usando protovalidate
protovalidate
Las implementaciones en tiempo de ejecución de protovalidate
se pueden encontrar en sus propios repositorios:
protovalidate-go
(versión beta)protovalidate-cc
(versión beta)protovalidate-java
(versión beta)protovalidate-python
(versión beta)protovalidate-ts
(próximamente)¿Interesado en agregar soporte para otro idioma? Consulte nuestras Pautas de contribución.
Para definir restricciones dentro de sus mensajes de Protobuf, importe buf/validate/validate.proto
en sus archivos .proto
:
syntax = "proto3" ;
package my.package ;
import "buf/validate/validate.proto" ;
buf
Agregue una dependencia en buf.build/bufbuild/protovalidate
al buf.yaml
de su módulo:
version : v1
# <snip>
deps :
- buf.build/bufbuild/protovalidate
# <snip>
Después de modificar su buf.yaml
, no olvide ejecutar buf mod update
para asegurarse de que sus dependencias estén actualizadas.
protoc
Agregue una ruta de importación ( -I
flag) que apunte al contenido del directorio proto/protovalidate
a su invocación de protoc
:
protoc
-I ./vendor/protovalidate/proto/protovalidate
# <snip>
Las restricciones de validación se pueden aplicar utilizando el paquete buf.validate
Protobuf. Las reglas se especifican directamente en los archivos .proto
.
Consideremos algunos ejemplos:
Validación de campo escalar: para un mensaje User
básico, podemos aplicar restricciones como una longitud mínima para el nombre del usuario.
syntax = "proto3" ;
import "buf/validate/validate.proto" ;
message User {
// User's name, must be at least 1 character long.
string name = 1 [ (buf.validate .field ) .string .min_len = 1 ];
}
Validación del campo del mapa: para un mensaje Product
con un mapa de cantidades de artículos, podemos asegurarnos de que todas las cantidades sean positivas.
syntax = "proto3" ;
import "buf/validate/validate.proto" ;
message Product {
// Map of item quantities, all quantities must be positive.
map < string , int32 > item_quantities = 1 [ (buf.validate .field ) .map.values.int32 .gt = 0 ];
}
Validación de tipo conocido (WKT): para el mensaje User
, podemos agregar una restricción para garantizar que la marca de tiempo created_at
esté en el pasado.
syntax = "proto3" ;
import "google/protobuf/timestamp.proto" ;
import "buf/validate/validate.proto" ;
message User {
// User's creation date must be in the past.
google.protobuf.Timestamp created_at = 1 [ (buf.validate .field ) .timestamp .lt_now = true ];
}
Para restricciones más avanzadas o personalizadas, protovalidate
permite expresiones CEL que pueden incorporar información en todos los campos.
Expresiones a nivel de campo: podemos exigir que price
de un producto, enviado como una cadena, incluya un símbolo de moneda como "$" o "£". Queremos asegurarnos de que el precio sea positivo y el símbolo de la moneda sea válido.
syntax = "proto3" ;
import "buf/validate/validate.proto" ;
message Product {
string price = 1 [ (buf.validate .field ).cel = {
id : "product.price" ,
message : "Price must be positive and include a valid currency symbol ($ or £)" ,
expression : "(this.startsWith('$') || this.startsWith('£')) && double(this.substring(1)) > 0"
}];
}
Expresiones a nivel de mensaje: para un mensaje Transaction
, podemos usar una expresión CEL a nivel de mensaje para garantizar que la delivery_date
sea siempre posterior a la purchase_date
.
syntax = "proto3" ;
import "google/protobuf/timestamp.proto" ;
import "buf/validate/validate.proto" ;
message Transaction {
google.protobuf.Timestamp purchase_date = 1 ;
google.protobuf.Timestamp delivery_date = 2 ;
option (buf.validate .message ).cel = {
id : "transaction.delivery_date" ,
message : "Delivery date must be after purchase date" ,
expression : "this.delivery_date > this.purchase_date"
};
}
Producir un mensaje de error en la expresión: Podemos producir mensajes de error personalizados directamente en las expresiones CEL. En este ejemplo, si la age
es menor de 18 años, la expresión CEL se evaluará como la cadena del mensaje de error.
syntax = "proto3" ;
import "buf/validate/validate.proto" ;
message User {
int32 age = 1 [ (buf.validate .field ).cel = {
id : "user.age" ,
expression : "this < 18 ? 'User must be at least 18 years old': ''"
}];
}
Consulte examples
para ver ejemplos tanto de restricciones estándar como de restricciones CEL personalizadas.
Una vez que los mensajes estén anotados con restricciones, use una de las bibliotecas de idiomas admitidas para validar; no es necesaria ninguna generación de código adicional.
protovalidate
proporciona un marco sólido para validar mensajes de Protobuf al imponer restricciones estándar y personalizadas en varios tipos de datos y ofrecer información de error detallada cuando ocurren violaciones de validación. Para obtener una descripción detallada de todos sus componentes, las restricciones admitidas y cómo utilizarlas de forma eficaz, consulte nuestra documentación completa. Los componentes clave incluyen:
Restricciones estándar : protovalidate
admite una amplia gama de restricciones estándar para todos los tipos de campos, así como funciones especiales para los tipos conocidos de Protobuf. Puede aplicar estas restricciones a sus mensajes de Protobuf para asegurarse de que cumplan ciertas condiciones comunes.
Restricciones personalizadas : con el lenguaje de expresión común (CEL) de Google, protovalidate
le permite crear restricciones personalizadas y complejas para manejar escenarios de validación únicos que no están cubiertos por las restricciones estándar tanto a nivel de campo como de mensaje.
Manejo de errores : cuando se produce una infracción, protovalidate
proporciona información detallada sobre el error para ayudarle a identificar rápidamente el origen y solucionar un problema.
protovalidate
es el sucesor espiritual de protoc-gen-validate
, y ofrece la misma funcionalidad presente en el complemento original, sin la necesidad de generar código personalizado, y la nueva capacidad de describir restricciones complejas en CEL.
Las restricciones de protovalidate
emulan muy de cerca las de protoc-gen-validate
para garantizar una transición fácil para los desarrolladores. Para migrar de protoc-gen-validate
a protovalidate
, utilice la herramienta de migración proporcionada para actualizar incrementalmente sus archivos .proto
.
Ofrecido bajo la licencia Apache 2.