कौन से HTTP तरीके कौन से CRUD के तरीकों से मेल खाते हैं?


213

रीस्टफुल स्टाइल प्रोग्रामिंग में, हमें अपने बिल्डिंग ब्लॉक्स के रूप में HTTP विधियों का उपयोग करना चाहिए। मैं थोड़ा उलझन में हूँ कि कौन से तरीके क्लासिक CRUD के तरीकों से मेल खाते हैं। प्राप्त / पढ़ें और DELETE / हटाएं पर्याप्त स्पष्ट हैं।

हालाँकि, PUT / POST में क्या अंतर है? क्या वे क्रिएट और अपडेट के साथ एक-दूसरे से मेल खाते हैं?

जवाबों:


298
Create = PUT with a new URI
         POST to a base URI returning a newly created URI
Read   = GET
Update = PUT with an existing URI
Delete = DELETE

PUT, PUT के साथ उपयोग किए गए URI के अस्तित्व के आधार पर क्रिएट और अपडेट दोनों के लिए मैप कर सकता है।

पोस्ट बनाने के लिए मैप्स।

सुधार: POST अपडेट के लिए मैप भी कर सकता है, हालांकि यह आमतौर पर Create के लिए उपयोग किया जाता है। POST एक आंशिक अद्यतन भी हो सकता है इसलिए हमें प्रस्तावित PATCH विधि की आवश्यकता नहीं है।


