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

مرورگر وب برای ارتباط با سرور از دو متد HTTP معروف با عناوین GET و POST استفاده می‌کند. این متدها برای ارسال اطلاعات از طرف کاربر به سرور استفاده می‌شوند و هر کدام مزایا و معایب خودشان را دارند. در ادامه به طور مفصل درباره‌ی تفاوت GET و POST صحبت خواهیم کرد. با وب سایت آموزش برنامه نویسی سون لرن همراه باشید.

HTTP چیست ؟

عبارت HTTP مخفف Hyper Text Transfer Protocol بوده و یک پروتکل برای مشخص کردن فرمت اطلاعات و ارسال آن‌ها در شبکه است. علاوه بر آن، HTTP مشخص می‌کند که وب سرورها و مرورگرها در هنگام مواجه شدن با دستورات مختلف چه واکنشی نشان دهند. با مثال زیر، بهتر متوجه مفهوم HTTP خواهید شد.

زمانی که یک آدرس وب را در مرورگر خود وارد می‌کنید، در واقع یک درخواست HTTP به وب سرور می‌فرستید تا آن صفحه وب را واکشی کرده و به شما نشان دهد. دو مفهوم Request و Response یا درخواست/پاسخ در HTTP بسیار مهم هستند. به این شکل که کاربر درخواست (Request) خود را از طریق مرورگر به وب سرور می‌فرستد. در سرور، پردازش موردنظر روی این درخواست انجام شده و خروجی تولید شده دوباره از طریق پاسخ (Response) به مرورگر کاربر می‌گردد.

متدهای مختلف پروتکل HTTP

متدهای مختلف پروتکل HTTP عبارتند از:

  • GET
  • POST
  • HEAD
  • PUT
  • DELETE
  • CONNECT
  • OPTIONS
  • TRACE
  • PATH

در ادامه با دو متد اول و تفاوت GET و POST بیشتر آشنا می‌شوید.

متد Get چیست؟

نمونه ای از متد GET

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

  • فرم تماس با ما
  • فرم ثبت نام یا ورود به سایت
  • فرم عضویت در خبرنامه
  • و… .

متد 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

مزایا و معایب استفاده از متد GET عبارتند از:

  • از آن‌جایی که اطلاعات فرستاده شده با متد GET در URL آدرس صفحه نمایش داده می‌شوند، می‌توانید صفحه را با مقادیر query string مورد نظر خود بوک مارک (Bookmark) کنید.
  • متد GET مناسب ارسال اطلاعات حساس و مهمی مثل نام کاربری، رمز عبور، اطلاعات کارت بانکی و… نیست، زیرا اطلاعات به طور کامل در query string آدرس صفحه قابل مشاهده است و اینکه در حافظه مرورگر کاربر به عنوان یک صفحه بازدید شده ذخیره می‌شود.
  • متد GET دیتا را در یک متغیر داخل محیط سرور ذخیره می‌کند؛ به همین دلیل طول URL محدود شده و در نتیجه کل داده ارسالی ما محدود می‌شود.

متد POST چیست؟

کاربردی از متد POST

متد POST داده‌ها را به صورت یک پکیج و در ارتباطی جداگانه به سرور ارسال می‌کند. داده‌هایی که به کمک متد POST ارسال می‌شوند، در URL صفحه نمایش داده نمی‌شوند و از لحاظ امنیتی انتخاب بسیار مناسبی هستند.

مزایا و معایب استفاده از متد POST

مزایا و معایب استفاده از متد POST عبارتند از:

  • امنیت این روش ارسال اطلاعات بسیار بالا است و اطلاعاتی که کاربر تایپ می‌کند به هیچ عنوان در مرورگر قابل مشاهده نیست، علاوه بر آن، در گزارشات (Logs) سرور هم ذخیره نمی‌شوند.
  • از آن‌جایی که اطلاعات ارسال شده‌ی صفحه با متد POST در URL دیده نمی‌شوند، نمی‌توان آن صفحه را در مرورگر Bookmark کرد.
  • در متد POST محدودیت بسیار بیشتری برای ارسال اطلاعات وجود دارد. به کمک POST می‌توان داده‌های متنی و باینری (آپلود فایل) را ارسال کرد.

ارسال مقدار متغیرها از یک صفحه به صفحه ای دیگر با روش POST در PHP

