واکشی API

این کد لبه بخشی از دوره آموزشی Developing Progressive Web Apps است که توسط تیم آموزشی Google Developers ایجاد شده است. اگر به ترتیب روی کدها کار کنید، بیشترین ارزش را از این دوره خواهید گرفت.

برای جزئیات کامل در مورد دوره، به نمای کلی توسعه برنامه های وب پیشرفته مراجعه کنید .

مقدمه

این آزمایشگاه شما را با استفاده از Fetch API ، یک رابط ساده برای واکشی منابع و بهبودی نسبت به XMLHttpRequest API راهنمایی می کند.

چیزی که یاد خواهید گرفت

  • نحوه استفاده از Fetch API برای درخواست منابع
  • نحوه ایجاد درخواست های GET، HEAD و POST با واکشی
  • نحوه خواندن و تنظیم هدرهای سفارشی
  • استفاده و محدودیت های CORS

آنچه شما باید بدانید

  • جاوا اسکریپت و HTML پایه
  • آشنایی با مفهوم و سینتکس اولیه ES2015 Promises

آنچه شما نیاز خواهید داشت

  • کامپیوتر با دسترسی ترمینال/پوسته
  • اتصال به اینترنت
  • مرورگری که از Fetch پشتیبانی می کند
  • یک ویرایشگر متن
  • گره و npm

توجه: اگرچه Fetch API در حال حاضر در همه مرورگرها پشتیبانی نمی‌شود ، یک polyfill وجود دارد.

مخزن pwa-training-labs را از github دانلود یا کلون کنید و در صورت نیاز نسخه LTS Node.js را نصب کنید.

خط فرمان کامپیوتر خود را باز کنید. به دایرکتوری fetch-api-lab/app/ بروید و یک سرور توسعه محلی راه اندازی کنید:

cd fetch-api-lab/app
npm install
node server.js

شما می توانید سرور را در هر زمان با Ctrl-c خاتمه دهید.

مرورگر خود را باز کنید و به localhost:8081/ بروید. شما باید صفحه ای با دکمه هایی برای درخواست ها ببینید (هنوز کار نمی کنند).

توجه: همه سرویس‌کاران را لغو ثبت کنید و تمام کش‌های سرویس‌کار را برای لوکال هاست پاک کنید تا با آزمایشگاه تداخل نداشته باشند. در Chrome DevTools، می‌توانید با کلیک کردن بر روی پاک کردن داده‌های سایت از بخش پاک کردن فضای ذخیره‌سازی تب Application به این مهم دست یابید.

پوشه fetch-api-lab/app/ را در ویرایشگر متن دلخواه خود باز کنید. app/ پوشه جایی است که آزمایشگاه را می سازید.

این پوشه شامل:

  • echo-servers/ حاوی فایل هایی است که برای اجرای سرورهای آزمایشی استفاده می شود
  • examples/ شامل منابع نمونه ای است که ما در آزمایش واکشی استفاده می کنیم
  • js/main.js جاوا اسکریپت اصلی برنامه است و جایی است که همه کدهای خود را می نویسید.
  • index.html صفحه اصلی HTML برای نمونه سایت/برنامه ما است
  • package-lock.json و package.json فایل های پیکربندی برای سرور توسعه ما و وابستگی های سرور اکو هستند
  • server.js یک سرور توسعه گره است

Fetch API یک رابط نسبتا ساده دارد. این بخش نحوه نوشتن یک درخواست اولیه HTTP با استفاده از fetch را توضیح می دهد.

یک فایل JSON واکشی کنید

در js/main.js ، دکمه Fetch JSON برنامه به تابع fetchJSON متصل است.

برای درخواست فایل examples/animals.json و ثبت پاسخ، تابع fetchJSON به روز کنید:

function fetchJSON() {
  fetch('examples/animals.json')
    .then(logResult)
    .catch(logError);
}

