برنامه نویسی و طراحی سایت

آموزش Fetch در جاوا اسکریپت — توضیح تابع و دستور + نمونه کد

آموزش Fetch در جاوا اسکریپت — توضیح تابع و دستور + نمونه کد

یکی از ویژگی‌های مهم جاوا اسکریپت ایجاد درخواست از API-های گوناگون است که این API-ها می‌توانند کاربردهای بسیار جذابی در پروژه‌های مختلف داشته باشند. Fetch در جاوا اسکریپت متدی است که برای این هدف به کار می‌رود. قبلاً در جاوا اسکریپت از روش XMLHttpRequest برای ایجاد درخواست‌های API استفاده می‌شد. این روش درخواست از API شامل Promise نبود و کد آن بسیار پیچیده و ناخوانا بود.

فهرست مطالب این نوشته
متد Fetch در جاوا اسکریپت چیست؟

متد Fetch در جاوا اسکریپت چه‌ پارامترهایی می‌گیرد؟

promise در درخواست Fetch API چیست؟

تفاوت fetch با XHR چیست؟

ارسال درخواست با متد Fetch در جاوا اسکریپت

خواندن پاسخ با متد Fetch در جاوا اسکریپت

شی درخواست‌ در جاوا اسکریپت

کدهای وضعیت پاسخ برای متد Fetch در جاوا اسکریپت

معرفی فیلم های آموزش جاوا اسکریپت

آموزش Fetch در جاوا اسکریپت به صورت گام به گام

مرحله 1: درک سینتکس Fetch API در جاوا اسکریپت

مرحله 2: استفاده از Fetch برای دریافت داده از یک API

ارسال شی Request با متد Fetch در جاوا اسکریپت

مثال کاربردی از fetch در جاوا اسکریپت

سخن پایانی

faradars mobile

هم‌اکنون، جاوا اسکریپت راه‌حل بسیار مناسبی برای ایجاد درخواست از API ارائه می‌دهد که این راه‌حل، Fetch API نام دارد. Fetch API استاندارد جدیدی برای درخواست سرور با Promise است. البته روش‌های ایجاد درخواست در جاوا اسکریپت به این دو مورد محدود نمی‌شوند. در این مطلب آموزشی از مجله تم آف، متد Fetch در جاوا اسکریپت، برای درخواست از API به همراه جنبه‌های مختلف آن موردبررسی قرار خواهد گرفت.

متد Fetch در جاوا اسکریپت چیست؟

متد Fetch در جاوا اسکریپت برای درخواست از سرور و بارگذاری اطلاعات در صفحات وب استفاده می‌شود. درخواست می‌تواند از هر API باشد که در آن داده‌های فرمت JSON یا XML را برمی‌گرداند. متد fetch یک «وعده» (Promise) را برمی‌گرداند. «سینتکس» (Syntax) یا دستور متد Fetch در جاوا اسکریپت به‌ صورت زیر است:

fetch('url')//api for the get request

  .then(response => response.json())

  .then(data => console.log(data));

متد Fetch در جاوا اسکریپت چه‌ پارامترهایی می‌گیرد؟

متد fetch دو پارامتر URL و Options را می‌پذیرد. شرح این دو پارامتر به‌صورت زیر است:

  • URL: آدرسی است که درخواست به آن ارسال می‌شود.
  • Options: آرایه‌ای از خواص است. این پارامتری اختیاری است.

داده‌های بازگردانده شده در متد fetch می‌توانند از فرمت JSON یا XML باشند. همچنین داده‌های بازگردانده شده می‌توانند آرایه‌ای از اشیا، یا حتی یک شی واحد باشند. باید به این نکته توجه داشت که به طور پیش‌فرض، متد fetch در Javascript  «هیچ کوکی» (Cookie) را از سرور ارسال یا دریافت نمی‌کند و در نتیجه درخواست‌های آن احراز هویت نمی‌شوند.

آموزش JavaScript ES6 جاوا اسکریپت
فیلم آموزش JavaScript ES6 جاوا اسکریپت در تم آف

کلیک کنید

promise در درخواست Fetch API چیست؟

