2013-10-21 7 views
10

मैं पुट और पोस्ट अनुरोधों के बीच अंतर पर पढ़ रहा हूं और मेरे पास रेल से संबंधित कुछ संबंधित प्रश्न हैं: मैं पहले से बनाई गई पंक्ति में एक विशिष्ट फ़ील्ड को बदलना चाहता हूं ... क्या मुझे एक पुट या एक पोस्ट अनुरोध का उपयोग करें? उदाहरण के लिए निम्नलिखित अलग हैं?रेल बनाम पोस्ट

#Assume this is a put request 
def update 
    @model=Model.find(x) 
    @model.field="new_field" 
    @model.save 
end 

#Assume this is a post request 
def update 
    @model=Model.find(x) 
    @model.field="new_field" 
    @model.save 
end 

#What if I use the rails update method? 
def update 
    @model=Model.find(x) 
    @model.update(model_params) 
    @model.save 
end 

अग्रिम धन्यवाद।

+0

चेक बाहर [इस] (http://stackoverflow.com/questions/107390/whats-the-difference-between-a-post-and-a- put-http-request), आपके प्रश्नों में रेल परिभाषाओं और रेल सम्मेलनों की तुलना में उनके इरादे के उपयोग के साथ अधिक कुछ करना है ... – rudolph9

उत्तर

17

रेल सम्मेलन के अनुसार,

PUT एक मौजूदा संसाधन

पोस्ट एक नया संसाधन

रेल 4 में बनाने के लिए प्रयोग किया जाता है अद्यतन करने के लिए प्रयोग किया जाता है, PUT PATCH भ्रम से बचने के लिए बदल दिया गया है ।

रेल उत्पन्न मार्गों डिफ़ॉल्ट रूप से नीचे की तरह दिखाई देगा

posts GET /posts(.:format)       {:action=>"index", :controller=>"posts"} 
      POST /posts(.:format)       {:action=>"create", :controller=>"posts"} 
new_post GET /posts/new(.:format)      {:action=>"new", :controller=>"posts"} 
edit_post GET /posts/:id/edit(.:format)     {:action=>"edit", :controller=>"posts"} 
    post GET /posts/:id(.:format)      {:action=>"show", :controller=>"posts"} 
      PUT /posts/:id(.:format)      {:action=>"update", :controller=>"posts"} 
      DELETE /posts/:id(.:format)      {:action=>"destroy", :controller=>"posts"} 

सूचना रख दिया और पोस्ट

+0

मैं उन सभी को समझता हूं ... मेरा भ्रम दोनों की अतिव्यापी प्रकृति से आता है। अर्थात। आप अद्यतन करने के लिए एक POST अनुरोध का भी उपयोग कर सकते हैं। मेरी चिंता यह है कि यदि आप बस एक फ़ील्ड को अपडेट करना चाहते हैं, तो एक पुट अनुरोध मौजूदा रिकॉर्ड को पूरी तरह से बदल देगा, जिसके लिए आपको उन सभी फ़ील्ड के मान निर्दिष्ट करने की आवश्यकता होती है, जिन्हें आप रखना चाहते हैं, केवल उस व्यक्ति के विपरीत जो आप बदलना चाहते हैं – kempchee

1

रख दिया और पोस्ट के लिए कार्रवाई HTTP हैं तरीकों।

मार्गों में। आरबी आपको विधि और नियंत्रक # क्रिया को मैप करना होगा। अपनी कक्षा में आप एक ही विधि को 3 बार परिभाषित करते हैं। इसलिए यदि आप इन क्रियाओं को एक HTTP विधि में मैप करना चाहते हैं तो आप नहीं कर सकते हैं।

आप प्रत्येक विधि का नाम बदलने और मॉडल वर्ग में कार्यान्वयन को बदलने जा रहे हैं।

4

डिफ़ॉल्ट रूप से रेल का लक्ष्य आरईएसटी विनिर्देश द्वारा निर्धारित तरीके से HTTP क्रियाओं का उपयोग करना है, आपको इस बात से चिंतित नहीं होना चाहिए कि विधियां आपको एक ही कार्रवाई करने की अनुमति क्यों दे सकती हैं। इसके बजाय आपको एक एपीआई प्रदान करने के बारे में सोचना चाहिए जो कि रीस्टफुल है और वह उपयोगकर्ता समझेंगे। ये डिफ़ॉल्ट व्यवहार ओवरराइड किया जा सकता है।

बाकी अर्थ है कि:

POST विधि का उपयोग कर संसाधन संग्रह पर कार्य करना चाहिए एक अनुरोध; संग्रह संग्रह में एक नया संसाधन जोड़ना उदाहरण यूआरएल: http://example.com/resources

पुट HTTP क्रिया का उपयोग करने का अनुरोध संग्रह के भीतर एक संसाधन पर कार्य करना चाहिए; सर्वर उदाहरण URL पर पूर्ण संसाधन की जगह: http://example.com/resource/1

PATCH HTTP क्रिया का उपयोग कर संग्रह के भीतर एक एकल संसाधन पर कार्य करना चाहिए एक अनुरोध; संसाधन पर कुछ विशेषताओं को अपडेट करना जहां यह है यूआरएल यूआरएल: http://example.com/resource/1

रेल 4 अब संसाधन को अद्यतन करने के लिए पुट क्रिया पर पैच क्रिया का उपयोग करता है।

2
  • मुझे लगता है कि जब रिकॉर्ड की कुछ विशेषताओं को अद्यतन करने के हम PATCH का उपयोग करना चाहिए
  • PUT वास्तव में संसाधन या अपने सभी विशेषताओं "की जगह" के संदर्भ में कुछ का मतलब है, लेकिन कर सकते थे भी एक (मैं इस आधारित कर रहा हूँ संसाधन बनाने का मतलब मुझे इस पुस्तक को पढ़ने से क्या याद है: REST API Design Rulebook ), उदाहरण के लिए जब आप आगे बढ़ रहे हैं (प्रतिलिपि) एडब्ल्यूएस एस 3 संसाधन जो आप ट्रिगर नहीं कर रहे हैं पोस्ट नहीं कर रहे हैं। तो हाँ पुट भ्रमित है।
  • पोस्ट जब नए संसाधन प्रस्तुत करने इस्तेमाल किया जाना चाहिए

वहाँ PATCH आसपास भ्रम की बहुत रूप में अच्छी तरह है, मैं व्यक्तिगत रूप से इस बात से सहमत है कि कैसे JSON एपीआई मानक यह http://jsonapi.org/format/#crud-updating करने के लिए प्रस्ताव है:

PATCH /articles/1 HTTP/1.1 
Content-Type: application/vnd.api+json 
Accept: application/vnd.api+json 

{ 
    "data": { 
    "type": "articles", 
    "id": "1", 
    "attributes": { 
     "title": "To TDD or Not" 
    } 
    } 
} 

मैं प्यार करता हूँ रेल मैं लेकिन सच यह है कि यह पूरी तरह से कुछ मूल वेब सम्मेलनों का पालन नहीं कर रहा है। रेल उत्पादक बनने की कोशिश कर रहे हैं और बहुत सख्त सम्मेलन उत्पादकता को दबा रहे हैं। इसलिए इसके लिए उत्तर मांगते समय ओवरबोर्ड पर न जाएं। सच्चाई यह है कि रेल पुट और पैच का इलाज कर रहे हैं, और स्पष्ट रूप से दोनों गलत हैं। तो मैं सलाह देते हैं:

  • पोस्ट पर, अद्यतन पर
  • PATCH बनाने
  • सूचकांक, नई पर मिलता दिखाने
  • सभी
  • पर डाल उपयोग नहीं करते हैं तो आप अपने आप पाते हैं कि आपके नियंत्रक है कुछ अजीब कार्रवाई कर रहे हैं, अपने नियंत्रकों को पुन: स्थापित करने का प्रयास करें (नया नियंत्रक शायद http://jeromedalbert.com/how-dhh-organizes-his-rails-controllers/)

लेकिन यदि आपकी पूरी परियोजना PUT का उपयोग कर रही है हर जगह, आपको सब कुछ बदलने और बदलने की जरूरत नहीं है। बस एक या दूसरे (पुट या पैच) तक चिपके रहें।

अद्यतन

मैं इस विषय जहाँ मैं इस विषय की गहराई में जाने पर 2 लेख लिखा था गए हैं।

+0

एक अच्छी विस्तृत प्रतिक्रिया है, लेकिन इसके नाम के बावजूद JSON API मानक वास्तव में * मानक नहीं है, भले ही कुछ बैकर्स रेल से जुड़े हुए हों। एक प्रश्न जो वर्तमान विकल्पों की जांच करने का प्रयास करता है: http://stackoverflow.com/questions/12806386/standard-json-api-response-format – prusswan

+0

ईमानदार होने के लिए मुझे यह पसंद है कि कंपनी स्टॉर्मपाथ इस बात में रीस्टफुल JSON API का प्रस्ताव दे रही है https: //www.youtube.com/watch?v=hdSrT4yjS1g। मेरी राय में मुझे JSON API http://jsonapi.org/ से अधिक पसंद है। लेकिन कॉन्फ़िगरेशन पर सम्मेलन, मैं JSONAPI.org कार्यान्वयन के साथ जाता हूं। अगर कॉम्यूनिटी कुछ और उपयोग करने के लिए सहमत है तो मैं इसके साथ जाता हूं लेकिन मानक के मुकाबले आधा मानक होना बेहतर है :) – equivalent8

+0

उत्कृष्ट लिंक :) – theDrifter

संबंधित मुद्दे