اسکریپت را ذخیره کنید و صفحه را تازه کنید. روی Fetch JSON کلیک کنید. کنسول باید پاسخ واکشی را ثبت کند.

توضیح

متد fetch مسیر منبعی را که می خواهیم به عنوان پارامتر بازیابی کنیم، در این مورد examples/animals.json می پذیرد. fetch وعده ای را برمی گرداند که به یک شی Response حل می شود. اگر وعده حل شود، پاسخ به تابع logResult ارسال می شود. اگر وعده رد شود، catch می گیرد و خطا به تابع logError منتقل می شود.

اشیاء پاسخ نشان دهنده پاسخ به یک درخواست هستند. آنها حاوی بدن پاسخ و همچنین خواص و روش های مفید هستند.

تست پاسخ های نامعتبر

پاسخ ثبت شده در کنسول را بررسی کنید. به مقادیر ویژگی های status ، url و ok توجه کنید.

منبع examples/animals.json را در fetchJSON با examples/non-existent.json جایگزین کنید. تابع fetchJSON به روز شده اکنون باید به شکل زیر باشد:

function fetchJSON() {
  fetch('examples/non-existent.json')
    .then(logResult)
    .catch(logError);
}

اسکریپت را ذخیره کنید و صفحه را تازه کنید. دوباره روی Fetch JSON کلیک کنید تا این منبع موجود را واکشی کنید.

توجه داشته باشید که واکشی با موفقیت انجام شد و بلوک catch فعال نکرد. اکنون ویژگی های status ، URL و ok پاسخ جدید را پیدا کنید.

مقادیر باید برای دو فایل متفاوت باشد (می دانید چرا؟). اگر خطای کنسول دارید، آیا مقادیر با زمینه خطا مطابقت دارند؟

توضیح

چرا پاسخ ناموفق بلوک catch را فعال نکرد؟ این یک نکته مهم برای واکشی و وعده‌ها است - پاسخ‌های بد (مانند 404s) هنوز برطرف می‌شوند! یک وعده واکشی تنها در صورتی رد می‌شود که درخواست قادر به تکمیل نباشد، بنابراین همیشه باید اعتبار پاسخ را بررسی کنید. در بخش بعدی پاسخ ها را تایید می کنیم.

برای اطلاعات بیشتر

اعتبار پاسخ را بررسی کنید

برای بررسی اعتبار پاسخ ها باید کد خود را به روز کنیم.

در main.js ، یک تابع برای اعتبارسنجی پاسخ ها اضافه کنید:

function validateResponse(response) {
  if (!response.ok) {
    throw Error(response.statusText);
  }
  return response;
}

سپس کد زیر را جایگزین fetchJSON کنید:

function fetchJSON() {
  fetch('examples/non-existent.json')
    .then(validateResponse)
    .then(logResult)
    .catch(logError);
}

اسکریپت را ذخیره کنید و صفحه را تازه کنید. روی Fetch JSON کلیک کنید. کنسول رو چک کن اکنون پاسخ برای examples/non-existent.json باید بلوک catch فعال کند.

examples/non-existent.json را در تابع fetchJSON با examples/animals.json اصلی جایگزین کنید. تابع به روز شده اکنون باید به شکل زیر باشد:

function fetchJSON() {
  fetch('examples/animals.json')
    .then(validateResponse)
    .then(logResult)
    .catch(logError);
}

اسکریپت را ذخیره کنید و صفحه را تازه کنید. روی Fetch JSON کلیک کنید. باید ببینید که پاسخ مانند قبل با موفقیت ثبت شده است.

توضیح

اکنون که چک validateResponse را اضافه کرده‌ایم، پاسخ‌های بد (مانند 404s) یک خطا ایجاد می‌کنند و catch می‌گیرد. این به ما امکان می دهد پاسخ های ناموفق را مدیریت کنیم و از انتشار پاسخ های غیرمنتظره در زنجیره واکشی جلوگیری می کند.