قبل از اینکه اصل مسئله بیان شود، بهتر است که در مورد promise و رسالت آن ‌در جاوا اسکریپت کمی توضیح دهیم. هدف متد fetch این است که درخواستی را به یک API ارسال کند و سپس یک Promise را بازگرداند. بررسی کامل Promise-ها در جاوا اسکریپت در قالب این مطلب قابل بیان نیست ولی به‌ صورت کلی می‌توان گفت که Promise نشان‌دهنده موفقیت یا شکست یک عملیات و بازگرداندن مقدار حاصل از آن است.

به زبان بسیار ساده Promise در جاوا اسکریپت مانند قول و قرارهایی است که امکان دارد هر فردی در زندگی روزانه با آن سروکار داشته باشد. امکان دارد فرد به قول و قرارهای خود پایبند باشد یا از آن‌ها بگذرد. در جاوا اسکریپت نیز Promise این رسالت را دارد. برای مثال اگر درخواستی به سمت یک صفحه وب از طریق کاربری ارسال شود و منتظر دریافت پاسخ باشد، دو حالت برای آن وجود خواهد داشت.

  • درخواست پاسخ داده خواهد شد و کاربر به هدفش می‌رسد.
  • درخواست رد می‌شود و کاربر خطا دریافت می‌کند.

تفاوت fetch با XHR چیست؟

یکی از قابل ‌توجه ترین تفاوت‌های متد fetch با XHR این است که fetch با Promise کار می‌کند ولی XHR با Callback به ارسال درخواست می‌پردازد. کار با Callback-ها در جاوا اسکریپت، نسبت به promise-ها در کاربردهای درخواست از API پیچیده‌تر است و توسعه‌ دهنده‌ها کمتر از آن استفاده می‌کنند.

تفاوتFetch با XHR در جاوا اسکریپت

همچنین متد Fetch در جاوا اسکریپت متدی مدرن و همه کاره است. از طرفی متد fetch توسط مرورگرهای قدیمی پشتیبانی نمی‌شود ولی همه مرورگرهای جدید از آن به‌خوبی پشتیبانی می‌کنند.

مطلب پیشنهادی:

واکشی داده ها از سرور در جاوا اسکریپت — راهنمای جامع

شروع مطالعه

 

ارسال درخواست با متد Fetch در جاوا اسکریپت

برای ارسال درخواست توسط متد Fetch در جاوا اسکریپت تنها به یک پارامتر نیاز است که آن هم پارامتر URL منبعی است که واکشی از آن انجام شود. سینتکس ارسال درخواست با متد Fetch در جاوا اسکریپت به‌ صورت زیر است:

let response = fetch(url);

همان‌طور که گفته شد، متد fetch یک Promise را برمی‌گرداند، بنابراین می‌توان از متدهای then()

 ‎و catch()

 ‎برای مدیریت آن استفاده کرد. سینتکس این رویکرد به‌ صورت قطعه کد زیر خواهد بود:

fetch(url)

    .then(response => {

        // handle the response

    })

    .catch(error => {

        // handle the error

    });

وقتی درخواست تکمیل شد، یعنی منبع در دسترس است. با این شرایط، Promise به یک شی Response

 تبدیل می‌شود. شی Response

بسته‌بندی API برای منبع واکشی شده است. این شی تعدادی ویژگی و متد مفید برای بررسی پاسخ دارد.

خواندن پاسخ با متد Fetch در جاوا اسکریپت

اگر محتوای پاسخ به درخواست در قالب متن خام باشد، می‌توان از متد text()

برای خواندن آن استفاده کرد. متد text()

 ‎یک Promise را بازمی‌گرداند که حاوی محتویات کامل منبع واکشی شده است. سینتکس این روش به صورت قطعه کد زیر خواهد بود:

fetch('/readme.txt')

    .then(response => response.text())

    .then(data => console.log(data));

در عمل، اغلب از ویژگی async/await

 با متد fetch برای خواندن پاسخ به‌ صورت زیر استفاده می‌شود:

async function fetchText() {

    let response = await fetch('/readme.txt');

    let data = await response.text();

    console.log(data);

}

علاوه بر متد text()

، شی Response

انواع دیگری از متدهای دیگر را نیز بسته به نوع داده مربوطه به کار می‌گیرد که شامل موارد زیر هستند:

  • json()‎
  • blob()‎
  • formData()‎
  • arrayBuffer()‎
  • clone()‎
  • ‎redirect()‎
متدهای ارسال درخواست در جاوا اسکریپت

