روی هم رفته:
از هر دو 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 درخواست ایجاد یا جایگزین بشه.