protovalidate
عبارة عن سلسلة من المكتبات المصممة للتحقق من صحة رسائل Protobuf في وقت التشغيل بناءً على قواعد التحقق المحددة من قبل المستخدم. مدعومًا بلغة التعبير الشائعة (CEL) من Google، فهو يوفر أساسًا مرنًا وفعالاً لتحديد وتقييم قواعد التحقق المخصصة. الهدف الأساسي من protovalidate
هو مساعدة المطورين على ضمان اتساق البيانات وسلامتها عبر الشبكة دون الحاجة إلى تعليمات برمجية تم إنشاؤها.
ملحوظة
protovalidate
هو الوريث الروحي لـ protoc-gen-validate. لا يتطلب أي إنشاء تعليمات برمجية ويدعم القيود المخصصة.
نوصي بأن تنتقل المشاريع الجديدة والحالية إلى استخدام protovalidate
بدلاً من protoc-gen-validate
.
اقرأ منشور مدونتنا إذا كنت تريد معرفة المزيد حول القيود protoc-gen-validate
وكيف قمنا بتصميم protovalidate
-gen ليكون أفضل.
هذا المستودع هو جوهر مشروع protovalidate
. أنه يحتوي على:
protovalidate
بشكل فعالprotoc-gen-validate
.proto
باستخدام protovalidate
protovalidate
يمكن العثور على تطبيقات وقت التشغيل لـ protovalidate
في المستودعات الخاصة بها:
protovalidate-go
(إصدار تجريبي)protovalidate-cc
(إصدار تجريبي)protovalidate-java
(إصدار تجريبي)protovalidate-python
(إصدار تجريبي)protovalidate-ts
(قريبًا)هل أنت مهتم بإضافة دعم للغة أخرى؟ تحقق من إرشادات المساهمة لدينا.
لتحديد القيود داخل رسائل Protobuf، قم باستيراد buf/validate/validate.proto
إلى ملفات .proto
الخاصة بك:
syntax = "proto3" ;
package my.package ;
import "buf/validate/validate.proto" ;
buf
أضف تبعية على buf.build/bufbuild/protovalidate
إلى buf.yaml
الخاص بوحدتك:
version : v1
#
deps :
- buf.build/bufbuild/protovalidate
#
بعد تعديل buf.yaml
، لا تنس تشغيل buf mod update
للتأكد من أن تبعياتك محدثة.
protoc
أضف مسار استيراد (علامة -I
) يشير إلى محتويات دليل proto/protovalidate
لاستدعاء protoc
:
protoc
-I ./vendor/protovalidate/proto/protovalidate
#
يمكن فرض قيود التحقق باستخدام حزمة buf.validate
Protobuf. يتم تحديد القواعد مباشرة في ملفات .proto
.
دعونا نفكر في بعض الأمثلة:
التحقق من صحة الحقل العددي: بالنسبة لرسالة User
الأساسية، يمكننا فرض قيود مثل الحد الأدنى لطول اسم المستخدم.
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 ];
}
التحقق من صحة حقل الخريطة: بالنسبة لرسالة Product
التي تحتوي على خريطة لكميات العناصر، يمكننا التأكد من أن جميع الكميات موجبة.
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 ];
}
التحقق من صحة النوع المعروف (WKT): بالنسبة لرسالة User
، يمكننا إضافة قيد للتأكد من أن الطابع الزمني created_at
في الماضي.
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 ];
}
بالنسبة للقيود المتقدمة أو المخصصة، يسمح protovalidate
بتعبيرات CEL التي يمكنها دمج المعلومات عبر الحقول.
التعبيرات على مستوى الحقل: يمكننا أن نفرض أن price
المنتجات، الذي يتم إرساله كسلسلة، يتضمن رمز عملة مثل "$" أو " £". نريد التأكد من أن السعر إيجابي وأن رمز العملة صالح.
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"
}];
}
التعبيرات على مستوى الرسالة: بالنسبة لرسالة Transaction
، يمكننا استخدام تعبير CEL على مستوى الرسالة للتأكد من أن delivery_date
يقع دائمًا بعد 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"
};
}
إنتاج رسالة خطأ في التعبير: يمكننا إنتاج رسائل خطأ مخصصة مباشرة في تعبيرات CEL. في هذا المثال، إذا كان age
أقل من 18 عامًا، فسيتم تقييم تعبير CEL إلى سلسلة رسالة الخطأ.
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': ''"
}];
}
تحقق من examples
للحصول على أمثلة على كل من القيود القياسية وقيود CEL المخصصة.
بمجرد إضافة تعليقات توضيحية على الرسائل بالقيود، استخدم إحدى مكتبات اللغات المدعومة للتحقق من صحتها؛ لا يلزم إنشاء تعليمات برمجية إضافية.
يوفر protovalidate
إطارًا قويًا للتحقق من صحة رسائل Protobuf من خلال فرض قيود قياسية ومخصصة على أنواع البيانات المختلفة، وتقديم معلومات تفصيلية عن الأخطاء عند حدوث انتهاكات التحقق من الصحة. للحصول على نظرة عامة مفصلة عن جميع مكوناته، والقيود المدعومة، وكيفية استخدامها بفعالية، يرجى الرجوع إلى وثائقنا الشاملة. المكونات الرئيسية تشمل:
القيود القياسية : يدعم protovalidate
مجموعة واسعة من القيود القياسية لجميع أنواع الحقول بالإضافة إلى وظائف خاصة لأنواع Protobuf المعروفة. يمكنك تطبيق هذه القيود على رسائل Protobuf الخاصة بك للتأكد من أنها تستوفي شروطًا مشتركة معينة.
القيود المخصصة : باستخدام لغة التعبير الشائعة (CEL) من Google، يتيح لك protovalidate
إنشاء قيود مخصصة ومعقدة للتعامل مع سيناريوهات التحقق الفريدة التي لا تغطيها القيود القياسية على مستوى الحقل والرسالة.
معالجة الأخطاء : عند حدوث انتهاك، يوفر protovalidate
معلومات تفصيلية عن الخطأ لمساعدتك في التعرف بسرعة على المصدر وإصلاح المشكلة.
protovalidate
هو الوريث الروحي لـ protoc-gen-validate
، حيث يقدم نفس الوظائف الموجودة في البرنامج الإضافي الأصلي، دون الحاجة إلى إنشاء تعليمات برمجية مخصصة، والقدرة الجديدة على وصف القيود المعقدة في CEL.
تحاكي قيود protovalidate
بشكل وثيق تلك الموجودة في protoc-gen-validate
لضمان انتقال سهل للمطورين. للترحيل من protoc-gen-validate
إلى protovalidate
، استخدم أداة الترحيل المتوفرة لترقية ملفات .proto
بشكل متزايد.
معروض بموجب ترخيص Apache 2.