تفاوت GET و POST: دریافت اطلاعات مختلف از کاربران و ارسال این اطلاعات به سرورهای سایت، بخش مهمی از وظایف یک وب سایت میباشد. داده و اطلاعات ارزش بسیار زیادی دارند و در دنیای مدرن امروزی متخصصانی وجود دارند که شغل آنها کار با دادهها است. حالا سوال پیش میآید که سایتها چطور این دادهها را از کاربران میگیرند؟
مرورگر وب برای ارتباط با سرور از دو متد HTTP معروف با عناوین GET و POST استفاده میکند. این متدها برای ارسال اطلاعات از طرف کاربر به سرور استفاده میشوند و هر کدام مزایا و معایب خودشان را دارند. در ادامه به طور مفصل دربارهی تفاوت GET و POST صحبت خواهیم کرد. با وب سایت آموزش برنامه نویسی سون لرن همراه باشید.
عبارت HTTP مخفف Hyper Text Transfer Protocol بوده و یک پروتکل برای مشخص کردن فرمت اطلاعات و ارسال آنها در شبکه است. علاوه بر آن، HTTP مشخص میکند که وب سرورها و مرورگرها در هنگام مواجه شدن با دستورات مختلف چه واکنشی نشان دهند. با مثال زیر، بهتر متوجه مفهوم HTTP خواهید شد.
زمانی که یک آدرس وب را در مرورگر خود وارد میکنید، در واقع یک درخواست HTTP به وب سرور میفرستید تا آن صفحه وب را واکشی کرده و به شما نشان دهد. دو مفهوم Request و Response یا درخواست/پاسخ در HTTP بسیار مهم هستند. به این شکل که کاربر درخواست (Request) خود را از طریق مرورگر به وب سرور میفرستد. در سرور، پردازش موردنظر روی این درخواست انجام شده و خروجی تولید شده دوباره از طریق پاسخ (Response) به مرورگر کاربر میگردد.
متدهای مختلف پروتکل HTTP عبارتند از:
در ادامه با دو متد اول و تفاوت GET و POST بیشتر آشنا میشوید.
همهی ما روزانه از سایتهای زیادی بازدید میکنیم و فرمهای زیادی را در این سایتها پر میکنیم. فرمهای متداولی که در سایتها استفاده میشوند عبارتند از:
متد Get به طور پیش فرض برای ارسال اطلاعات فرمها به سرور استفاده میشود. این متد دادههای یک فرم را برای سرویس دهنده ارسال میکند، به این شکل که به انتهای URL یک “نام/مقدار” را اضافه کرده و پارامترها را به کمک query string به سرور میفرستد. احتمالا برایتان سوال پیش بیاید که Query String چیست؟ Query String قطعهی متنی است که پس از علامت سوال (؟) در URL میآید. به آدرس زیر دقت کنید:
?sitename =7Learn
راجع به زوج “نام/مقدار” همانطور که از اسم آن میتوانید متوجه شوید، بخش اول نشان دهنده نام مورد نظر ما و دومین بخش نشان دهنده مقدار مورد استفاده برای ذخیره سازی میباشد. زوج “نام/مقدار” به صورت خودکار مقادیر متناظر را از فرم دریافت میکند. یک فرم میتواند شامل textbox، checkbox یا موارد دیگر باشد، پس نام استفاده شده در متد GET همان نام کنترل استفاده شده در فرم بوده و محتویاتی که کاربر در کنترل مورد نظر وارد میکند، مقدار را مشخص میکند.
در مثال بالا بعد از ؟ زوج “نام/مقدار” با عنوان sitename =7Learn آمده که sitename نام مورد نظر ما و 7Learn مقدار مرتبط با آن است. مرورگر زمانی که میخواهد یک صفحه را برای سرویس دهنده ارسال کند، این اطلاعات را به صورت خودکار به انتهای URL اضافه میکند. پس در نهایت آدرس ما به شکل زیر نمایش داده میشود:
https://7learn.com/page.php?sitename=7Learn
به همراه یک URL میتوان بیشتر از یک زوج “مقدار/نام” را ارسال کرد. برای این کار باید هر زوج “مقدار/نام” را با علامت “&” (که به آن ampersand نیز گفته میشود) از یکدیگر جدا کنیم. در کد زیر از دو زوج sitename=7Learn و webmaster=Loghman استفاده کرده و این دو با “&” از هم جدا شده اند:
https://7learn.com/page.php?sitename=7Learn&webmaster=Loghman
همانطور که کمی قبلتر اشاره کردیم، بخش اضافه شده به URL را Query String میگويند. مشاهده کردید که به کمک متد GET اطلاعات را به وب سرور خود ارسال کردیم، اما متد GET تنها روش ارسال داده بين سرويس گيرنده و سرويس دهنده نیست. برای ارسال اطلاعات میتوانیم از متد POST هم استفاده کنیم.
مزایا و معایب استفاده از متد GET عبارتند از:
متد POST دادهها را به صورت یک پکیج و در ارتباطی جداگانه به سرور ارسال میکند. دادههایی که به کمک متد POST ارسال میشوند، در URL صفحه نمایش داده نمیشوند و از لحاظ امنیتی انتخاب بسیار مناسبی هستند.
مزایا و معایب استفاده از متد POST عبارتند از:
تمامی توسعه دهندگان وب سایت و به خصوص زبان PHP، با متدهای GET و POST سروکار دارند. پس در این بخش برای تفهیم بیشتر این دو متد، یک برنامهی ساده را در خصوص ارسال متغیر در PHP مثال میزنیم.
فرض کنید که میخواهید یک رشته را با اینپوت فیلد گرفته و بعد از زدن دکمهی تایید، آن را در صفحهی جدیدی در قالب یک متن نمایش دهید. کد این برنامهی ارسال متغیر در PHP با استفاده از متد GET به صورت زیر است:
<?php if(isset($_GET["name"])){ echo " Welcome," . $_GET["name"] . " "; } ?>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form method="get" action="<?php echo $_SERVER["PHP_SELF"];?>">
<label for="inputName">Name:</label>
<input type="text" name="name" id="inputName">
<input type="submit" value="Submit">
</form>
</body>
</html>
برای کدنویسی همان برنامهی ارسال متغیر در PHP، با استفاده از متد POST باید به شکل زیر عمل کنید:
<?php if(isset($_POST["name"])){ echo " Welcome," . $_POST["name"] . " "; } ?>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
<label for="inputName">Name:</label>
<input type="text" name="name" id="inputName">
<label for="password">password:</label>
<input type="password" name="pass">
<input type="submit" value="Submit">
</form>
</body>
</html>
به عنوان یک نتیجه گیری، تفاوت GET و POST را در قالب یک جدول گردآوری کردیم:
متد GET |
متد POST |
پارامترهای GET در URL موجود است. | پارامترهای POST در بدنه گنجانده شده است. پس امنیت بالاتری دارد. |
از متد GET اغلب برای واکشی اسناد استفاده میشود و از پارامترهای GET برای توصیف اینکه به دنبال کدام سند هستید، در چه صفحهای هستید و… استفاده میشود. | از متد POST اغلب برای بروزرسانی دادهها برای تغییر در سرور یا دادههای ذخیره شده در سرور استفاده میشود.
|
از آنجا که پارامترها در URL میآیند، حداکثر طول URL دارای محدودیت است. | هیچ محدودیتی در طول URL ندارد. |
در اغلب موارد، هنگامی که شما یک درخواست ساده را با استفاده از متد GET ارسال میکنید، تراکنش بین ماشینها و سیستمها کمتر است. | با فراخوانی متد POST، اطلاعات ذخیره شده تغییر میکنند، پس تراکنش بین سیستمی پیچیدهتر میشود. |
با فراخوانی پی در پی یک متد GET اطلاعات بازگشتی از سمت متد GET نباید تغییر کنند. | دادههای موجود در سرور را تغییر میدهد. |
این متد تنها از نوع داده رشته (String) پشتیبانی میکند. | متد POST از انواع مختلف داده (بولین، عددی و…) در بدنهی خود پشتیبانی میکند. |
نتایج به دست آمده از متد GET را میتوان بوکمارک کرد. | نتایج به دست آمده از متد POST را نمیتوان بوکمارک کرد. |
درخواست GET اغلب قابل ذخیره شدن در حافظهی پنهان (کش شدن) است.
|
درخواست POST به سختی قابل کش شدن است.
|
پارامترهای متد GET در تاریخچهی مرورگر وب باقی میمانند. | پارامترهای POST در سابقهی مرورگر وب ذخیره نمیشوند. |
جاوا اسکریپت دارای ماژولها و روشهای متنوعی برای ایجاد درخواستهای HTTP است. این ماژولها میتوانند برای ارسال یا دریافت اطلاعات از دادههای سمت سرور مورد استفاده قرار گیرند. برخی از ماژولهای کاربردی و محبوب بین توسعه دهندگان جاوا اسکریپت عبارتند از:
برای تست بهتر، میتوانید از JSONPlaceholder استفاده کنید. JSONPlaceholder یک API آنلاین رایگان REST برای توسعه دهندگان است تا بتوانند دادههای تصادفی خود را با متدهای HTTP تست کنند. این API نتایج را در قالب JSON برمیگرداند.
قبل از ایجاد یک درخواست HTTP در Ajax، باید یک متغیر از نوع ()XMLHttpRequest بسازید. سپس آدرس یا URL موردنظر و روش HTTP را تعیین کنید (که در این مورد متد GET است). درنهایت، کافی است با استفاده از تابع open، یک درخواست را به همراه آدرس و نوع متد میسازید و برای ارسال درخواس، تابع send را فراخوانی کنید. برای نمونه، یک نمونه کد GET با استفاده از Ajax به شکل زیر است:
const Http = new XMLHttpRequest();
const url='https://jsonplaceholder.typicode.com/posts';
Http.open("GET", url);
Http.send();
Http.onreadystatechange = (e) => {
console.log(Http.responseText)
}
با استفاده از XMLHTTPRequest.onreadystatechange مقدار بازگشتی یا همان پاسخ متد GET، در کنسول چاپ میشود.
برای آشنایی بیشتر، یک نمونه از متد POST در جاوا اسکریپت را با استفاده از توابع jQuery به شکل زیر است:
const Url= 'https://isonplaseholder.typicode.con/postsr/' ;
const data={
name:"7learn",
id:1399
}
$('.btn').click(function(){
$.post(Url,data, function(data, status){
console.log('${data} and status is ${status}')
});
})
همانطور که در بالا میبینید، متد post$. روش دیگری برای ارسال اطلاعات به سرور است. این متد سه پارامتر (URL، دادههایی که میخواهید ارسال کنید و عملگر برگشتی) را به عنوان ورودی دریافت میکند و نتیجه را در کنسول چاپ میکند.
در این مطلب به بررسی نحوهی تفاوت GET و POST با یکدیگر پرداختیم. به عنوان یک برنامه نویس سرور یا بک اند (Back-End) این وظیفهی شما است که با توجه به شرایط برنامه، یک یا هر دو متد GET و POST را به کار بگیرید. اگر میخواهید دادههای حساس و شخصی مانند رمز عبور و حساب بانکی را ارسال کنید، بهترین انتخاب متد POST است. همچنین در شرایطی که لازم است اطلاعات URL به کاربر نشان داده شود استفاده از متد GET مفیدتر خواهد بود. پس هر دو متد کاربردی و مفید هستند و فقط باید در جای درست از آنها استفاده کنید. در آخر اگر سوال یا تجربهای راجع به متدهای GET و POST دارید آن را در بخش نظرات با ما و کاربران سون لرن به اشتراک بگذارید.
ببخشید من یه سوال داشتم ، چطور وقتی در api با متد post فراخوانی میکنم ، بتونم pai رو publish کنم؟؟
شما باید مقدار بازگشتی رو در قالب یک آبجکت برگردونید.
اینکه چجوری api رو پابلیش کنید بستگی به این داره که کجا میخواد پابلیش شه. برای مثال در پستمن به این صورت انجام میشه.