شما در حال مشاهده اسناد Apigee Edge هستید.
به مستندات Apigee X بروید . اطلاعات
درباره خط مشی OAS Validation
خط مشی OASValidation (OpenAPI Specification Validation) شما را قادر می سازد تا یک درخواست یا پیام پاسخ دریافتی را در برابر مشخصات OpenAPI 3.0 (JSON یا YAML) تأیید کنید. ببینید چه محتوایی تایید شده است؟
خطمشی OASValidation نام مشخصات OpenAPI را مشخص میکند تا هنگام اجرای مرحلهای که خطمشی به آن پیوست شده است، برای اعتبارسنجی استفاده شود. مشخصات OpenAPI به عنوان یک منبع در مکان استاندارد زیر در بسته پروکسی API ذخیره می شود: apiproxy/resources/oas
. مشخصات OpenAPI باید دارای پسوند .json
، .yml
، .yaml
باشد.
با استفاده از UI یا API، همانطور که در مدیریت منابع توضیح داده شده است، مشخصات OpenAPI را به عنوان منبع به یک بسته پراکسی API اضافه کنید.
چه محتوایی تایید شده است؟
جدول زیر محتوای پیام درخواست را که توسط خطمشی OASValidation تأیید شده است، به تفکیک مؤلفه خلاصه میکند.
اجزاء | درخواست اعتبار |
---|---|
مسیر پایه | مسیر پایه تعریف شده توسط پراکسی API را تأیید می کند. مسیر پایه مشخص شده در مشخصات OpenAPI را نادیده می گیرد. |
مسیر | تأیید می کند که مسیر درخواست (منهای مسیر پایه) با یکی از الگوهای مسیر تعریف شده در مشخصات OpenAPI مطابقت دارد. |
فعل | تأیید می کند که فعل برای مسیر در مشخصات OpenAPI تعریف شده است. |
درخواست بدنه پیام |
توجه: این خطمشی یک بدنه پیام درخواست را در برابر مشخصات OpenAPI فقط در صورتی تأیید میکند که Content-Type روی |
پارامترها |
|
جدول زیر محتوای پیام پاسخ را که توسط خطمشی OASValidation تأیید شده است، بر اساس مؤلفه خلاصه میکند.
اجزاء | اعتبار سنجی پاسخ |
---|---|
مسیر | تأیید می کند که مسیر درخواست (منهای مسیر پایه) با یکی از الگوهای مسیر تعریف شده در مشخصات OpenAPI مطابقت دارد. |
فعل | تأیید می کند که فعل برای مسیر در مشخصات OpenAPI تعریف شده است. |
بدنه پیام پاسخ |
|
نمونه ها
مثالهای زیر برخی از روشهایی را نشان میدهند که در آنها میتوانید از سیاست OASValidation برای اعتبارسنجی پیامها در برابر مشخصات OpenAPI 3.0 استفاده کنید.
اعتبار پیام درخواست
در مثال زیر، خط مشی myoaspolicy
متن پیام درخواست را در برابر طرح بدنه پیام درخواست عملیات تعریف شده در مشخصات OpenAPI my-spec.json
اعتبارسنجی می کند.
<OASValidation name="myoaspolicy"> <OASResource>oas://my-spec.json</OASResource> <Options> <ValidateMessageBody>true</ValidateMessageBody> </Options> <Source>request</Source> </OASValidation>
اگر متن پیام با مشخصات OpenAPI مطابقت نداشته باشد، یک خطای policies.oasvalidation.Failed
برگردانده می شود.
اعتبارسنجی پارامترها
مثال زیر خطمشی را طوری پیکربندی میکند که اگر هدر، پرس و جو یا پارامترهای کوکی در درخواست مشخص شده باشد که در مشخصات OpenAPI تعریف نشده است، شکست بخورد.
<OASValidation name="myoaspolicy"> <OASResource>oas://my-spec.yaml</OASResource> <Options> <AllowUnspecifiedParameters> <Header>false</Header> <Query>false</Query> <Cookie>false</Cookie> </AllowUnspecifiedParameters> </Options> </OASValidation>
عنصر <OASValidation>
خط مشی اعتبارسنجی مشخصات OpenAPI را تعریف می کند.
مقدار پیش فرض | به برگه سیاست پیشفرض در زیر مراجعه کنید |
مورد نیاز؟ | مورد نیاز |
تایپ کنید | شیء پیچیده |
عنصر والد | n/a |
عناصر کودک | <DisplayName> <OASResource> <Source> <Options> <Source> |
نحو
عنصر <OASValidation>
از نحو زیر استفاده می کند:
<OASValidation continueOnError="[true|false]" enabled="[true|false]" name="policy_name" > <!-- All OASValidation child elements are optional except OASResource --> <DisplayName>policy_display_name</DisplayName> <OASResource>validation_JSON_or_YAML</OASResource> <Options> <ValidateMessageBody>[true|false]</ValidateMessageBody> <AllowUnspecifiedParameters> <Header>[true|false]</Header> <Query>[true|false]</Query> <Cookie>[true|false]</Cookie> </AllowUnspecifiedParameters> </Options> <Source>message_to_validate</Source> </OASValidation>
خط مشی پیش فرض
مثال زیر تنظیمات پیش فرض را هنگام اضافه کردن یک خط مشی اعتبارسنجی OAS به جریان خود در رابط کاربری Apigee نشان می دهد:
<OASValidation continueOnError="false" enabled="true" name="OpenAPI-Spec-Validation-1"> <DisplayName>OpenAPI Spec Validation-1</DisplayName> <Properties/> <Source>request</Source> <OASResource>oas://OpenAPI-Spec-Validation-1.yaml</OASResource> </OASValidation>
این عنصر دارای ویژگی های زیر است که در همه سیاست ها مشترک است:
صفت | پیش فرض | ضروری؟ | شرح |
---|---|---|---|
name | N/A | ضروری | نام داخلی سیاست. مقدار مشخصه در صورت تمایل، از عنصر |
continueOnError | نادرست | اختیاری | برای بازگرداندن خطا در صورت شکست خط مشی، روی "false" تنظیم کنید. این رفتار مورد انتظار برای اکثر سیاست ها است. روی "true" تنظیم کنید تا اجرای جریان حتی پس از شکست خط مشی ادامه یابد. |
enabled | درست است، واقعی | اختیاری | برای اجرای این خطمشی روی «درست» تنظیم کنید. برای «خاموش کردن» خط مشی، روی «نادرست» تنظیم کنید. این سیاست حتی اگر به یک جریان وابسته باشد اجرا نخواهد شد. |
async | نادرست | منسوخ | این ویژگی منسوخ شده است. |
مرجع عنصر کودک
این بخش عناصر فرزند <OASValidation>
را توصیف می کند.
<DisplayName>
علاوه بر ویژگی name
برای برچسب گذاری خط مشی در ویرایشگر پروکسی رابط کاربری مدیریت با نامی متفاوت و طبیعی تر، از آن استفاده کنید.
عنصر <DisplayName>
در همه خط مشی ها مشترک است.
مقدار پیش فرض | n/a |
مورد نیاز؟ | اختیاری. اگر <DisplayName> حذف کنید، از مقدار ویژگی name خط مشی استفاده می شود |
تایپ کنید | رشته |
عنصر والد | < PolicyElement > |
عناصر کودک | هیچ کدام |
عنصر <DisplayName>
از نحو زیر استفاده می کند:
نحو
<PolicyElement> <DisplayName>policy_display_name</DisplayName> ... </PolicyElement>
مثال
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
عنصر <DisplayName>
هیچ ویژگی یا عنصر فرزند ندارد.
<OASResource>
مشخصات OpenAPI را برای تأیید اعتبار مشخص می کند. شما می توانید این فایل را ذخیره کنید:
- در محدوده پروکسی API در
/apiproxy/resources/oas
در بسته پروکسی API - در بخش
Resources
در نمای ناوبر ویرایشگر پروکسی API.
برای اطلاعات بیشتر، به مدیریت منابع مراجعه کنید.
می توانید مشخصات OpenAPI را با استفاده از یک الگوی پیام، مانند {oas.resource.url}
مشخص کنید. در این حالت، مقدار متغیر جریان oas.resource.url
(در مهاربندهای فرفری) ارزیابی شده و در زمان اجرا در رشته payload جایگزین میشود. برای اطلاعات بیشتر، الگوهای پیام را ببینید.
مقدار پیش فرض | هیچ کدام |
مورد نیاز؟ | مورد نیاز |
تایپ کنید | رشته |
عنصر والد | <OASValidation> |
عناصر کودک | هیچ کدام |
نحو
عنصر <OASResource>
از نحو زیر استفاده می کند:
<OASValidation name="policy_name"> <OASResource>oas://specname[.json|.yaml|.yml]</OASResource> ... </OASValidation>
مثال
مثال زیر به مشخصات my-spec.yaml
اشاره می کند که در /apiproxy/resources/oas
در بسته پروکسی API ذخیره شده است:
<OASValidation name="myoaspolicy"> <OASResource>oas://my-spec.yaml</OASResource> </OASValidation>
عنصر <OASResource>
هیچ ویژگی یا عنصر فرزند ندارد.
<گزینه ها>
گزینه های خط مشی را پیکربندی می کند.
مقدار پیش فرض | n/a |
مورد نیاز؟ | اختیاری |
تایپ کنید | نوع پیچیده |
عنصر والد | <OASValidation> |
عناصر کودک | <ValidateMessageBody> <AllowUnspecifiedParameters> |
نحو
عنصر <Options>
از نحو زیر استفاده می کند:
<OASValidation name="policy_name"> <OASResource>oas://specname[.json|.yaml|.yml]</OASResource> <Options> <ValidateMessageBody>[true|false]</ValidateMessageBody> <AllowUnspecifiedParameters> <Header>[true|false]</Header> <Query>[true|false]</Query> <Cookie>[true|false]</Cookie> </AllowUnspecifiedParameters> </Options> ... </OASValidation>
مثال
مثال زیر گزینه های سیاست را پیکربندی می کند. هر یک از گزینه ها با جزئیات بیشتر در زیر توضیح داده شده است.
<OASValidation name="myoaspolicy"> <OASResource>oas://my-spec.yaml</OASResource> <Options> <ValidateMessageBody>false</ValidateMessageBody> <AllowUnspecifiedParameters> <Header>false</Header> <Query>false</Query> <Cookie>false</Cookie> </AllowUnspecifiedParameters> </Options> </OASValidation>
<ValidateMessageBody>
مشخص میکند که آیا این خطمشی باید بدنه پیام را در برابر طرح بدنه درخواست عملیات در مشخصات OpenAPI تأیید کند یا خیر. برای تأیید محتوای متن پیام، روی true تنظیم کنید. روی false تنظیم کنید تا فقط اعتبار پیام وجود داشته باشد.
میتوانید با تنظیم صفت continueOnError
برای عنصر <OASValidation>
روی true کنترل کنید که آیا اجرای جریان پس از یک خطای اعتبارسنجی ادامه مییابد.
مقدار پیش فرض | نادرست |
مورد نیاز؟ | اختیاری |
تایپ کنید | بولی |
عنصر والد | <Options> |
عناصر کودک | هیچ کدام |
نحو
عنصر <ValidateMessageBody>
از نحو زیر استفاده می کند:
<OASValidation name="policy_name"> <OASResource>oas://specname[.json|.yaml|.yml]</OASResource> <Options> <ValidateMessageBody>[true|false]</ValidateMessageBody> </Options> ... </OASValidation>
مثال
مثال زیر اعتبار محتوای متن پیام را فعال می کند:
<OASValidation name="myoaspolicy"> <OASResource>oas://my-spec.yaml</OASResource> <Options> <ValidateMessageBody>true</ValidateMessageBody> </Options> </OASValidation>
<AllowUnspecifiedParameters>
اگر پارامترهای سرصفحه، پرس و جو یا کوکی در درخواست وجود داشته باشد که در مشخصات OpenAPI تعریف نشده اند، رفتار خط مشی را پیکربندی می کند.
مقدار پیش فرض | n/a |
مورد نیاز؟ | اختیاری |
تایپ کنید | نوع پیچیده |
عنصر والد | <Options> |
عناصر کودک | <Header> <Query> <Cookie> |
نحو
عنصر <AllowUnspecifiedParameters>
از نحو زیر استفاده می کند:
<OASValidation name="policy_name"> <OASResource>oas://specname[.json|.yaml|.yml]</OASResource> <Options> <AllowUnspecifiedParameters> <Header>[true|false]</Header> <Query>[true|false]</Query> <Cookie>[true|false]</Cookie> </AllowUnspecifiedParameters> </Options> ... </OASValidation>
مثال
مثال زیر خطمشی را طوری پیکربندی میکند که اگر هدر، پرس و جو یا پارامترهای کوکی در درخواست مشخص شده باشد که در مشخصات OpenAPI تعریف نشده است، شکست بخورد.
<OASValidation name="myoaspolicy"> <OASResource>oas://my-spec.yaml</OASResource> <Options> <AllowUnspecifiedParameters> <Header>false</Header> <Query>false</Query> <Cookie>false</Cookie> </AllowUnspecifiedParameters> </Options> </OASValidation>
<Header>
(فرزند <AllowUnspecifiedParameters>
)
در صورت وجود پارامترهای سرصفحه در درخواست که در مشخصات OpenAPI تعریف نشده اند، رفتار خط مشی را پیکربندی می کند.
برای اینکه پارامترهای هدر در درخواست مشخص شوند که در مشخصات OpenAPI تعریف نشده اند، این پارامتر را روی true تنظیم کنید. در غیر این صورت، این پارامتر را روی false قرار دهید تا اجرای خط مشی با شکست مواجه شود.
مقدار پیش فرض | درست است |
مورد نیاز؟ | بولی |
تایپ کنید | نوع پیچیده |
عنصر والد | <AllowUnspecifiedParameters> |
عناصر کودک | هیچ کدام |
نحو
عنصر <Header>
از نحو زیر استفاده می کند:
<OASValidation name="policy_name"> <OASResource>oas://specname[.json|.yaml|.yml]</OASResource> <Options> <AllowUnspecifiedParameters> <Header>[true|false]</Header> </AllowUnspecifiedParameters> </Options> ... </OASValidation>
مثال
مثال زیر سیاست را به گونه ای پیکربندی می کند که اگر یک پارامتر هدر در درخواست مشخص شده باشد که در مشخصات OpenAPI تعریف نشده است، شکست بخورد.
<OASValidation name="myoaspolicy"> <OASResource>oas://my-spec.yaml</OASResource> <Options> <AllowUnspecifiedParameters> <Header>false</Header> </AllowUnspecifiedParameters> </Options> </OASValidation>
<Query>
(فرزند <AllowUnspecifiedParameters>
)
اگر پارامترهای پرس و جو در درخواست وجود داشته باشد که در مشخصات OpenAPI تعریف نشده اند، رفتار خط مشی را پیکربندی می کند.
برای تعیین پارامترهای پرس و جو در درخواست که در مشخصات OpenAPI تعریف نشده اند، این پارامتر را روی true تنظیم کنید. در غیر این صورت، این پارامتر را روی false قرار دهید تا اجرای خط مشی با شکست مواجه شود.
مقدار پیش فرض | درست است |
مورد نیاز؟ | بولی |
تایپ کنید | نوع پیچیده |
عنصر والد | <AllowUnspecifiedParameters> |
عناصر کودک | هیچ کدام |
نحو
عنصر <Query>
از نحو زیر استفاده می کند:
<OASValidation name="policy_name"> <OASResource>oas://specname[.json|.yaml|.yml]</OASResource> <Options> <AllowUnspecifiedParameters> <Query>[true|false]</Query> </AllowUnspecifiedParameters> </Options> ... </OASValidation>
مثال
مثال زیر سیاست را به گونه ای پیکربندی می کند که اگر پارامتر پرس و جو در درخواست مشخص شده باشد که در مشخصات OpenAPI تعریف نشده است، شکست بخورد.
<OASValidation name="myoaspolicy"> <OASResource>oas://my-spec.yaml</OASResource> <Options> <AllowUnspecifiedParameters> <Query>false</Query> </AllowUnspecifiedParameters> </Options> </OASValidation>
اگر پارامترهای کوکی در درخواست وجود داشته باشد که در مشخصات OpenAPI تعریف نشده اند، رفتار خط مشی را پیکربندی می کند.
برای اینکه اجازه دهید پارامترهای کوکی در درخواست مشخص شوند که در مشخصات OpenAPI تعریف نشده اند، این پارامتر را روی true تنظیم کنید. در غیر این صورت، این پارامتر را روی false قرار دهید تا اجرای خط مشی با شکست مواجه شود.
مقدار پیش فرض | درست است |
مورد نیاز؟ | بولی |
تایپ کنید | نوع پیچیده |
عنصر والد | <AllowUnspecifiedParameters> |
عناصر کودک | هیچ کدام |
نحو
عنصر <Cookie>
از نحو زیر استفاده می کند:
<OASValidation name="policy_name"> <OASResource>oas://specname[.json|.yaml|.yml]</OASResource> <Options> <AllowUnspecifiedParameters> <Query>[true|false]</Query> </AllowUnspecifiedParameters> </Options> ... </OASValidation>
مثال
مثال زیر سیاست را به گونه ای پیکربندی می کند که اگر پارامتر پرس و جو در درخواست مشخص شده باشد که در مشخصات OpenAPI تعریف نشده است، شکست بخورد.
<OASValidation name="myoaspolicy"> <OASResource>oas://my-spec.yaml</OASResource> <Options> <AllowUnspecifiedParameters> <Cookie>false</Cookie> </AllowUnspecifiedParameters> </Options> </OASValidation>
<Source>
پیام JSON باید در برابر حملات بارگذاری JSON ارزیابی شود. این معمولاً روی request
تنظیم میشود، زیرا معمولاً باید درخواستهای ورودی از برنامههای مشتری را ارزیابی کنید. برای ارزیابی پیام های پاسخ، روی پاسخ تنظیم کنید. برای ارزیابی خودکار پیام درخواست هنگامی که خط مشی به جریان درخواست پیوست می شود و پیام پاسخ هنگامی که خط مشی به جریان پاسخ پیوست می شود، روی پیام تنظیم کنید.
مقدار پیش فرض | درخواست کنید |
مورد نیاز؟ | اختیاری |
تایپ کنید | رشته |
عنصر والد | <Source> |
عناصر کودک | هیچ کدام |
نحو
عنصر <Source>
از نحو زیر استفاده می کند:
<OASValidation name="policy_name"> <OASResource>oas://specname[.json|.yaml|.yml]</OASResource> <Source>[message|request|response]</Source> ... </OASValidation>
مثال
مثال زیر به طور خودکار پیام درخواست را هنگامی که خط مشی به جریان درخواست پیوست می شود و پیام پاسخ را هنگامی که خط مشی به جریان پاسخ پیوست می شود ارزیابی می کند:
<OASValidation name="myoaspolicy"> <OASResource>oas://my-spec.yaml</OASResource> <Source>message</Source> </OASValidation>
عنصر <Source>
هیچ ویژگی یا عنصر فرزند ندارد.
طرحواره ها
هر نوع خط مشی توسط یک طرح XML ( .xsd
) تعریف می شود. برای مرجع، طرحهای خطمشی در GitHub در دسترس هستند.
کدهای خطا
این بخش کدهای خطا و پیامهای خطایی را که برگردانده میشوند و متغیرهای خطا را که توسط Edge تنظیم میشوند، هنگامی که این خطمشی خطا را راهاندازی میکند، توضیح میدهد. این اطلاعات برای دانستن اینکه آیا در حال توسعه قوانین خطا برای رسیدگی به خطاها هستید، مهم است. برای کسب اطلاعات بیشتر، آنچه را که باید در مورد خطاهای خط مشی و مدیریت خطاها بدانید را ببینید.
خطاهای زمان اجرا
این خطاها ممکن است هنگام اجرای سیاست رخ دهند.
کد خطا | وضعیت HTTP | علت | |
---|---|---|---|
steps.oasvalidation.Failed | 500 | بدنه پیام درخواست را نمی توان در برابر مشخصات OpenAPI ارائه شده تأیید کرد. | |
steps.oasvalidation.SourceMessageNotAvailable | 500 | متغیر مشخص شده در عنصر | |
steps.oasvalidation.NotMessageVariable | 500 | عنصر | build |
خطاهای استقرار
این خطاها ممکن است زمانی رخ دهند که یک پروکسی حاوی این خط مشی را مستقر می کنید.
نام خطا | علت | |
---|---|---|
ResourceDoesNotExist | مشخصات OpenAPI ارجاع شده در عنصر <OASResource> وجود ندارد. | |
ResourceCompileFailed | مشخصات OpenAPI که در استقرار گنجانده شده است حاوی خطاهایی است که از کامپایل شدن آن جلوگیری می کند. این به طور کلی نشان می دهد که مشخصات یک OpenAPI Specification 3.0 به خوبی شکل گرفته نیست. | |
BadResourceURL | مشخصات OpenAPI ارجاع شده در عنصر <OASResource> قابل پردازش نیست. اگر فایل JSON یا YAML نباشد یا URL فایل به درستی مشخص نشده باشد، ممکن است این اتفاق بیفتد. |
متغیرهای خطا
این متغیرها زمانی تنظیم می شوند که این خط مشی خطایی را در زمان اجرا ایجاد کند. برای اطلاعات بیشتر، به آنچه باید در مورد خطاهای خط مشی بدانید مراجعه کنید.
متغیرها | جایی که | مثال |
---|---|---|
fault.name=" fault_name " | fault_name نام خطا است، همانطور که در جدول خطاهای Runtime در بالا ذکر شده است. نام خطا آخرین قسمت کد خطا است. | fault.name Matches "ResourceDoesNotExist" |
oasvalidation. policy_name .failed | policy_name نام سیاستی است که توسط کاربر مشخص شده است که خطا را ایجاد کرده است. | oasvalidation.myoaspolicy.failed = true |
پشتیبانی از ویژگی های OpenAPI Specifications
خطمشی OASValidation از ویژگیهای OpenAPI Specification که در جدول زیر، بر اساس دستهبندی خلاصه شدهاند، پشتیبانی میکند. ویژگی هایی که پشتیبانی نمی شوند نیز فهرست شده اند.
دسته بندی | پشتیبانی می شود | پشتیبانی نمی شود |
---|---|---|
فرمت های نوع داده | بولی تاریخ تاریخ-زمان دو برابر کردن ایمیل شناور int32/int64 ipv4/ipv6 md5 sha1/sha256/sha512 رشته اوری uri-template uuid | باینری بایت رمز عبور |
شیء ممیز | نقشه برداری نام ملک | N/A |
شیء نوع رسانه | طرحواره | رمزگذاری مثال نمونه ها |
شیء عملیات | پارامترها درخواست بدن پاسخ ها امنیت (پشتیبانی جزئی) | پاسخ به تماس ها منسوخ شده است سرورها |
پارامترها شی | allowEmptyValue در ( query ، header ، path )مورد نیاز است پاسخ ها طرحواره سبک ( deepObject ، form ، formmatrix ، label ، pipeDelimited ، simple ، spaceDelimited )توجه: deepObject فقط از پارامترهای رشته پشتیبانی می کند. آرایه ها و اشیاء تو در تو پشتیبانی نمی شوند. | اجازه رزرو شده است منسوخ شده است مثال نمونه ها محتوا |
مسیرها شی | حذف کنید دریافت کنید سر گزینه ها پارامترها پچ پست قرار دادن ردیابی متغیرها | سرورها |
درخواست جسم بدن | application/json application/hal+json application/x-www-form-urlencoded (شیء encoding پشتیبانی نمی شود)محتوا مورد نیاز است | برنامه/xml چند بخشی/فرم-داده متن/ساده متن/xml |
شی پاسخ | application/json application/hal+json application/x-www-form-urlencoded (شیء encoding پشتیبانی نمی شود)محتوا سرصفحه ها | برنامه/xml پیوندها متن/ساده متن/xml |
شی پاسخ می دهد | پیش فرض کد وضعیت HTTP | N/A |
شی طرحواره | $ref خواص اضافی (فقط نوع پرچم بولین) allOf (اگر additionalProperties false باشد نادیده گرفته می شود)هریک از enum منحصر به فرد حداکثر / انحصاری حداقل قالب موارد حداکثر/حداقل maxItems/minItems حداکثر طول / دقیقه طول maxProperties/minProperties چندگانه از نه باطل شدنی یکی از الگو خواص مورد نیاز است عنوان نوع منحصر به فرد | منسوخ شده است مثال فقط خواندنی فقط نوشتن xml |
شی طرح امنیتی | در ( header ، query ) (اگر type http باشد نادیده گرفته می شود)نام تایپ کنید ( apiKey ، http ) | فرمت حامل جریان می یابد openIdConnectUrl طرح |
شی سرور | آدرس اینترنتی متغیرها | تعاریف چند سرور |