16
+1: आप PUT के बीच उन संसाधनों को बनाने के लिए भेद करते हैं जिनके नाम (URI) क्लाइंट और POST द्वारा संसाधनों को बनाने के लिए दिए गए हैं जिनके नाम सर्वर द्वारा असाइन किए गए हैं। इस पर चर्चा के लिए रिचर्डसन और रूबी की रेस्टफुल वेब सर्विसेज (ओ'रिली) देखें।
जिम फेरनस

9
और चूंकि PUT और DELETE अभी तक वेब ब्राउज़र द्वारा समर्थित नहीं हैं, इसलिए URI पर पोस्ट किए जा रहे तरीके = PUT या विधि = DELETE जैसे क्वेरी स्ट्रिंग तर्क को जोड़कर "POST" को ओवरलोड करना ठीक माना जाता है।
जिम फेरनस


13
@JimFerrans PUT और DELETE XHR के साथ ठीक वेब ब्राउज़र द्वारा समर्थित हैं। हालाँकि, HTML रूपों के संदर्भ में, HTML विनिर्देश उनका समर्थन नहीं करता है इसलिए ब्राउज़र या तो नहीं कर सकते हैं।
आईस

3
CRUD में एक पत्र के लिए कैनोनिक रूप से मैपिंग नहीं करते हुए, बहुत से REST फ्रेमवर्क GET / एंटिटी / टाइप एंटिटी की संस्थाओं को सूचीबद्ध करने के लिए भी उपयोग करते हैं । प्राप्त / संस्था / आईडी विशेष मिलान इकाई पढ़ा जाएगा आईडी
टोड्डियस ज़ो

49

पूरी कुंजी यह है कि आप एक बेकार बदलाव कर रहे हैं या नहीं। यही है, अगर संदेश पर दो बार कार्रवाई करने के परिणामस्वरूप "वही" बात हो जाएगी जैसे कि यह केवल एक बार किया गया था, तो आपको एक सुखद बदलाव मिला है और इसे PUT में मैप किया जाना चाहिए। यदि नहीं, तो यह POST के लिए मैप करता है। यदि आप कभी भी क्लाइंट को URL को संश्लेषित करने की अनुमति नहीं देते हैं, तो PUT अपडेट के बहुत करीब है और POST केवल ठीक बनाए रख सकता है, लेकिन यह निश्चित रूप से ऐसा करने का एकमात्र तरीका नहीं है; यदि ग्राहक को पता है कि वह बनाना चाहता है /foo/abcऔर जानता है कि वहां क्या सामग्री रखी जाए, तो यह एक PUT के रूप में ठीक काम करता है।

POST का विहित विवरण तब होता है जब आप कुछ खरीदने के लिए प्रतिबद्ध होते हैं: यह एक ऐसी क्रिया है जिसे कोई भी बिना जाने नहीं दोहराना चाहता है। इसके विपरीत, ऑर्डर के लिए प्रेषण पते को पहले से ही PUT के साथ ठीक किया जा सकता है: इससे कोई फर्क नहीं पड़ता कि आपको 6 Anywhere Dr, Nowherevilleएक बार, दो या सौ बार भेजने के लिए कहा गया है : यह अभी भी एक ही पता है। इसका मतलब यह है कि यह एक अद्यतन है? हो सकता है ... यह सब इस बात पर निर्भर करता है कि आप बैक-एंड कैसे लिखना चाहते हैं। (ध्यान दें कि परिणाम समान नहीं हो सकते हैं: आप उपयोगकर्ता को रिपोर्ट कर सकते हैं जब उन्होंने आखिरी बार संसाधन के प्रतिनिधित्व के हिस्से के रूप में एक PUT किया था, जो यह सुनिश्चित करेगा कि बार-बार PUTs एक समान परिणाम का कारण न बनें, लेकिन परिणाम अभी भी होगा एक कार्यात्मक अर्थ में "वही" हो।


1
के लिए उपयोग के मामलों के बीच यह अंतर POSTऔर PUTएक दिलचस्प एक है, और का जवाब करना चाहिए "है कौन सा 'बनाएं' और जो 'अपडेट' है?" इतना साफ है। इसके अलावा, एपीआई के कार्यान्वयन के संबंध में, यह अनुसरण करेगा कि एक दोहराव PUTको चुप न होने के लिए राशि चाहिए, जबकि एक दोहराव POSTएक अपवाद फेंक सकता है यदि भेजे जा रहे डेटा के कुछ पहलू को डेटा स्टोर में अद्वितीय बने रहना चाहिए कि आवेदन वापस।
zerobandwidth

2
यह उत्तर और निम्नलिखित टिप्पणी एक महत्वपूर्ण बिंदु को बढ़ाती है, जिसमें सावधानीपूर्वक सीआरयूडी को HTTP रीस्ट शब्दार्थ के साथ निकट (1to1) करने के लिए प्रयोग किया जाना चाहिए। यह एक विहित मानचित्रण नहीं है।
मार्टिन स्पेमर 16

35

मैं वही जवाब खोज रहा था, यहां आईबीएम कहता है। आईबीएम लिंक

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.

10

अभी (2016) नवीनतम HTTP क्रियाएं GET, POST, PATCH , PUT और DELETE हैं

अवलोकन

  • HTTP GET - चयन / अनुरोध
  • HTTP PUT - अपडेट
  • HTTP POST - INSERT / बनाएँ
  • HTTP PATCH - जब PUT टिंग एक पूर्ण संसाधन प्रतिनिधित्व बोझिल है और अधिक बैंडविड्थ का उपयोग करता है, जैसे: जब आपको आंशिक रूप से एक कॉलम अपडेट करना होगा
  • HTTP DELETE - DELETE

उम्मीद है की यह मदद करेगा!

यदि आप REST API को डिजाइन करने में रुचि रखते हैं तो यह एक बेहतरीन रीडिंग है! वेबसाइट ऑनलाइन संस्करण github भंडार


1
फ़रवरी 18 तक, ध्यान रखें कि ग्राहक और सर्वर पुस्तकालयों में पैट को पूरी तरह से लागू नहीं किया गया है।
Dizzley

ओह ठीक है धन्यवाद मैं देख रहा हूँ ... क्या आप एक लिंक / संदर्भ पोस्ट करना चाहते हैं तो मैं एक बार देख सकता हूँ कृपया?
d1jhoni1b

9

स्टॉर्मपैथ द्वारा एक महान यूट्यूब वीडियो बात है वास्तव में इस बारे में बताते हैं, URL को वीडियो के सही हिस्से पर छोड़ देना चाहिए:

तूफानी यूट्यूब वीडियो

यह देखने लायक भी है कि यह बात करने के एक घंटे से अधिक है, लेकिन अगर आप REST एपी के निर्माण में समय लगाने की आपकी सोच पर बहुत ज्यादा हस्तक्षेप करते हैं।


7

यह ठोस स्थिति पर निर्भर करता है .. लेकिन सामान्य तौर पर:

PUT = संसाधन के ठोस URI के साथ एक ठोस संसाधन को अद्यतन या परिवर्तित करें।

POST = दिए गए URI के स्रोत के तहत एक नया संसाधन बनाएँ ।

अर्थात

ब्लॉग पोस्ट संपादित करें:

PUT: / ब्लॉग / प्रविष्टि / 1

एक नया बनाएँ:

पोस्ट: / ब्लॉग / प्रविष्टि

PUT कुछ परिस्थितियों में एक नया संसाधन बना सकता है जहाँ अनुरोध से पहले नए ressource का URI स्पष्ट है। POST का उपयोग कई अन्य उपयोग के मामलों को लागू करने के लिए भी किया जा सकता है, जो दूसरों द्वारा कवर नहीं किए जाते हैं (GET, PUT, DELETE, HEAD, OPTIONS)

CRUD सिस्टम के लिए सामान्य समझ GET = request, POST = create, Put = update, DELETE = delete है


4

REST के बिल्डिंग ब्लॉक मुख्य रूप से संसाधन (और URI) और हाइपरमीडिया हैं। इस संदर्भ में, GETसंसाधन का प्रतिनिधित्व प्राप्त करने का तरीका है (जिसे वास्तव SELECTमें सीआरयूडी शब्दों में मैप किया जा सकता है )।

हालाँकि, आपको जरूरी नहीं कि CRUD ऑपरेशन और HTTP वर्ब के बीच एक-से-एक मैपिंग की उम्मीद हो। के बीच मुख्य अंतर है PUTऔर POSTउनकी बेकार संपत्ति के बारे में है। POSTआंशिक अद्यतन के लिए भी आमतौर पर इसका उपयोग किया जाता है, जैसा कि PUTआम तौर पर संसाधन का पूर्ण नया प्रतिनिधित्व भेजने के लिए होता है।

मैं इसे पढ़ने का सुझाव दूंगा:

HTTP विनिर्देशन भी एक उपयोगी संदर्भ है:

PUT विधि अनुरोध करती है कि संलग्न इकाई को आपूर्ति अनुरोध-URI के तहत संग्रहीत किया जाए।

[...]

POST-URI के अलग-अलग अर्थों में POST और PUT अनुरोधों के बीच मूलभूत अंतर परिलक्षित होता है। POST अनुरोध में URI उस संसाधन की पहचान करता है जो संलग्न इकाई को संभालेगा। वह संसाधन डेटा-स्वीकार करने की प्रक्रिया, कुछ अन्य प्रोटोकॉल का प्रवेश द्वार या एनोटेशन स्वीकार करने वाली एक अलग इकाई हो सकती है। इसके विपरीत, एक PUT अनुरोध में यूआरआई अनुरोध के साथ संलग्न इकाई की पहचान करता है - उपयोगकर्ता एजेंट जानता है कि यूआरआई क्या है और सर्वर अनुरोध को किसी अन्य संसाधन पर लागू करने का प्रयास नहीं करता है। यदि सर्वर की इच्छा है कि अनुरोध को एक अलग यूआरआई पर लागू किया जाए,


3

सामान्यतया, यह वह पैटर्न है जिसका मैं उपयोग करता हूं:

  • HTTP GET - चयन / अनुरोध
  • HTTP PUT - अपडेट
  • HTTP POST - INSERT / बनाएँ
  • HTTP DELETE - DELETE

5
PUT और POST अपडेट या क्रिएट करने के लिए बिल्कुल मेल नहीं खाते हैं; PUT "सेट" है (यानी, जहाँ आप संसाधन नाम पहले से जानते हैं और उपयोग करने के लिए मूल्य दे रहे हैं) और POST बाकी सब कुछ है। कुंजी यह सोचने के लिए है कि आप जो कर रहे हैं वह वैसा ही है या नहीं।
डोनल फेलो

1
टिप्पणी पर +1। दोनों के बीच एक निरपेक्ष मानचित्रण की धारणा भ्रामक हो सकती है। कुछ URI के लिए एक HTTP DELETE ऑपरेशन, उदाहरण के लिए एक सर्वर साइड रिकॉर्ड को बस संशोधित कर सकता है (यानी UPDATE) ताकि एक HTTP GET ऑपरेशन अब प्रतिनिधित्व नहीं लौटाए।
खड़े हो जाओ

4
PUT और POST अपडेट या क्रिएट करने के लिए बिल्कुल मेल नहीं खाते हैं । सच लेकिन एजे ने बताया कि वह किस पैटर्न का उपयोग करता है।
पायोत्र डोब्रोगोस्ट

1

Symfony अपने HTTP विधियों रखने के लिए परियोजना की कोशिश करता CRUD विधियों, और साथ शामिल हो उनकी सूची इस प्रकार है उन्हें सहयोगियों:

  • सर्वर से संसाधन प्राप्त करें
  • पोस्ट सर्वर पर एक संसाधन बनाएँ
  • PUT सर्वर पर संसाधन को अपडेट करें
  • DELETE सर्वर से संसाधन हटाएं

यह ध्यान देने योग्य है, जैसा कि वे उस पृष्ठ पर कहते हैं, "वास्तव में, कई आधुनिक ब्राउज़र PUT और DELETE विधियों का समर्थन नहीं करते हैं।"

मुझे जो याद है, उस ब्राउज़र के लिए सिम्फनी "फेक" पीयूटी और DELETE करता है, जो इसके फ़ॉर्म को बनाते समय उनका समर्थन नहीं करते हैं, ताकि एक ब्राउज़र का समर्थन न करने पर भी सैद्धांतिक रूप से सही HTTP विधि का उपयोग करने के करीब होने की कोशिश की जा सके। यह।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.