इसलिए, मैंने एनईडीबी के साथ एक आरईएसटी एपीआई बनाया है और मुझे अपना पोस्ट मिल गया है और अनुरोध काम कर रहे हैं, लेकिन मुझे काम करने के लिए डिलीट अनुरोध नहीं मिल रहा है। मुझे कंसोल में 'हटाएं http://localhost:3000/api 400 (खराब अनुरोध)' त्रुटि मिलती रहती है।
मेरी सर्वर फ़ाइल में हटाएं अनुभाग यहां दिया गया है:
app.delete('/api', (request, response) => {
database.remove({ _id: request }, {}, function(err, numRemoved) {});
});
यहाँ वह बटन है जो DELETE को क्रियान्वित करता है:
document.body.addEventListener('click', function(event) {
if (event.target.id == uid) {
const options = {
method: 'DELETE',
headers: {
'Content-Type': 'application/json'
},
body: uid
};
fetch('/api', options);
};
});
यह कहता है कि खराब अनुरोध fetch('/api', options); से आता है, लेकिन मुझे नहीं पता कि इसे कैसे ठीक किया जाए! क्या कोई मेरी मदद कर सकता है?
3 जवाब
त्रुटि इस तथ्य के कारण हो सकती है कि अनुरोध को हटाने के लिए एक जेसन बॉडी नहीं मिलनी चाहिए, आपको यूआईडी को पथ चर के रूप में पास करना चाहिए जैसे:
app.delete('/api/:uid', (request, response) => {
const uid = request.params.uid;
database.remove({ _id: uid }, {}, function(err, numRemoved) {});
});
और अपनी कॉल को इसमें बदलें:
document.body.addEventListener('click', function(event) {
if (event.target.id == uid) {
const options = {
method: 'DELETE',
};
const endpoint = `/api/${uid}`;
fetch(endpoint, options);
};
});
मुझे लगता है कि यह गलत धारणा के कारण हो सकता है कि DELETE
अनुरोध किस लिए है।
DELETE
विधि का मुख्य लक्ष्य यूरी में संसाधन को हटाना है। उदाहरण के लिए, DELETE
पर /article/123
संसाधन को /article/123
पर हटा देता है, और इसका मतलब है कि भविष्य में उस स्थान पर GET
अनुरोध के परिणामस्वरूप 404
या 410
.
DELETE
अनुरोध में एक निकाय होने का कोई मतलब नहीं है, क्योंकि यदि अनुरोध का उद्देश्य यूआरआई में संसाधन को हटाना है, तो शरीर में कुछ भी वास्तव में अनुरोध के अर्थ को और संशोधित नहीं करता है। HTTP निर्देश देता है कि DELETE
(और GET
और अन्य) का कोई शरीर नहीं होना चाहिए।
तो आप जो अनुरोध कर रहे हैं वह DELETE /api
है, जिसका अर्थ है "/एपीआई संसाधन हटाएं"। शरीर अप्रासंगिक है (और आपकी त्रुटि का कारण बनता है)।
ऐसा लगता है कि आप अधिक RPC-शैली API के लिए जा रहे हैं। यदि आप केवल /api
समापन बिंदु का उपयोग करते हैं, तो आपको संभवतः सभी विधियों को भूल जाना चाहिए और केवल POST
का उपयोग करना चाहिए। आप वास्तव में आरईएसटी नहीं कर रहे हैं।
यदि आप करते हैं अधिक डिज़ाइन लागू करना चाहते हैं और उपयुक्त HTTP विधियों का उपयोग करना चाहते हैं, तो आपको यह सोचकर शुरू करना चाहिए कि आपके मार्ग कैसे संरचित हैं। याद रखें कि यह विधि बताती है कि आप किस प्रकार का ऑपरेशन कर रहे हैं, और यूआरआई बताता है कि आप उस ऑपरेशन को क्या कर रहे हैं। जो लोग अपने एपीआई को एक एकल समापन बिंदु (जैसे ग्राफक्यूएल और एसओएपी के साथ) के माध्यम से जाने के लिए डिज़ाइन करते हैं, वे अपने स्वयं के प्रोटोकॉल के लिए HTTP को 'सुरंग' के रूप में प्रभावी रूप से उपयोग करते हैं।
मैं नहीं देख सकता कि uid
कहां सेट है। हालांकि, आपके त्रुटि संदेश के आधार पर, मुझे लगता है कि uid
वैध JSON ऑब्जेक्ट नहीं है। आप uid
को { uid }
जैसी किसी वस्तु में रख सकते हैं। फिर, अपने रूट हैंडलर में request.body.uid
के साथ ऑब्जेक्ट पढ़ें।
साथ ही, पारंपरिक आरईएसटी एपीआई में एक डिलीट अनुरोध में शरीर नहीं होता है। इसके बजाय, आपका मार्ग /api/:id
के प्रारूप में होगा। तब आपके अनुरोध url को "/api/" + uid
होने के लिए अद्यतन करने की आवश्यकता होगी। फिर आप अपने रूट हैंडलर में req.params.id
के साथ अनुरोध पैरामीटर पढ़ सकते हैं।