سؤال

يبدو أن كلاهما يرسلان البيانات إلى الخادم داخل الجسم، فما الذي يجعلهما مختلفين؟

هل كانت مفيدة؟

المحلول

وضع HTTP:

يضع PUT الملف أو المورد على عنوان URI محدد، وعلى عنوان URI هذا بالضبط.إذا كان هناك بالفعل ملف أو مورد على URI هذا، فسيستبدل PUT هذا الملف أو المورد.إذا لم يكن هناك ملف أو مورد هناك، فسيقوم PUT بإنشاء واحد.وضع هو عاجز, ، ولكن من المفارقة أن استجابات PUT غير قابلة للتخزين المؤقت.

موقع HTTP 1.1 RFC لـ PUT

مشاركة HTTP:

يرسل POST البيانات إلى URI محدد ويتوقع أن يتعامل المورد الموجود في URI مع الطلب.يمكن لخادم الويب في هذه المرحلة تحديد ما يجب فعله بالبيانات في سياق المورد المحدد.طريقة POST ليست كذلك عاجز, ، ولكن ما بعد الردود نكون قابل للتخزين المؤقت طالما أن الخادم يقوم بتعيين رؤوس التحكم في ذاكرة التخزين المؤقت وانتهاء الصلاحية المناسبة.

يحدد HTTP RFC الرسمي POST ليكون:

  • شرح الموارد الموجودة؛
  • نشر رسالة إلى لوحة إعلانات أو مجموعة أخبار أو قائمة بريدية أو مجموعة مماثلة من المقالات ؛
  • توفير كتلة من البيانات ، مثل نتيجة إرسال نموذج ، لعملية معالجة البيانات ؛
  • توسيع قاعدة البيانات من خلال عملية الإلحاق.

موقع HTTP 1.1 RFC لـ POST

الفرق بين POST و PUT:

يشرح RFC نفسه الفرق الأساسي:

ينعكس الفرق الأساسي بين الطلبات وطلبات وضعه في المعنى المختلفة لطلب uri.يحدد URI في طلب البريد المورد الذي سيتعامل مع الكيان المرفق.قد يكون هذا المورد عملية قبول البيانات ، أو بوابة لبعض البروتوكول الآخر ، أو كيان منفصل يقبل التعليقات التوضيحية.في المقابل ، يحدد URI في طلب PUT الكيان المرفق بالطلب - يعرف وكيل المستخدم ما هو المقصود من URI ويجب ألا يحاول الخادم تطبيق الطلب على بعض الموارد الأخرى.إذا كان الخادم يرغب في تطبيق الطلب على URI مختلف ، فيجب أن يرسل استجابة 301 (تم نقلها بشكل دائم) ؛يجوز لوكيل المستخدم بعد ذلك اتخاذ قراره بشأن ما إذا كان سيتم إعادة توجيه الطلب أم لا.

باستخدام الطريقة الصحيحة، لا علاقة لها جانبا:

فائدة واحدة من راحة ROA vs SOAP هو أنه عند استخدام HTTP REST ROA، فإنه يشجع الاستخدام الصحيح لأفعال/طرق HTTP.لذلك على سبيل المثال، لن تستخدم PUT إلا عندما تريد إنشاء مورد في هذا الموقع المحدد.ولن تستخدم GET أبدًا لإنشاء مورد أو تعديله.

نصائح أخرى

دلالات فقط.

HTTP PUT من المفترض أن يقبل نص الطلب، ثم يخزنه على المورد المحدد بواسطة URI.

HTTP POST هو أكثر عمومية.من المفترض أن يبدأ إجراءً على الخادم.يمكن أن يكون هذا الإجراء هو تخزين نص الطلب على المورد المحدد بواسطة معرف URI، أو قد يكون عنوان URI مختلفًا، أو قد يكون إجراءً مختلفًا.

وضع هو يحب تحميل ملف.يؤثر الوضع على URI على URI هذا بالضبط.يمكن أن يكون للنشر إلى URI أي تأثير على الإطلاق.

لإعطاء أمثلة على موارد نمط REST:

قد يؤدي "POST /books" مع مجموعة من معلومات الكتاب إلى إنشاء كتاب جديد، والرد باستخدام عنوان URL الجديد الذي يحدد هذا الكتاب:"/كتب/5".

سيتعين على "PUT /books/5" إما إنشاء كتاب جديد بالمعرف 5، أو استبدال الكتاب الحالي بالمعرف 5.

في أسلوب غير الموارد، يمكن استخدام POST لأي شيء له آثار جانبية.أحد الاختلافات الأخرى هو أن PUT يجب أن يكون غير فعال - يجب أن تكون عمليات PUT المتعددة لنفس البيانات على نفس عنوان URL جيدة، في حين أن POSTs المتعددة قد تنشئ كائنات متعددة أو أيًا كان ما يفعله إجراء POST الخاص بك.