پاسخ را بخوانید

پاسخ‌های واکشی به‌عنوان ReadableStreams ( مشخصات جریان‌ها ) نشان داده می‌شوند و برای دسترسی به بدنه پاسخ باید خوانده شوند. اشیاء پاسخ متدهایی برای انجام این کار دارند.

در main.js ، یک تابع readResponseAsJSON با کد زیر اضافه کنید:

function readResponseAsJSON(response) {
  return response.json();
}

سپس تابع fetchJSON با کد زیر جایگزین کنید:

function fetchJSON() {
  fetch('examples/animals.json') // 1
  .then(validateResponse) // 2
  .then(readResponseAsJSON) // 3
  .then(logResult) // 4
  .catch(logError);
}

اسکریپت را ذخیره کنید و صفحه را تازه کنید. روی Fetch JSON کلیک کنید. کنسول را بررسی کنید تا ببینید JSON از examples/animals.json در حال ثبت است (به جای شی Response).

توضیح

بیایید مرور کنیم که چه اتفاقی می افتد.

مرحله 1. Fetch در یک منبع، examples/animals.json فراخوانی می شود. Fetch وعده ای را برمی گرداند که به یک شی Response حل می شود. وقتی وعده حل شد، شی پاسخ به validateResponse ارسال می شود.

مرحله 2. validateResponse بررسی می کند که آیا پاسخ معتبر است (آیا 200 است؟). اگر اینطور نیست، خطایی ایجاد می‌شود، از بقیه بلوک‌های then صرفنظر می‌شود و بلوک catch فعال می‌شود. این امر به ویژه مهم است. بدون این بررسی، پاسخ‌های بد به زنجیره منتقل می‌شوند و ممکن است کدهای بعدی را که ممکن است متکی به دریافت پاسخ معتبر باشد، بشکنند. اگر پاسخ معتبر باشد، به readResponseAsJSON ارسال می شود.

مرحله 3. readResponseAsJSON بدنه پاسخ را با استفاده از متد Response.json() می خواند. این روش یک وعده را برمی گرداند که به JSON حل می شود. پس از رفع این وعده، داده های JSON به logResult ارسال می شود. (اگر وعده response.json() رد شود، بلوک catch راه اندازی می شود.)

مرحله 4. در نهایت، داده های JSON از درخواست اصلی به examples/animals.json توسط logResult ثبت می شود.

برای اطلاعات بیشتر

واکشی به JSON محدود نمی شود. در این مثال ما یک تصویر واکشی می کنیم و آن را به صفحه اضافه می کنیم.

در main.js یک تابع showImage با کد زیر بنویسید:

function showImage(responseAsBlob) {
  const container = document.getElementById('img-container');
  const imgElem = document.createElement('img');
  container.appendChild(imgElem);
  const imgUrl = URL.createObjectURL(responseAsBlob);
  imgElem.src = imgUrl;
}

سپس یک تابع readResponseAsBlob اضافه کنید که پاسخ ها را به صورت Blob می خواند:

function readResponseAsBlob(response) {
  return response.blob();
}

تابع fetchImage با کد زیر به روز کنید:

function fetchImage() {
  fetch('examples/fetching.jpg')
    .then(validateResponse)
    .then(readResponseAsBlob)
    .then(showImage)
    .catch(logError);
}

اسکریپت را ذخیره کنید و صفحه را تازه کنید. روی Fetch image کلیک کنید. شما باید یک سگ شایان ستایش را ببینید که یک چوب را در صفحه می آورد (این یک شوخی است!).

توضیح

در این مثال یک تصویر در حال واکشی است، examples/fetching.jpg . درست مانند تمرین قبلی، پاسخ با validateResponse تایید می شود. سپس پاسخ به صورت Blob خوانده می شود (به جای JSON مانند بخش قبل). یک عنصر تصویر ایجاد می‌شود و به صفحه اضافه می‌شود، و ویژگی src تصویر روی یک URL داده‌ای تنظیم می‌شود که نشان‌دهنده Blob است.

