تفاوت PUT و POST در REST چیست؟

  • آخرین بروزرسانی پرسش در کاپ کد در سه‌شنبه 14 آوریل 2020

بر اساس مشخصات HTTP/1.1 :

متد POST برای ارسال درخواست استفاده می شود که در آن سرور مبدا موجودیت های قرار گرفته در درخواست را به صورت یک تابعی از منابع مشخص شده توسط Request-URI در Request-Line می پذیرد.

به عبارتی دیگر POST  برای ایجاد استفاده می شود.

متد PUT درخواست می کند که موجودیت قرار گرفته شده در Request-URI ذخیره شود. اگر Request-URI به یک منبع از قبل موجود اشاره کند، موجودیت قرار گرفته می بایست به عنوان یک نسخه تغییر یافته از آن نسخه ای که در سرور مبدا است در نظر گفته شود. اگر Request-URI به منبع موجودی اشاره نداشته باشد و آن URI امکان تعریف شدن به عنوان یک منبع جدید با درخواست از user agent را داشته باشد، سرور مبدا می تواند آن منبع را با آن URI ایجاد کند.

در این صورت PUT برای ایجاد یا بروزرسانی استفاده می شود.

بنابراین، از کدام باید برای ایجاد یک منبع استفاده بشه؟

پرسش امتیازی🔝
تعداد بازدید 2347101
امتیاز 5324👍
رای 5330👍
📅 پرسش در
📅 آخرین ویرایش

برای این پرسش 2 پاسخ وجود دارد

2

روی هم رفته:

از هر دو PUT و POST میشه برای ایجاد استفاده کرد.

در اصل باید پرسید "هدفت از ارسال درخواست چیه؟" تا بشه فهمید که باید از چی استفاده کرد. بیا فرض کنیم در حال طراحی API برای پرسش و پاسخ هستی. اگر بخوای از POST استفاده کنی برای دریافت لیست پرسش ها باشه. اگر می خوای از PUT استفاده کنی باید برای دریافت اطلاعات یک پرسش خاص باشه.

خوبه که از هر دو میشه استفاده کرد، اما از کدوم یکی باید در طراحی RESTful خودم استفاده کنم:

نیازی نیست که از PUT و POST همزمان استفاده کنی.

این که از کدوم استفاده بشه بستگی به تو داره. اما به یاد داشته باش باید وابسته به این که به چه شی ای در درخواستت اشاره داری، درست رو انتخاب کنی.

بعضی ملاحظات:

  • اسم شی های URL رو به صورت دستی وارد می کنی یا میذاری سرور تصمیم بگیره؟ اگر خودت اسم گذاری می کنی پس از PUT استفاده کن در غیر این صورت POST
  • PUT بی خطر تره و اگر یک شی رو دوبار PUT کنی، هیچ تاثیری نداره. هیچ گزینه خوبیه، بنابراین خودم اگر ممکن باشه از PUT استفاده می کنم.
  • میتونی با URL شی یکسان یک منبع رو ایجاد یا بروزرسانی کنی
  • با POST میتونی همزمان 2 درخواست ورودی برای تغییرات رو به یک URL داشته باشی و اون ها ممکنه بخش های مختلفی از یک شی رو بروزرسانی کنن.

مثال:

POST:

برای تغییر و بروزرسانی یک resource استفاده شده

POST /questions/<existing_question> HTTP/1.1
Host: www.example.com/
این ارور میده
POST /questions/<new_question> HTTP/1.1
Host: www.example.com/

اگر URL هنوز ساخته نشده باشه، نباید از POST برای ساختش در حالی که اسمش رو تعیین می کنی، استفاده کنی. در غیر این صورت خطای 'resource not found' رو می بینی چون که <new_question>هنوز وجود نداره. باید اول<new_question> رو اول PUT کنی.

بنابراین برای انجام این کار می تونی با استفاده از POST اینطوری پیش بری:

POST /questions HTTP/1.1
Host: www.example.com/

به یاد داشته باش که اگر نام resource تعیین نشده باشه، مسیر URL شی جدید بازگردانده می شه.

PUT:

برای ایجاد یا بازنویسی یک resource استفاده میشه. در حالی که URL جدید resource ها رو مشخص می کنی

برای یک resource جدید:

PUT /questions/<new_question> HTTP/1.1
Host: www.example.com/

برای بازنویسی یک resource از قبل موجود:

PUT /questions/<existing_question> HTTP/1.1
Host: www.example.com/

برای این که دقیق تر هم بشه RFC 7231 Section 4.3.4 PUT در این باره میگه:

4.3.4. PUT

متد PUT درخواست میکنه که وضعیت resource مقصد با وضعیت تعیین شده در پیام payload درخواست ایجاد یا جایگزین بشه.

امتیاز 4198👍

پاسخ تایید شده
📅 پاسخ در
📅 آخرین ویرایش

از POST برای ایجاد و از PUT برای بروزرسانی استفاده کن. فریمورک Ruby on Rails به همین شکل انجام میده

PUT    /items/1      #=> update
POST   /items        #=> create

امتیاز 126👍

📅 پاسخ در
📅 آخرین ویرایش
برای دنبال کردن نوشته های کاپ کد به کانال تلگرامی آن (cupcode_ir@) بپیوندید!

دیدگاه خود را بیان کنید

@