ری اکت React یک کتابخانه فرانت اند frontend محبوب است که توسعه دهندگان از آن برای ایجاد برنامه های کاربردی استفاده می کنند. و اگر میخواهید برنامههای آماده تولید بسازید، باید APIها را در برنامه React خود ادغام کنید.
هر توسعهدهندهای که میخواهد برنامههای وب مدرن و قوی با ری اکت React بسازد، باید بداند که چگونه از APIها برای واکشی دادهها در برنامههای React خود استفاده کند.
در این راهنمای مبتدیان، نحوه استفاده از RESTful API را در React، از جمله واکشی fetching، حذف و افزودن داده ها یاد خواهید گرفت. ما همچنین به دو روش اصلی برای تغذیه RESTful API و نحوه استفاده از آنها با هوک های ری اکت React hooks خواهیم پرداخت.
اگر تا به حال زمانی را صرف برنامه نویسی یا تحقیق در مورد برنامه نویسی کرده اید، احتمالاً با اصطلاح "API" برخورد کرده اید.
این عبارت مخفف چیست؟ API مخفف Application Programming Interface است. این رسانه ای است که به برنامه های مختلف اجازه می دهد تا به صورت برنامه نویسی با یکدیگر ارتباط برقرار کنند و پاسخی را در زمان واقعی برگردانند.
"روی فیلدینگ Roy Fielding" در سال 2000، REST را به عنوان یک سبک معماری و روشی که معمولاً در توسعه خدمات اینترنتی مانند سیستم های ابررسانه ای توزیع شده distributed hypermedia systems استفاده می شود، تعریف کرد. این عبارت مخفف "REpresentational State Transfer" است.
هنگامی که درخواستی از طریق یک REST API انجام می شود، نمایشی از وضعیت فعلی current state منبع برای درخواست کننده requester یا نقطه پایانی endpoint ارسال می کند. این نمایش حالت state representation می تواند به شکل JSON (نمادگذاری ابجکت جاوا اسکریپت= JavaScript Object Notation)، XML یا HTML باشد.
پس متوجه شدید فرمت انتقال به یکی از سه شکلی است که در پاراگراف قبلی بیان شد اما:
جیسون JSON پرکاربردترین فرمت فایل است زیرا مستقل از زبان است و هم توسط انسان و هم ماشین قابل خواندن است.
یک مثال:
[ { "userId": 1, "id": 1, "title": "sunt excepturi", "body": "quia et suscipit\nsuscipit recusandae consequuntur " }, { "userId": 1, "id": 2, "title": "qui est esse", "body": "est rerum tempore vitae\nsequi sint nihil" } ]
اگر کدها در مثال بالا به هم ریخته نمایش داده میشوند به عکس زیر توجه نمایید:
اکنون درباره عملکرد Rest API به تصویر زیر دقت فرمایید.
عناصر کلیدی پارادایم REST API عبارتند از:
برای دسترسی به یک منبع resource، مشتری یک درخواست ارسال می کند . سپس، سرور یک پاسخ از داده های کدگذاری شده روی منبع تولید می کند. هر دو نوع پیام REST خود توصیفی self-descriptive هستند، به این معنی که حاوی اطلاعاتی در مورد نحوه تفسیر و پردازش خودشان هستند.
هر درخواست REST شامل چهار بخش اساسی است: یک متد HTTP، یک نقطه پایانی endpoint، هدر و یک بدنه.
یک متد HTTP توصیف می کند که با یک منبع چه کاری باید انجام شود . چهار متد اساسی وجود دارد که اپراتورهای CRUD نیز نامیده می شود:
یک نقطه پایانی endpoint حاوی یک شناسه منبع یکنواخت (URI) است که نشان می دهد کجا و چگونه منبع را در اینترنت پیدا کنید. متداول ترین نوع URI یک مکان منبع منحصر به فرد (URL) است که به عنوان یک آدرس وب کامل عمل می کند.
هدرها Headers اطلاعات مربوط به مشتری و سرور را ذخیره می کنند. به طور عمده، هدرها دادههای احراز هویت را ارائه میکنند - مانند یک کلید API، نام یا آدرس IP رایانهای که سرور در آن نصب شده است، و اطلاعات مربوط به فرمت پاسخ.
یک بدنه body برای انتقال اطلاعات اضافی به سرور استفاده می شود. به عنوان مثال، ممکن است بخشی از داده باشد که می خواهید اضافه یا جایگزین کنید.
درباره چیستی و چگونگی کار کردن آن میشود بیشتر حرف زدن ولی هدف این پست استفاده از آن در عمل در ری اکت است.
شما می توانید REST APIs (رست اِی پی آی ها) را در یک برنامه React به روش های مختلف به کار بگیرید، اما در این راهنما، من به دو مورد از محبوب ترین رویکردها خواهم پرداخت: Axios (یک کلاینت مبتنی بر HTTP = promise-based HTTP client) و Fetch API (اِی پی آی وب بومی مرورگر browser in-built web API ).
توجه: برای درک کامل این راهنما، باید با جاوا اسکریپت، ری اکت React , هوک های ری اکت آشنا باشید، زیرا آنها در مرکز این موضوع و آموزش هستند.
قبل از اینکه چگونگی به کارگیری API ها را بیان کنم، مهم است که بدانیم به کارگیری API در React با چگونگی انجام آن در جاوا اسکریپت بسیار متفاوت است. زیرا این درخواست ها اکنون در یک کامپوننت ری اکت React Component انجام می شود.
در اینجا، ما از کامپوننت های تابعی (فانکشنال) functional components استفاده خواهیم کرد، به این معنی که باید از دو هوک ری اکت React Hook اصلی استفاده کنیم:
useEffect
هوک انجام می دهیم. یا بلافاصله پس از نصب mount برنامه یا پس از رسیدن به یک state خاص، رندر می شود. این ساختار کلی است که ما استفاده خواهیم کرد:useEffect(() => { // data fetching here : واکشی داده اینجا نوشته میشود }, [ ]);
const [posts, setPosts] = useState([ ]);
اکنون بیایید به موضوع اصلی این راهنما بپردازیم، جایی که نحوه دریافت، افزودن و حذف داده ها را با استفاده از JSONPlaceholder posts API یاد خواهیم گرفت . این دانش برای هر نوع API قابل استفاده است، زیرا این راهنما برای مبتدیان در نظر گرفته شده است.
باید بدانید: Fetch API یک متد بومی جاوا اسکریپت برای بازیابی منابع از سرور یا نقطه پایانی API است. از آنجایی که بومی است، بنابراین نیازی به نصب هیچ گونه وابستگی یا بسته ای ندارید.
این متد fetch
به یک آرگومان اجباری نیاز دارد که مسیر یا URL منبعی است که میخواهیم fetch کنیم. سپس یک Promise را برمیگرداند تا بتوانید با استفاده از متدهای then
و catch
موفقیت یا شکست را مدیریت کنید.
یک درخواست fetch واکشی اولیه برای نوشتن بسیار ساده است و شبیه کد زیر است. ما به سادگی دادهها را از یک URL دریافت میکنیم که دادهها را به صورت JSON برمیگرداند و سپس آن را به کنسول وارد میکنیم:
fetch('https://jsonplaceholder.typicode.com/posts?_limit=10') /دریافت داده .then(response => response.json()) /برگرداندن به صورت جیسون .then(data => console.log(data)); /نمایش در کنسول
پاسخ پیشفرض معمولاً یک پاسخ HTTP معمولی است نه یک جیسون JSON واقعی، اما میتوانیم خروجی خود را به عنوان یک ابجکت جیسون (JSON object) با استفاده از متد response.json دریافت کنیم.
می توانید از روش HTTP GET برای درخواست داده از نقطه پایانی استفاده کنید.
همانطور که قبلا گفته شد، Fetch API یک آرگومان اجباری را می پذیرد که true است. همچنین یک آرگومان اختیاری را می پذیرد که الزامی در استفاده از آن نیست، به ویژه هنگام استفاده از متد GET، که پیش فرض است. اما برای متدهای دیگر چطور؟ برای متدهای دیگر مثل POST و DELETE، باید متد را به آرایه وصل کنید:
fetch(url, /لینک دریافت داده { method: "GET" // پیشفرض، پس میتوانیم نادیده بگیریم } )
تا اینجا، روش کار را یاد گرفتیم، بنابراین بیایید همه چیزهایی را که یاد گرفتهایم کنار هم بگذاریم و یک درخواست دریافت (get request) برای واکشی دادهها (fetch data) از API خود انجام دهیم.
در اینجا ما بازهم از API آنلاین رایگان JSONPlaceholder برای واکشی fetch فهرستی از پستها در اپلیکیشن خود استفاده خواهیم کرد :
import React, { useState, useEffect } from 'react'; const App = () => { const [posts, setPosts] = useState([ ]); useEffect(() => { fetch('https://jsonplaceholder.typicode.com/posts?_limit=10') .then( (response) => response.json( ) ) .then((data) => { console.log(data); setPosts(data); }) .catch((err) => { console.log(err.message); }); }, [ ]); return ( // ... به کار گرفتن داده ها در اینجا اتفاق می افتد ); };
اکنون در ادامه میخواهیم کد بالا را تکه تکه توضیح دهیم:
اول) ما یک state ایجاد کردیم تا دادههایی را که از API بازیابی میکنیم ذخیره کنیم تا بتوانیم آنها را بعداً در برنامه خود به کار بگیریم. همچنین مقدار پیش فرض را روی یک آرایه خالی قرار می دهیم:
const [posts, setPosts] = useState([ ]);
سپس) عملیات اصلی در حالت useEffect رخ داد، به طوری که داده ها یا پست ها به محض بارگیری برنامه واکشی fetch می شوند. درخواست واکشی fetch یک promise برمیگرداند که می توانیم آن را بپذیریم یا رد کنیم:
useEffect(() => { fetch('https://jsonplaceholder.typicode.com/posts?_limit=10') .then( (response) => console.log(response) ); }, [ ] );
اکنون میخواهم تکه کد بالا را برای شما توضیح دهم:
این response دربردارنده مقدار زیادی داده است، مانند status code کد وضعیت، text متن و اطلاعات دیگری که بعداً برای رسیدگی به خطاها باید داشته باشیم.
>> تا اینجا، با then
سر و کار داشتیم، اما آن یک ابجکت response برمیگرداند، که چیزی که ما میخواهیم نیست.
>> بنابراین باید آبجکت Response را با فرمت JSON با استفاده از متدjson
دریافت کنیم. این همچنین به ما یک promise برمیگرداند که داده های واقعی را با استفاده از then
دوم بدست آوریم:
useEffect(( ) => { fetch('https://jsonplaceholder.typicode.com/posts?_limit=10') .then((response) => response.json( )) .then((data) => { console.log(data); setPosts(data); }); }, [ ]);
اگر به کنسول نگاه کنیم، خواهیم دید که 10 پست را از API خود بازیابی کردهایم که آنها را نیز به state که قبلاً تعیین کردهایم تنظیم کردهایم.
این کامل نیست زیرا ما فقط با دریافت promise سر و کار داشتیم و نه رد promise، پس اکنون با استفاده از متد catch
این را مدیریت میکنیم. در واقع اگر داده را مطابق خواسته، دریافت کنیم که آن را در setPost ذخیره میکنیم، اما اگر خطایی رخ دهد، این خطا در دریافت داده را با متد catch مدیریت میکنیم و آن را در کنسول نمایش میدهیم :
useEffect(( ) => { fetch('https://jsonplaceholder.typicode.com/posts?_limit=10') .then((response) => response.json( )) .then((data) => { console.log(data); setPosts(data); }) .catch((err) => { console.log(err.message); }); }, [ ]);
بسیار خوب، تا اینجا کدی را که نوشتیم تکه تکه توضیح دادیم. اکنون میخواهم در ادامه قسمت پایانی که کد که پس از return به صورت کامنت نوشتم: // ... به کار گرفتن داده ها در اینجا اتفاق می افتد ، را بنویسم.
تا اینجا، چگونگی اجرای درخواست یک GET
را دیده ایم. این می تواند به راحتی با looping حلقه زدن در آرایه ما به کار گرفته شود.
const App = ( ) => { // ... تا اینجا کدهای مورد نظرمان را نوشتیم return ( <div className="posts-container"> {posts.map((post) => { return ( <div className="post-card" key={post.id}> <h2 className="post-title">{post.title}</h2> <p className="post-body">{post.body}</p> <div className="button"> <div className="delete-btn">Delete</div> </div> </div> ); })} </div> ); }; export default App;