شی درخواست‌ در جاوا اسکریپت

شی «درخواست» (Request)، برای واکشی دارای عناصر مختلفی است. با استفاده از fetch می‌توان درخواست‌های پیشرفته و سفارشی شده را به API-های مختلف ارسال کرد. به صورت کلی در این درخواست، عناصر زیر میتوانند نقش داشته باشند.

آموزش فریم ورک نود جی اس – آپلود فایل با Node.js
فیلم آموزش فریم ورک نود جی اس – آپلود فایل با Node.js در تم آف

کلیک کنید

  • متد: GET، POST، PUT
  • آدرس: URL درخواست
  • «سربرگ‌ها» (Heders): سربرگ درخواست
  •  «ارجاع کننده» (Referrer): ارجاع کننده درخواست
  • حالت: Cors ،No-cors (به حالت‌های درخواست اشاره دارند برای مثال: در حالت No-cors اگر متد چیزی غیر از HEAD ،GET یا POST باشد و هدرها چیزی غیر از هدرهای ساده باشند، از درخواست جلوگیری می کند.)
  • «اعتبار» (Validity)
  • کش: حالت کش (پیش فرض، بارگیری مجدد، بدون کش)

کدهای وضعیت پاسخ برای متد Fetch در جاوا اسکریپت

شی Response

کد وضعیت و متن وضعیت را از طریق ویژگی‌های status

 و statusText

 ارائه می‌دهد. هنگامی‌ که درخواستی با موفقیت انجام می‌شود، کد وضعیت آن 200 است و متن وضعیت آن OK خواهد بود. این به معنای موفقیت در دسترسی به منبع است. قطعه کد زیر این رویکرد را نشان می‌دهد.

async function fetchText() {

    let response = await fetch('/readme.txt');

    console.log(response.status); // 200

    console.log(response.statusText); // OK

    if (response.status === 200) {

        let data = await response.text();

        // handle data

    }

}
fetchText();

خروجی آن به صورت زیر است:

200

OK

اگر منبع درخواستی وجود نداشته باشد، کد پاسخ، 404 است، در نمونه کد زیر این مسئله نشان داده شده است:

let response = await fetch('/non-existence.txt');

console.log(response.status); // 400

console.log(response.statusText); // Not Found

خروجی به صورت زیر خواهد بود:

400

Not Found

اگر URL درخواستی خطای سرور ایجاد کند، کد پاسخ 500 خواهد بود. اگر URL درخواستی با پاسخ 300 تا ٣٠٩ به آدرس جدید تغییر مسیر دهد، وضعیت شی Response

روی 200 تنظیم می‌شود.

معرفی فیلم های آموزش جاوا اسکریپت

فیلم های آموزش برنامه نویسی جاوا اسکریپت

یکی از پرکاربردترین زبان‌های برنامه نویسی، جاوا اسکریپت است که در زمینه‌های مختلفی کاربرد دارد. این زبان در حال حاضر جزء محبوب‌ترین زبان‌های برنامه نویسی از لحاظ جامعه آماری و تعداد توسعه‌دهندگان به حساب می‌آید. همچنین جاوا اسکریپت دارای چارچوب‌های مختلفی به منظور تسریع و آسان‌سازی فرآیند برنامه نویسی است که هر کدام از آن‌ها برای اهداف گوناگون مانند، توسعه وب، توسعه اپلیکیشن، توسعه بازی و سایر موارد به کار گرفته می‌شوند. از طرف دیگر، نیاز به متخصصان جاوا اسکریپت در بیشتر کشورهای جهان روزبه‌روز در حال افزایش است و بازار کار و آینده این زبان برنامه نویسی تا حدود زیادی نویدبخش و امیدوار پیش‌بینی می‌شود.

یادگیری جاوا اسکریپت در حال حاضر از اهمیت بسیار بالایی برخوردار است و برای این هدف در پلتفرم آموزشی تم آف دوره‌های آموزش جاوا اسکریپت زیادی ارائه شده‌اند که به صورت جامع به آموزش این زبان محبوب می‌پردازند. این دوره‌ها در دسته‌های مختلفی اعم از آموزش جامع جاوا اسکریپت، آموزش فریمورک‌های جاوا اسکریپت، آموزش پروژه‌محور جاوا اسکریپت و سایر موارد در پلتفرم تم آف قرار دارند. در تصویر بالا تنها تعداد کمی از دوره‌های موجود در مجموعه آموزش جاوا اسکریپت، به‌عنوان نمونه آمده‌اند.

  • برای مشاهده مجموعه‌ی کامل فیلم های آموزشی جاوا اسکریپت تم آف + اینجا کلیک کنید.

