
protovalidate عبارة عن سلسلة من المكتبات المصممة للتحقق من صحة رسائل Protobuf في وقت التشغيل بناءً على قواعد التحقق المحددة من قبل المستخدم. مدعومًا بلغة التعبير الشائعة (CEL) من Google، فهو يوفر أساسًا مرنًا وفعالاً لتحديد وتقييم قواعد التحقق المخصصة. الهدف الأساسي من protovalidate هو مساعدة المطورين على ضمان اتساق البيانات وسلامتها عبر الشبكة دون الحاجة إلى تعليمات برمجية تم إنشاؤها.
ملحوظة
protovalidate هو الوريث الروحي لـ protoc-gen-validate. لا يتطلب أي إنشاء تعليمات برمجية ويدعم القيود المخصصة.
نوصي بأن تنتقل المشاريع الجديدة والحالية إلى استخدام protovalidate بدلاً من protoc-gen-validate .
اقرأ منشور مدونتنا إذا كنت تريد معرفة المزيد حول القيود protoc-gen-validate وكيف قمنا بتصميم protovalidate -gen ليكون أفضل.
هذا المستودع هو جوهر مشروع protovalidate . أنه يحتوي على:
protovalidate بشكل فعالprotoc-gen-validate.proto باستخدام protovalidateprotovalidate يمكن العثور على تطبيقات وقت التشغيل لـ 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
# <snip>
deps :
- buf.build/bufbuild/protovalidate
# <snip> بعد تعديل buf.yaml ، لا تنس تشغيل buf mod update للتأكد من أن تبعياتك محدثة.
protoc أضف مسار استيراد (علامة -I ) يشير إلى محتويات دليل proto/protovalidate لاستدعاء protoc :
protoc
-I ./vendor/protovalidate/proto/protovalidate
# <snip> يمكن فرض قيود التحقق باستخدام حزمة 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.