2010-11-29 15 views
5

मैं जैक्सन के साथ एक जेसन आरईएसटी एपीआई बनाने के लिए रेस्टलेट 2.1 का उपयोग कर रहा हूं।क्या 455 असमर्थित मीडिया प्रकार लौटा रहा है जब इसे 400 खराब अनुरोध वापस करना चाहिए?

जब मैं अपेक्षित सामग्री प्रकार के साथ अनुरोध करता हूं लेकिन एक विकृत शरीर, मुझे 415 "अनपेक्षित मीडिया प्रकार" स्थिति कोड वापस मिलता है। मुझे लगता है कि सही त्रुटि कोड 400 "खराब अनुरोध" होना चाहिए।

स्पष्ट रूप से मिश्रण तब होता है जब जैक्सन कचरे को डीकोड करने में विफल रहता है और विफल रहता है।

मैं मामले कुछ कोड के साथ और अधिक स्पष्ट करने की कोशिश करेंगे:

// java method mapping 
@Post("json") 
public Project create(Project project) { 

कर्ल

$ curl -i -XPOST -H 'content-type: application/json' -d '{xgarbage}' http://localhost:8080/projects HTTP/1.1 415 Unsupported Media Type 

साथ सेवा मंगलाचरण और लॉग में स्टैक ट्रेस ओएस recorde के fragmente:

Nov 29, 2010 9:51:56 PM org.restlet.ext.jackson.JacksonRepresentation getObject 
WARNING: Unable to parse the object with Jackson. 
org.codehaus.jackson.JsonParseException: Unexpected character ('x' (code 120)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') 
at [Source: [email protected]; line: 1, column: 2] 
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:929) 

सेवा का वास्तविक कार्यान्वयन कभी नहीं मारा जाता है, इसलिए मानचित्र पर कोई निर्णय लिया जाता है 415 के लिए खराब सामग्री।

अब, मेरा प्रश्न है: क्या यह सही है? यदि मैं "रीस्टफुल वेब सर्विसेज" पुस्तक से सही उद्धरण पढ़ रहा हूं, तो यह नहीं है, लेकिन मैं सुधार के लिए खुला हूं।

[400 खराब अनुरोध] यह आमतौर पर तब उपयोग किया जाता है जब ग्राहक एक पुट या POST अनुरोध के साथ एक प्रतिनिधित्व प्रस्तुत करता है, और प्रतिनिधित्व सही प्रारूप में है, लेकिन इसका कोई मतलब नहीं है।

[415 असमर्थित मीडिया प्रकार] ग्राहक एक दस्तावेज है कि (जैसे एक XML दस्तावेज गलत शब्दावली में लिखा के रूप में) सही मीडिया प्रकार लेकिन गलत प्रारूप मिला है भेजता है, तो एक बेहतर प्रतिक्रिया अधिक सामान्य 400 ("गलत अनुरोध")

सही है या गलत, मैं वापस जाने के लिए पसंद करते हैं एक 400

वहाँ जैक्सन द्वारा प्रदान की ऑटो जादू क्रमबद्धता पर छोड़ने के बिना व्यवहार को बदलने के लिए एक रास्ता है?

किसी भी मदद की बहुत सराहना की जाती है, धन्यवाद!

उत्तर

3

415 सही है, क्योंकि अनुरोध सही प्रारूप में है, यदि यह किसी भी तरह से दूषित हो गया है। उदाहरण के लिए गैर-दृष्टांत जेएसओएन या एक्सएमएल। विकृत JSON या XML परिभाषा द्वारा JSON या XML नहीं है, और इस प्रकार एक असमर्थित मीडिया प्रकार है, जैक्सन को यह जानने का कोई तरीका नहीं है कि JSON होना चाहिए, यह सिर्फ इतना जानता है कि यह JSON नहीं है पार्स।

ऑफिकल documentation इस बारे में वास्तव में स्पष्ट है।

10.4.16 415 असमर्थित मीडिया प्रकार

सर्वर अनुरोध की सेवा क्योंकि अनुरोध की इकाई का अनुरोध किया विधि के लिए अनुरोध किया गया संसाधन द्वारा समर्थित नहीं एक प्रारूप में है अस्वीकार कर रहा है।

आपने कहा, हे यह JSON है, और ऐसा नहीं है कि सर्वर कहता है, हे, जो मुझे मिला वह JSON नहीं है और इस संसाधन द्वारा समर्थित नहीं है।

+2

मुझे लगता है कि यह तर्कसंगत है: प्रारूप में होना और अच्छी तरह से स्वरूपित होना दो अलग-अलग चीजें हैं (आप एक भ्रष्ट jpg हो सकते हैं)। मुझे लगता है कि सर्वर को अलग-अलग संकेत देना चाहिए "अरे आपने ऐप्लिकेशंस/foo भेजने की कोशिश की और मैं इसका समर्थन नहीं करता", और "हाँ हम जेसन का समर्थन करते हैं लेकिन आपका डेटा दूषित हो गया है"। –

+0

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

+1

वैसे, सामग्री-प्रकार http शीर्षलेख यही है: यह इच्छित सामग्री प्रकार घोषित करता है। अगर प्रेषक इसे जेसन घोषित करता है, लेकिन डीकोडर इसे इस तरह डीकोड नहीं कर सकता है, तो यह एक बुरा अनुरोध है क्योंकि इसका कोई मतलब नहीं है। यह एक खराब मीडिया प्रकार नहीं है (क्योंकि इच्छित मीडिया प्रकार अच्छा रहा होगा)। –

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