يُقصد من PUT أن تكون وسيلة "لتحميل" العناصر إلى عنوان URI معين، أو الكتابة فوق ما هو موجود بالفعل في عنوان URI هذا.

POST، من ناحية أخرى، هي طريقة لإرسال البيانات المتعلقة بعنوان URI معين.

تشير إلى HTTP RFC

بقدر ما أعرف، يتم استخدام PUT في الغالب لتحديث السجلات.

  1. POST - لإنشاء مستند أو أي مصدر آخر

  2. PUT - لتحديث المستند الذي تم إنشاؤه أو أي مورد آخر.

ولكن لتوضيح ذلك، عادةً ما يقوم PUT "باستبدال" السجل الحالي إذا كان موجودًا وإنشاءه إذا لم يكن موجودًا..

لقد نشر آخرون بالفعل إجابات ممتازة، وأردت فقط أن أضيف أنه مع معظم اللغات والأطر وحالات الاستخدام، ستتعامل مع POST كثيرًا، في كثير من الأحيان أكثر من PUT.إلى النقطة التي يتم فيها وضع PUT وDELETE وما إلى ذلك.هي في الأساس أسئلة تافهة.

  1. يحصل:يسترد البيانات من الخادم.لا ينبغي أن يكون لها أي تأثير آخر.
  2. بريد:يرسل البيانات إلى الخادم لإنشاء كيان جديد.يُستخدم غالبًا عند تحميل ملف أو إرسال نموذج ويب.
  3. يضع:يشبه POST، ولكنه يستخدم ليحل محل كيان موجود.
  4. رقعة:يشبه PUT، ولكنه يستخدم لتحديث حقول معينة فقط داخل كيان موجود.
  5. يمسح:يزيل البيانات من الخادم.
  6. يتعقب:يوفر طريقة لاختبار ما يتلقاه الخادم.إنه ببساطة يعيد ما تم إرساله.
  7. خيارات:يسمح للعميل بالحصول على معلومات حول طرق الطلب التي تدعمها الخدمة.رأس الاستجابة ذو الصلة هو السماح بالطرق المدعومة.يُستخدم أيضًا في CORS كطلب اختبار مبدئي لإعلام الخادم بطريقة الطلب الفعلية والسؤال عن الرؤوس المخصصة.
  8. رأس:إرجاع رؤوس الاستجابة فقط.
  9. يتصل:يستخدمه المتصفح عندما يعرف أنه يتحدث إلى وكيل ويبدأ عنوان URI النهائي بـ https://.الهدف من CONNECT هو السماح بجلسة TLS مشفرة من طرف إلى طرف، بحيث تكون البيانات غير قابلة للقراءة للوكيل.

يعتبر POST نوعًا من طريقة نوع المصنع.تقوم بتضمين البيانات معها لإنشاء ما تريد وكل ما هو موجود على الطرف الآخر يعرف ما يجب فعله بها.يتم استخدام PUT لتحديث البيانات الموجودة على عنوان URL معين، أو لإنشاء شيء جديد عندما تعرف ما سيكون عليه URI وهو غير موجود بالفعل (على عكس POST الذي سينشئ شيئًا ما ويعيد عنوان URL إلى إذا لزم الأمر).

لطفا أنظر: http://zacharyvoase.com/2009/07/03/http-post-put-diff/

لقد شعرت بالانزعاج الشديد مؤخرًا بسبب المفهوم الخاطئ الشائع لدى مطوري الويب والذي مفاده أنه يتم استخدام POST لإنشاء مورد، ويتم استخدام PUT لتحديث/تغيير المورد.

إذا ألقيت نظرة على الصفحة 55 من RFC 2616 ("بروتوكول نقل النص التشعبي - HTTP/1.1")، القسم 9.6 ("PUT")، سترى الغرض الفعلي من PUT:

تطلب طريقة PUT تخزين الكيان المغلق ضمن عنوان URI للطلب المقدم.

هناك أيضًا فقرة مفيدة لشرح الفرق بين POST وPUT:

ينعكس الاختلاف الأساسي بين طلبات POST وPUT في المعنى المختلف لـ Request-URI.يحدد URI في طلب POST المورد الذي سيتعامل مع الكيان المضمن.قد يكون هذا المورد عبارة عن عملية قبول بيانات، أو بوابة لبعض البروتوكولات الأخرى، أو كيان منفصل يقبل التعليقات التوضيحية.في المقابل، يحدد معرف URI في طلب PUT الكيان المرفق بالطلب - يعرف وكيل المستخدم المقصود من URI ويجب ألا يحاول الخادم تطبيق الطلب على بعض الموارد الأخرى.