تمامی توسعه دهندگان وب سایت و به خصوص زبان PHP، با متدهای GET و 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>

نتیجه‌ی متد GET

برای کدنویسی همان برنامه‌ی ارسال متغیر در 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>

نتیجه با متد POST

تفاوت متد GET و POST در PHP

به عنوان یک نتیجه گیری، تفاوت 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 در سابقه‌ی مرورگر وب ذخیره نمی‌شوند.

دریافت و ارسال اطلاعات با متد GET در جاوا اسکریپت

جاوا اسکریپت دارای ماژول‌ها و روش‌های متنوعی برای ایجاد درخواست‌های HTTP است. این ماژول‌ها می‌توانند برای ارسال یا دریافت اطلاعات از داده‌های سمت سرور مورد استفاده قرار گیرند. برخی از ماژول‌های کاربردی و محبوب بین توسعه دهندگان جاوا اسکریپت عبارتند از:

  • فناوری Ajax
  • متدهای jQuery (مانند $.ajax)
  • استفاده از fetch
  • کتابخانه‌ی Axios
  • ماژول Angular HTTP Client (برای استفاده در انگولار)

برای تست بهتر، می‌توانید از 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 در جاوا اسکریپت

برای آشنایی بیشتر، یک نمونه از متد 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 استفاده کنیم؟

در این مطلب به بررسی نحوه‌ی تفاوت GET و POST با یکدیگر پرداختیم. به عنوان یک برنامه نویس سرور یا بک اند (Back-End) این وظیفه‌ی شما است که با توجه به شرایط برنامه، یک یا هر دو متد GET و POST را به کار بگیرید. اگر می‌خواهید داده‌های حساس و شخصی مانند رمز عبور و حساب بانکی را ارسال کنید، بهترین انتخاب متد POST است. همچنین در شرایطی که لازم است اطلاعات URL به کاربر نشان داده شود استفاده از متد GET مفیدتر خواهد بود. پس هر دو متد کاربردی و مفید هستند و فقط باید در جای درست از آن‌ها استفاده کنید. در آخر اگر سوال یا تجربه‌ای راجع به متدهای GET و POST دارید آن را در بخش نظرات با ما و کاربران سون لرن به اشتراک بگذارید.

 
ارسال دیدگاه
ما همه سوالات و دیدگاه ها رو می خونیم و پاسخ میدیم
۷ دیدگاه
عرفان ۰۷ اردیبهشت ۱۳۹۹، ۰۱:۵۹
خیییلی کامل و دقیق بود ممنون
سید محمدعلی ۲۸ فروردین ۱۳۹۹، ۱۵:۳۴
مطلب خیلی خوبی بود.
سید محمدعلی ۲۸ فروردین ۱۳۹۹، ۱۵:۳۴
"در متد POST محدودیت بسیار بیشتری برای ارسال اطلاعات وجود دارد، به کمک POST می‌توان داده‌های متنی و 'بابنری' (آپلود فایل) ارسال کرد"
به نظرم باینری درست بود.
Saturn ۱۷ اسفند ۱۳۹۸، ۰۹:۴۹
سلام
عالی بود .ممنون.
saman ۱۱ بهمن ۱۳۹۸، ۱۳:۰۳
دوتا غلط نوشتاری داری توش یکیش اینه :
در متد POST محدودیت بسیار بیشتری (غلطه کمتری درسته) برای ارسال اطلاعات وجود دارد، به کمک POST می توان داده های متنی و بابنری (آپلود فایل) ارسال کرد
نازنین کریمی مقدم ۰۲ مهر ۱۳۹۹، ۱۳:۴۹
سلام. متد پست محدودیتهای بیشتری برای ارسال اطلاعات داره :)
خیلی ممنون از اطلاع اشتباه تایپی، اصلاح شد.
حمید ۰۳ دی ۱۳۹۸، ۱۵:۲۹
سلام
من تفاوت متد GET و POST را در هنگام ارسال داده به سرور (اولی از طریق URL و دومی بدون نمایش در URL) را متوجه شدم، اما فرق متد POST برای ثبت داده و GET برای خواندن داده را متوجه نشدم.
با عبارتی برای خواندن داده نیز مرسوم است از POST استفاده کنیم و یا برای ارسال داده به سرور برای ذخیره داده از GET؟
با سپاس