آموزش Fetch در جاوا اسکریپت به صورت گام به گام

در این بخش از مطلب قرار است که از صفر تا صد مثالی عملی از متد Fetch در جاوا اسکریپت ارائه شود. این بخش از آموزش به یک سری پیش‌نیاز وابسته است که در ادامه فهرست شده‌اند:

  • یک محیط توسعه برای Node.js
  • درک اولیه از کد نویسی در جاوا اسکریپت
  • درک Promise در جاوا اسکریپت

مرحله 1: درک سینتکس Fetch API در جاوا اسکریپت

یکی از روش‌های استفاده از Fetch API، ارسال fetch() URL API

 به‌عنوان پارامتر است:

fetch(url)

متد fetch یک Promise را برمی‌گرداند. بعد از متد fetch، متد then()‎

 می‌آید که سینتکس آن به‌ صورت قطعه کد زیر خواهد بود:

fetch(url)

  .then(function() {

    // handle the response

  })

اگر Promise بازگردانده شده کد وضعیت آن 200 باشد، تابع داخل متد then()‎

 اجرا می‌شود. این تابع حاوی کدی برای مدیریت داده‌های دریافتی از API است. بعد از متد then()‎

متد catch()‎

 باید وارد شود که این عمل به‌ صورت قطعه کد زیر خواهد بود:

fetch(url)

  .then(function() {

    // handle the response

  })

  .catch(function() {

    // handle the error

  });

API که با استفاده از fetch فراخوانی می‌شود ممکن است خراب باشد یا خطاهای دیگری در فرایند ارسال درخواست رخ دهد. اگر این اتفاق بیفتد، همان‌طور که در بالا نیز به آن اشاره‌ شده است، Promise با شکست مواجه می‌شود. متد catch()‎

در این میان نقش رسیدگی به رد درخواست را دارد. به این معنی که اگر هنگام فراخوانی API مد نظر، خطایی رخ دهد، کد درون متد catch()‎

اجرا خواهد شد. با درک نحوه استفاده از Fetch API در جاوا اسکریپت، اکنون می‌توان مثالی واقعی را از متد Fetch در جاوا اسکریپت برای ارسال درخواست به یک API به کار گرفت.

مرحله 2: استفاده از Fetch برای دریافت داده از یک API

در ادامه مثال عملی از متد fetch به کار گرفته شده است. نمونه کد زیر بر اساس JSONPlaceholder API خواهد بود. با استفاده از منبع واکشی 10 کاربر در فهرست نویسندگان یا Authors واکشی خواهند شد. این مثال داده‌ها را از JSONPlaceholder API بازیابی می‌کند و در موارد بازیابی شده در لیست Authors در کنسول مرورگر وب نمایش می‌دهد. برای شروع کار باید یک فایل HTML ایجاد شود و عنوان آن Authors باشد:

Authors

    حال باید تگ‌های اسکریپت به پایین فایل HTML اضافه شوند و از یک انتخاب‌گر DOM برای گرفتن ul

     استفاده شود. از getElementById

     برای Authors

     به‌عنوان آرگومان در این مثال استفاده‌ شده است:

    Authors

      نکته: Author-ها شناسه ul

      قبلی ایجاد شده هستند.

      پس از انجام این کار، لیستی به نام DocumentFragment

       ایجاد می‌شود که برای این هدف قطعه کد زیر به کار می‌رود:

      همه عناصر «لیست ضمیمه‌ شده» (Appended List) به لیست ساخته‌ شده اضافه خواهند شد. سپس یک متغیر ثابت به نام url

       ایجاد می‌شود که URL API را نگه می‌دارد و ده کاربر تصادفی را از لیست Authors برمی‌گرداند. قطعه کد این بخش به‌ صورت زیر خواهد بود:

      اکنون با استفاده از API JSONPlaceholder، آدرس واکشی یا url

       به وسیله متد Fetch در جاوا اسکریپت به‌عنوان آرگومان فراخوانی می‌شود:

      قطعه کد به کار گرفته شده در واقع یک Fetch API است و URL

       را به JSONPlaceholder API ارسال می‌کند. سپس پاسخ دریافت می‌شود. با این حال، پاسخی که دریافت شده است، فایل JSON نیست، بلکه یک شی است که بسته به کاری که از آن خواسته می‌شود باید عملیاتی را روی آن انجام داد، سپس می‌توان از آن استفاده کرد. برای تبدیل شی برگشتی به JSON، می‌توان متد json()

       ‎را به کار گرفت. برای این کار باید از متد then()‎

       استفاده شود که حاوی تابعی با پارامتری به نام response

       است:

      آموزش رایگان جاوا اسکریپت JavaScript – سریع و آسان در ۱۵۰ دقیقه
      فیلم آموزش رایگان جاوا اسکریپت JavaScript – سریع و آسان در ۱۵۰ دقیقه در تم آف

      کلیک کنید

      پارامتر response

      ، مقدار شیئی را می‌گیرد که از fetch(url)

       بازگردانده شده است،. برای این امر از متد json()

      به منظور تبدیل قالب پاسخ به داده JSON استفاده خواهد شد که قطعه کد آن به‌ صورت زیر است:

      داده‌های JSON برای استفاده هنوز نیاز به پردازش دارند. برای این کار یک متد then()‎

      دیگر همراه تابعی باید اضافه شود که این متد آرگومانی به نام data

       دارد و قطعه کد مربوط به آن به صورت زیر است:

      در این تابع، متغیری به نام authors

       باید ایجاد شود که در این جا این متغیر برابر با data

      تنظیم شده است:

      برای هر authors

      باید یک «فهرست عناصر» (Item List) ایجاد شود تا نام آن‌ها را نمایش دهد. متد map()‎

       در جاوا اسکریپت برای این الگو مناسب است و به صورت زیر به کار گرفته خواهد شد:

      در تابع map، متغیری به نام li

       باید ایجاد شود. این متغیر باید برابر با createElement

       به‌ عنوان آرگومان تنظیم شود. همچنین یک h2

       برای نام نویسنده و یک span

       برای ایمیل آن باید ایجاد شود. برای این کار قطعه کد زیر به کار خوهد رفت:

      ویژگی innerHTML

       و «درون‌یابی رشته‌ای» (string interpolation) برای این کار مفید هستند و به‌ صورت قطعه کد زیر به کار خواهند رفت:

      در این مرحله، عناصر DOM باید به appendChild

       وصل شوند که از طریق قطعه کد زیر این کار امکان‌پذیر خواهد بود:

      باید به این نکته توجه داشت که هر عنصر در لیست، به لیست DocumentFragment

       اضافه می‌شود. برای این هدف پس از تکمیل متد map

       ، عناصر list

       به عنصر لیست نامرتب ul

       اضافه می‌شوند. با تکمیل کار هر دو تابع then()‎

      اکنون می‌توان تابع catch()‎

       را اضافه کرد. این تابع خطای احتمالی را در کنسول ثبت می‌کند و به‌ صورت قطعه کد زیر به کار خواهد رفت.

      کد کامل درخواست ایجاد شده با متد Fetch در جاوا اسکریپت به‌ صورت زیر خواهد بود:

      Authors

        در مثال ارائه‌ شده تا این مرحله، درخواست GET با استفاده از JSONPlaceholder API و Fetch API با موفقیت انجام شد. در مرحله بعد درخواست‌ POST با استفاده از JSONPlaceholder API مورد بررسی قرار خواهد گرفت.

        آموزش کاربردی برنامه نویسی جی کوئری jQuery
        فیلم آموزش کاربردی برنامه نویسی جی کوئری jQuery در تم آف

        کلیک کنید

        ارسال شی Request با متد Fetch در جاوا اسکریپت

        می‌توان با استفاده از متد Fetch در جاوا اسکریپت، یک شی Request

         ارسال کرد که قطعه کد آن به‌ صورت زیر خواهد بود:

        const url = 'https://jsonplaceholder.typicode.com/users';
        
        let data = {
        
          name: 'Sammy'
        
        }
        
        let request = new Request(url, {
        
          method: 'POST',
        
          body: JSON.stringify(data),
        
          headers: new Headers({
        
            'Content-Type': 'application/json; charset=UTF-8'
        
          })
        
        });
        
        
        
        
        fetch(request)
        
          .then(function() {
        
            // Handle response you get from the API
        
          });

        با این رویکرد، درخواست می‌تواند به‌عنوان تنها آرگومان برای fetch، جایگزین url

         و fetchData

         استفاده شود.

        مثال کاربردی از fetch  در جاوا اسکریپت

        در این بخش، مثال کاربردی دیگر از متد Fetch در جاوا اسکریپت ارائه می‌شود. برای این کار ابتدا باید فایل جاوا اسکریپت و فایل HTML لازم ساخته شوند. سپس باید URL API در یک متغیر (در اینجا api_url

        است) ذخیره شود. در این مثال یک تابع async (در اینجا getapi()‎

         است) تعریف و api_url

        در آن تابع ارسال‌ شده است. همچنین در این مثال یک response

         ثابت تعریف شده است و داده‌های واکشی شده با روش await fetch()

         ‎ذخیره ‌شده‌اند.

        برای این هدف یک داده ثابت تعریف شده است و داده‌ها در قالب JSON با روش await answer.json()‎

         ذخیره ‌شده‌اند. اکنون با اجرای قطعه کد مربوط به آن، داده‌ها از API با متد fetch در متغیر داده دریافت می‌شوند. این متغیر داده را به تابعی منتقل می‌کند که داده‌های واکشی شده را نشان می‌دهد. تابع show

         متغیر داده را می‌گیرد و با اعمال حلقه در data.list

         و نشان دادن تمام سطرها، تمام داده‌ها را در کنسول ذخیره می‌کند. در این مثال نیز ویژگی innerHTML در فایل HTML تنظیم و به کار گرفته شده است.

        • نکته: در اینجا API مورد استفاده حاوی جزئیات کارمندان به شکل جفت کلید-مقدار از آدرس زیر است.
        https://employeedetails.free.beeceptor.com/my/api/path

        قطعه کد جاوا اسکریپت مربوط به این مثال:

        // api url
        const api_url =
        	"https://employeedetails.free.beeceptor.com/my/api/path";
        
        // Defining async function
        async function getapi(url) {
        	
        	// Storing response
        	const response = await fetch(url);
        	
        	// Storing data in form of JSON
        	var data = await response.json();
        	console.log(data);
        	if (response) {
        		hideloader();
        	}
        	show(data);
        }
        // Calling that async function
        getapi(api_url);
        
        // Function to hide the loader
        function hideloader() {
        	document.getElementById('loading').style.display = 'none';
        }
        // Function to define innerHTML for HTML table
        function show(data) {
        	let tab =
        		`
        		Name
        		Office
        		Position
        		Salary
        		`;
        	
        	// Loop to access all rows
        	for (let r of data.list) {
        		tab += `
        	${r.name} 
        	${r.office}
        	${r.position}
        	${r.salary}		
        `;
        	}
        	// Setting innerHTML as tab variable
        	document.getElementById("employees").innerHTML = tab;
        }
        

        قطعه کد HTML مربوط به این مثال:

        
        
        	
        		
        		
        		
        		
        		Document
        	
        	
        		
        		
        Loading...

        Registered Employees

        خروجی این مثال از متد Fetch در جاوا اسکریپت به صورت تصویر زیر در کنسول نمایش داده خواهد شد و درخواست ارسال شده برای هر کارمند اطلاعاتی مانند نام، اداره، موقعیت شغلی و میزان دستمزد را برمی‌گرداند :

        نحوه استفاده از متد fetch

        سخن پایانی

        متد fetch یکی از پرکاربردترین متدها در جاوا اسکریپت برای ارسال درخواست به API-های مختلف است. در این مطلب آموزشی از مجله تم آف، متد Fetch در جاوا اسکریپت و نحوه به کار گرفتن آن مورد بررسی قرار گرفت. همچنین در ادامه و پس از آشنایی با این متد، در قالب مثالی عملی، نحوه استفاده از این متد با درخواست‌های GET و POST آموزش داده شد و در آخر سر یک مثال کابردی دیگر برای آموزش آن مورد استفاده قرار گرفت. امید است که مطلب فوق برای شما مثمر ثمر واقع‌ شده باشد.

        دیدگاهتان را بنویسید

        نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

        This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.