لم يذكر أي شيء عن الفرق بين التحديث/الإنشاء، لأن هذا ليس موضوعه.يتعلق الأمر بالفرق بين هذا:

obj.set_attribute(value) # A POST request.

وهذا:

obj.attribute = value # A PUT request.

لذا يرجى وقف انتشار هذا المفهوم الخاطئ الشائع.قراءة طلبات RFC الخاصة بك.

تطلب REST من المطورين استخدام أساليب HTTP بشكل صريح وبطريقة تتفق مع تعريف البروتوكول.يؤسس مبدأ تصميم REST الأساسي هذا تعيينا فرديا بين إنشاء وقراءة وتحديث وحذف عمليات (CRUD) وأساليب HTTP.وفقا لهذا تعيين:

• لإنشاء مورد على الخادم، استخدم POST.

• لاسترداد أحد الموارد، استخدم GET.

• لتغيير حالة أحد الموارد أو تحديثه، استخدم PUT.

• لإزالة أحد الموارد أو حذفه، استخدم DELETE.

مزيد من المعلومات:خدمات ويب RESTful:الأساسيات من IBM

الفرق بين POST و PUT هو أن PUT غير فعال، وهذا يعني أن استدعاء نفس طلب PUT عدة مرات سيؤدي دائمًا إلى نفس النتيجة (وهذا ليس له أي تأثير جانبي)، بينما من ناحية أخرى، قد يكون استدعاء طلب POST بشكل متكرر ( إضافية) الآثار الجانبية لإنشاء نفس المورد عدة مرات.

GET :الطلبات التي تستخدم GET تسترد البيانات فقط، أي أنها تطلب تمثيلاً للمورد المحدد

POST :يرسل البيانات إلى الخادم لإنشاء مورد.تتم الإشارة إلى نوع نص الطلب بواسطة رأس نوع المحتوى.غالبًا ما يتسبب في تغيير الحالة أو حدوث آثار جانبية على الخادم

PUT :إنشاء مورد جديد أو استبدال تمثيل المورد المستهدف بحمولة الطلب

PATCH :يتم استخدامه لتطبيق تعديلات جزئية على المورد

DELETE :يقوم بحذف المورد المحدد

TRACE :فهو يقوم بإجراء اختبار استرجاع الرسالة على طول المسار إلى المورد الهدف، مما يوفر آلية تصحيح مفيدة

OPTIONS :يتم استخدامه لوصف خيارات الاتصال للمورد الهدف، ويمكن للعميل تحديد عنوان URL لأسلوب OPTIONS، أو علامة النجمة (*) للإشارة إلى الخادم بأكمله.

HEAD :ويطلب استجابة مماثلة لطلب GET، ولكن بدون نص الاستجابة

CONNECT :يقوم بإنشاء نفق للخادم المحدد بواسطة المورد المستهدف، ويمكن استخدامه للوصول إلى مواقع الويب التي تستخدم SSL (HTTPS)

ومن الجدير بالذكر ذلك POST يخضع لبعض المشتركة هجمات CSRF بينما PUT ليس كذلك.

CSRF أدناه هي غير ممكن مع PUT عندما يزور الضحية موقع Attackersite.com:

الطلب العادي (يتم إرسال ملفات تعريف الارتباط):(PUT ليست قيمة سمة مدعومة)

<form id="myform" method="post" action="http://target.site.com/deleteUser" >
    <input type="hidden" name="userId" value="5">
</form>
<script>document.createElement('form').submit.call(document.getElementById('myform'));</script>

طلب XHR (يتم إرسال ملفات تعريف الارتباط):(PUT سيؤدي إلى طلب الاختبار المبدئي)

var xhr = new XMLHttpRequest();
xhr.open("POST", "http://target.site.com/deleteUser");
xhr.withCredentials=true;
xhr.send(["userId=5"]);

ببساطة

POST يتم استخدامه لإنشاء مورد وإرجاع المورد URIالسابق

REQUEST : POST ..../books
{
"book":"booName",
"author":"authorName"
}

يجب أن تقوم هذه المكالمة بإنشاء كتاب جديد وإرجاع هذا الكتاب URI

Response ..../books/5

PUT يتم استخدامه لاستبدال مورد، إذا كان هذا المورد موجودًا، فقم ببساطة بتحديثه، ولكن إذا لم يكن هذا المورد موجودًا، فقم بإنشائه،

REQUEST : PUT ..../books/5
{
"book":"booName",
"author":"authorName"
}

استخدام PUT سوف نقدم معرف المورد، ولكن POST سيعود معرف المورد الجديد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top