توجه: متد createObjectURL() شی URL برای تولید URL داده ای که نشان دهنده Blob است استفاده می شود. این مهم است که توجه داشته باشید. شما نمی توانید منبع تصویر را مستقیماً روی Blob تنظیم کنید. Blob باید به URL داده تبدیل شود.

برای اطلاعات بیشتر

این بخش یک چالش اختیاری است.

تابع fetchText را به روز کنید

  1. واکشی /examples/words.txt
  2. پاسخ را با validateResponse تایید کنید
  3. پاسخ را به صورت متن بخوانید (اشاره: Response.text() را ببینید)
  4. و متن را در صفحه نمایش دهید

می توانید از این تابع showText به عنوان کمکی برای نمایش متن نهایی استفاده کنید:

function showText(responseAsText) {
  const message = document.getElementById('message');
  message.textContent = responseAsText;
}

اسکریپت را ذخیره کنید و صفحه را تازه کنید. روی Fetch text کلیک کنید. اگر fetchText به درستی پیاده سازی کرده اید، باید متن اضافه شده را در صفحه مشاهده کنید.

توجه: اگرچه ممکن است واکشی HTML و اضافه کردن آن با استفاده از ویژگی innerHTML وسوسه انگیز باشد، مراقب باشید. این می تواند سایت شما را در معرض حملات اسکریپت بین سایتی قرار دهد!

برای اطلاعات بیشتر

به طور پیش فرض، واکشی از متد GET استفاده می کند که یک منبع خاص را بازیابی می کند. اما واکشی می تواند از سایر روش های HTTP نیز استفاده کند.

درخواست HEAD کنید

تابع headRequest را با کد زیر جایگزین کنید:

function headRequest() {
  fetch('examples/words.txt', {
    method: 'HEAD'
  })
  .then(validateResponse)
  .then(readResponseAsText)
  .then(logResult)
  .catch(logError);
}

اسکریپت را ذخیره کنید و صفحه را تازه کنید. روی درخواست HEAD کلیک کنید. توجه داشته باشید که محتوای متن ثبت شده خالی است.

توضیح

متد fetch می تواند دومین پارامتر اختیاری، init دریافت کند. این پارامتر پیکربندی درخواست واکشی را فعال می‌کند، مانند روش درخواست ، حالت حافظه پنهان، اعتبارنامه‌ها و موارد دیگر .

در این مثال، با استفاده از پارامتر init ، متد درخواست واکشی را روی HEAD قرار دادیم. درخواست‌های HEAD درست مانند درخواست‌های GET هستند، با این تفاوت که متن پاسخ خالی است. این نوع درخواست زمانی قابل استفاده است که تمام چیزی که می خواهید ابرداده در مورد یک فایل است اما نیازی به انتقال تمام داده های فایل ندارید.

اختیاری: اندازه یک منبع را بیابید

برای تعیین اندازه فایل، اجازه دهید به سرصفحه‌های پاسخ واکشی برای examples/words.txt نگاه کنیم.

تابع headRequest را به‌روزرسانی کنید تا ویژگی content-length headers پاسخ را ثبت کنید (نکته: مستندات سرصفحه‌ها و روش دریافت را ببینید).

پس از به روز رسانی کد، فایل را ذخیره کرده و صفحه را Refresh کنید. روی درخواست HEAD کلیک کنید. کنسول باید اندازه examples/words.txt را (بر حسب بایت) ثبت کند.

توضیح

در این مثال، روش HEAD برای درخواست اندازه (بر حسب بایت) یک منبع (که در سربرگ content-length نشان داده شده است) بدون بارگیری واقعی خود منبع استفاده می شود. در عمل می توان از این برای تعیین اینکه آیا منبع کامل باید درخواست شود (یا حتی نحوه درخواست آن) استفاده می شود.

اختیاری : اندازه examples/words.txt را با استفاده از روش دیگری بیابید و تأیید کنید که با مقدار سرصفحه پاسخ مطابقت دارد (می‌توانید نحوه انجام این کار را برای سیستم عامل خاص خود جستجو کنید - امتیازهای جایزه برای استفاده از خط فرمان!).

برای اطلاعات بیشتر

Fetch همچنین می‌تواند داده‌ها را با درخواست‌های POST ارسال کند.

یک سرور اکو راه اندازی کنید

برای این مثال باید یک سرور اکو را اجرا کنید. از دایرکتوری fetch-api-lab/app/ دستور زیر را اجرا کنید (اگر خط فرمان توسط سرور localhost:8081 مسدود شده است، یک پنجره یا تب جدید خط فرمان را باز کنید):

node echo-servers/cors-server.js

این دستور یک سرور ساده را در localhost:5000/ راه اندازی می کند که درخواست های ارسال شده به آن را بازتاب می دهد.

شما می توانید این سرور را در هر زمان با ctrl+c خاتمه دهید.

درخواست POST کنید

تابع postRequest را با کد زیر جایگزین کنید (مطمئن شوید که تابع showText را از بخش 4 تعریف کرده اید اگر بخش را کامل نکرده اید):

function postRequest() {
  fetch('http://localhost:5000/', {
    method: 'POST',
    body: 'name=david&message=hello'
  })
    .then(validateResponse)
    .then(readResponseAsText)
    .then(showText)
    .catch(logError);
}

اسکریپت را ذخیره کنید و صفحه را تازه کنید. روی ارسال درخواست کلیک کنید. به درخواست ارسالی که در صفحه منعکس شده است توجه کنید. باید حاوی نام و پیام باشد (توجه داشته باشید که هنوز اطلاعاتی از فرم دریافت نمی کنیم).

توضیح

برای ایجاد یک درخواست POST با fetch، از پارامتر init برای تعیین متد استفاده می کنیم (مشابه نحوه تنظیم متد HEAD در قسمت قبل). این همان جایی است که بدنه درخواست را تنظیم می کنیم، در این مورد یک رشته ساده. بدنه داده‌ای است که می‌خواهیم ارسال کنیم.

توجه: در تولید، به یاد داشته باشید که همیشه اطلاعات حساس کاربر را رمزگذاری کنید.

هنگامی که داده ها به عنوان یک درخواست POST به localhost:5000/ ارسال می شود، درخواست به عنوان پاسخ بازتاب داده می شود. سپس پاسخ با validateResponse تایید می شود، به صورت متن خوانده می شود و در صفحه نمایش داده می شود.

در عمل، این سرور یک API شخص ثالث را نشان می دهد.

اختیاری: از رابط FormData استفاده کنید

می توانید از رابط FormData برای گرفتن آسان داده ها از فرم ها استفاده کنید.

در تابع postRequest ، یک شی FormData جدید را از عنصر فرم msg-form نمونه سازی کنید:

const formData = new FormData(document.getElementById('msg-form'));

سپس مقدار پارامتر body را با متغیر formData جایگزین کنید.

اسکریپت را ذخیره کنید و صفحه را تازه کنید. فرم (فیلدهای نام و پیام ) را در صفحه پر کنید و سپس روی ارسال درخواست کلیک کنید. به محتوای فرم نمایش داده شده در صفحه توجه کنید.

توضیح

سازنده FormData می تواند یک form HTML بگیرد و یک شی FormData ایجاد کند. این شی با کلیدها و مقادیر فرم پر شده است.

برای اطلاعات بیشتر

یک سرور اکو غیر cors راه اندازی کنید

سرور قبلی اکو را متوقف کنید (با فشار دادن ctrl+c از خط فرمان) و با اجرای دستور زیر یک echo server جدید را از پوشه fetch-lab-api/app/ راه اندازی کنید:

node echo-servers/no-cors-server.js

این دستور یک سرور اکو ساده دیگر را راه اندازی می کند، این بار در localhost:5001/ . با این حال، این سرور برای پذیرش درخواست های متقاطع پیکربندی نشده است.

واکشی از سرور جدید

اکنون که سرور جدید در localhost:5001/ اجرا می‌شود، می‌توانیم یک درخواست واکشی برای آن ارسال کنیم.

تابع postRequest را برای واکشی از localhost:5001/ به جای localhost:5000/ به روز کنید. پس از به‌روزرسانی کد، فایل را ذخیره کنید، صفحه را بازخوانی کنید و سپس روی POST Request کلیک کنید.

شما باید یک خطا در کنسول دریافت کنید که نشان می دهد درخواست متقاطع مسدود شده است زیرا سرصفحه CORS Access-Control-Allow-Origin وجود ندارد.

fetch در تابع postRequest با کد زیر به‌روزرسانی کنید، که از حالت no-cors استفاده می‌کند (همانطور که گزارش خطا نشان می‌دهد)، و تماس‌های validateResponse و readResponseAsText حذف می‌کند (توضیح زیر را ببینید):

function postRequest() {
  const formData = new FormData(document.getElementById('msg-form'));
  fetch('http://localhost:5001/', {
    method: 'POST',
    body: formData,
    mode: 'no-cors'
  })
    .then(logResult)
    .catch(logError);
}

اسکریپت را ذخیره کنید و صفحه را تازه کنید. سپس فرم پیام را پر کنید و روی POST Request کلیک کنید.

شی پاسخ ثبت شده در کنسول را مشاهده کنید.

توضیح

واکشی (و XMLHttpRequest) از خط مشی مبدا یکسان پیروی می کند. این بدان معنی است که مرورگرها درخواست های HTTP با منبع متقابل را از داخل اسکریپت ها محدود می کنند. درخواست متقاطع زمانی اتفاق می‌افتد که یک دامنه (به عنوان مثال http://foo.com/ ) منبعی را از یک دامنه جداگانه (مثلا http://bar.com/ ) درخواست کند.

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

از آنجایی که سرور برنامه ما دارای شماره پورت متفاوتی نسبت به دو سرور اکو است، درخواست‌ها به هر یک از سرورهای اکو منبع متقابل در نظر گرفته می‌شوند. با این حال، اولین سرور اکو، که در localhost:5000/ اجرا می‌شود، برای پشتیبانی از CORS پیکربندی شده است (می‌توانید echo-servers/cors-server.js را باز کنید و پیکربندی را بررسی کنید). سرور جدید اکو، که روی localhost:5001/ اجرا می‌شود، نیست (به همین دلیل با خطا مواجه می‌شویم).

استفاده از mode: no-cors امکان واکشی یک پاسخ غیر شفاف را فراهم می کند. این اجازه می دهد تا پاسخ را دریافت کنید، اما از دسترسی به پاسخ با جاوا اسکریپت جلوگیری می کند (به همین دلیل است که نمی توانیم validateResponse ، readResponseAsText یا showResponse استفاده کنیم). پاسخ همچنان می تواند توسط API های دیگر مصرف شود یا توسط یک سرویس دهنده ذخیره شود.

هدر درخواست را اصلاح کنید

Fetch همچنین از تغییر هدر درخواست پشتیبانی می کند. سرور اکو localhost:5001 (بدون CORS) را متوقف کنید و سرور اکو localhost:5000 (CORS) را از بخش 6 راه اندازی مجدد کنید:

node echo-servers/cors-server.js

بازیابی نسخه قبلی تابع postRequest که از localhost:5000/ واکشی می شود:

function postRequest() {
  const formData = new FormData(document.getElementById('msg-form'));
  fetch('http://localhost:5000/', {
    method: 'POST',
    body: formData
  })
    .then(validateResponse)
    .then(readResponseAsText)
    .then(showText)
    .catch(logError);
}

اکنون از رابط Header برای ایجاد یک شی Header در داخل تابع postRequest به نام messageHeaders با هدر Content-Type برابر با application/json استفاده کنید.

سپس ویژگی headers شی init را به عنوان متغیر messageHeaders تنظیم کنید.

ویژگی body را به‌روزرسانی کنید تا یک شیء JSON رشته‌دار باشد، مانند:

JSON.stringify({ lab: 'fetch', status: 'fun' })

پس از به روز رسانی کد، فایل را ذخیره کرده و صفحه را Refresh کنید. سپس روی POST Request کلیک کنید.

توجه داشته باشید که درخواست بازتاب داده شده اکنون دارای یک Content-Type of application/json است (برخلاف multipart/form-data که قبلاً داشت).

اکنون یک هدر Content-Length سفارشی به شی messageHeaders اضافه کنید و به درخواست یک اندازه دلخواه بدهید.

پس از به‌روزرسانی کد، فایل را ذخیره کنید، صفحه را تازه‌سازی کنید و روی POST Request کلیک کنید. توجه داشته باشید که این هدر در درخواست بازتابی اصلاح نشده است.

توضیح

رابط Header ایجاد و اصلاح اشیاء Header را امکان پذیر می کند. برخی از سرصفحه ها مانند Content-Type را می توان با واکشی تغییر داد. موارد دیگر، مانند Content-Length ، محافظت می شوند و نمی توان آنها را تغییر داد (به دلایل امنیتی).

هدر درخواست سفارشی را تنظیم کنید

Fetch از تنظیم هدرهای سفارشی پشتیبانی می کند.

هدر Content-Length را از شی messageHeaders در تابع postRequest حذف کنید. هدر سفارشی X-Custom با یک مقدار دلخواه اضافه کنید (به عنوان مثال ' X-CUSTOM': 'hello world' ).

اسکریپت را ذخیره کنید، صفحه را بازخوانی کنید و سپس روی POST Request کلیک کنید.

باید ببینید که درخواست تکرار شده دارای ویژگی X-Custom است که شما اضافه کرده اید.

حالا یک هدر Y-Custom به شی Headers اضافه کنید. اسکریپت را ذخیره کنید، صفحه را بازخوانی کنید و روی POST Request کلیک کنید.

شما باید خطای مشابه این را در کنسول دریافت کنید:

Fetch API cannot load http://localhost:5000/. Request header field y-custom is not allowed by Access-Control-Allow-Headers in preflight response.

توضیح

مانند درخواست های متقاطع، هدرهای سفارشی باید توسط سروری که منبع از آن درخواست شده است پشتیبانی شود. در این مثال، سرور اکو ما به گونه ای پیکربندی شده است که هدر X-Custom را بپذیرد اما هدر Y-Custom نمی پذیرد (شما می توانید echo-servers/cors-server.js را باز کنید و به دنبال Access-Control-Allow-Headers بگردید تا خودتان ببینید). هر زمان که یک هدر سفارشی تنظیم شود، مرورگر یک بررسی قبل از پرواز انجام می دهد. این بدان معنی است که مرورگر ابتدا یک درخواست OPTIONS را به سرور ارسال می کند تا مشخص کند چه روش ها و هدرهای HTTP توسط سرور مجاز است. اگر سرور به گونه ای پیکربندی شده باشد که متد و هدر درخواست اصلی را بپذیرد، ارسال می شود، در غیر این صورت یک خطا ایجاد می شود.

برای اطلاعات بیشتر

کد راه حل

برای دریافت یک کپی از کد کار، به پوشه راه حل بروید.

اکنون می دانید که چگونه از Fetch API استفاده کنید!

منابع

برای مشاهده تمامی کدهای دوره آموزشی PWA به کدلبورد خوش آمدگویی دوره مراجعه کنید/