2013-10-16 3 views
19

मुझे JSON का उपयोग करते समय ओडाटा सेवा में पोस्ट करते समय 'त्रुटि 415: असमर्थित मीडिया प्रकार' मिल रहा है।415 असमर्थित मीडिया प्रकार - रोशनी में ओडीटा सेवा के लिए पोस्ट जेसन 2012

इस लंबी पोस्ट के नीचे समाधान।

मैं जेएसओएन का उपयोग कर प्राप्त कर सकता हूं लेकिन जैसे ही मैं कोशिश करता हूं और पोस्ट करता हूं, मुझे यह त्रुटि मिलती है।

मैं एक्सएमएल का उपयोग करके भी/पोस्ट कर सकता हूं हालांकि मुझे जेसन का उपयोग करने की आवश्यकता है।

मुझे लगता है कि यह त्रुटि मेरे हेडर में कुछ गड़बड़ कर रही है, मेरे अनुरोध निकाय के जेसन प्रारूप के नीचे जो गलत भी हो सकता है, मैंने कई बदलावों की कोशिश की है जिसके परिणामस्वरूप एक ही त्रुटि है।

मैं फिडलर का उपयोग करके डीबग करने का प्रयास कर रहा हूं और नीचे परिणाम हैं।

JSON पोस्ट

अनुरोध

POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1 
User-Agent: Fiddler 
Host: scdb38:8888 
Content-Length: 91 
Accept: application/json;odata=verbose; 
Content-Type: application/json; 

{ 
    "d":[ 
     { 
     "Name":"Great White ", 
     "Food":"Surfers" 
     } 
    ] 
} 

रिस्पांस

HTTP/1.1 415 Unsupported Media Type 
Cache-Control: private 
Content-Length: 186 
Content-Type: application/json;odata=verbose;charset=utf-8 
Server: Microsoft-IIS/7.5 
X-Content-Type-Options: nosniff 
DataServiceVersion: 1.0; 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Wed, 16 Oct 2013 06:20:10 GMT 

{"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=\"1.0\" encoding=\"utf-16\"?><ExceptionInfo><Message>Unsupported media type requested.</Message></ExceptionInfo>"}}} 

JSON प्राप्त

अनुरोध हेडर

GET http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1 
User-Agent: Fiddler 
Host: scdb38:8888 
Content-Length: 0 
Accept: application/json;odata=verbose; 
Content-Type: application/json; 
,210

रिस्पांस हैडर

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Content-Length: 591 
Content-Type: application/json;odata=verbose;charset=utf-8 
Server: Microsoft-IIS/7.5 
X-Content-Type-Options: nosniff 
DataServiceVersion: 1.0; 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Wed, 16 Oct 2013 06:23:41 GMT 

{"d":[{"__metadata":{"id":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(1)","uri":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(1)","etag":"W/\"X'00000000000007E4'\"","type":"LightSwitchApplication.Shark"},"Id":1,"RowVersion":"AAAAAAAAB+Q=","Name":"Tiger Shark","Food":"Penguins"},{"__metadata":{"id":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(2)","uri":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(2)","etag":"W/\"X'00000000000007E5'\"","type":"LightSwitchApplication.Shark"},"Id":2,"RowVersion":"AAAAAAAAB+U=","Name":"Grey Nurse","Food":"Lettuce"}]} 

मैं understany नहीं क्यों मीडिया प्रकार पोस्ट के लिए असमर्थित होगा जब प्राप्त ठीक काम करता है है। मुझे एहसास है कि मैं DataServiceVersion का उपयोग कर रहा हूं: 1.0 और अपग्रेडिंग को देखा है लेकिन मैं लाइटस्विच 2012 का उपयोग कर रहा हूं और लाइटस्विच ऐप को तोड़ने के बिना नए संस्करण को संदर्भित करने में समस्याएं हैं। मुझे लगता है कि लाइटस्विच 2013 नए संस्करण (?) का उपयोग करता है, हालांकि मेरे लिए अपग्रेड करने से नई (गैर तकनीकी) चुनौतियां खुलती हैं। मुझे लगता है कि मैं cirlces में चारों ओर जा रहा हूं और यह मेरा आखिरी उपाय है और एक सहयोगी से बात करने के बाद मेरा एकमात्र अन्य विकल्प डेटाबेस में डेटा मॉडल बनाना और इस पर ओडाटा सेवा बनाना है।

---- अद्यतन ----

मैं के बाद से जेन एस द्वारा प्रदान की दोनों फिक्स करने की कोशिश की है और अब त्रुटि प्राप्त है: 400 गलत अनुरोध।

= वर्बोज़

POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1 
Accept: application/json;odata=verbose; 
Content-Type: application/json;odata=verbose; 
Content-Length: 98 
Host: scdb38:8888 

{ 
    "d":[ 
     { 
     "Name":"Great White ", 
     "Food":"Surfers" 
     } 
    ] 
} 


HTTP/1.1 400 Bad Request 
Cache-Control: private 
Content-Length: 201 
Content-Type: application/json;odata=verbose;charset=utf-8 
Server: Microsoft-IIS/7.5 
X-Content-Type-Options: nosniff 
DataServiceVersion: 1.0; 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Wed, 16 Oct 2013 23:31:09 GMT 

{"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=\"1.0\" encoding=\"utf-16\"?><ExceptionInfo><Message>An error occurred while processing this request.</Message></ExceptionInfo>"}}} 

OData का उपयोग DataServiceVersion का उपयोग करना: 1,0

POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1 
Accept: application/json;odata=verbose; 
Content-Type: application/json; 
Content-Length: 98 
Host: scdb38:8888 
DataServiceVersion: 1.0; 

{ 
    "d":[ 
     { 
     "Name":"Great White ", 
     "Food":"Surfers" 
     } 
    ] 
} 


HTTP/1.1 400 Bad Request 
Cache-Control: private 
Content-Length: 201 
Content-Type: application/json;odata=verbose;charset=utf-8 
Server: Microsoft-IIS/7.5 
X-Content-Type-Options: nosniff 
DataServiceVersion: 1.0; 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Wed, 16 Oct 2013 23:31:09 GMT 

{"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=\"1.0\" encoding=\"utf-16\"?><ExceptionInfo><Message>An error occurred while processing this request.</Message></ExceptionInfo>"}}} 

WebServiceVerion का उपयोग करना: 2,0

POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1 
Accept: application/json;odata=verbose; 
Content-Type: application/json; 
Content-Length: 98 
Host: scdb38:8888 
DataServiceVersion: 2.0; 

{ 
    "d":[ 
     { 
     "Name":"Great White ", 
     "Food":"Surfers" 
     } 
    ] 
} 

HTTP/1.1 400 Bad Request 
Cache-Control: private 
Content-Length: 201 
Content-Type: application/json;odata=verbose;charset=utf-8 
Server: Microsoft-IIS/7.5 
X-Content-Type-Options: nosniff 
DataServiceVersion: 1.0; 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Wed, 16 Oct 2013 23:38:23 GMT 

{"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=\"1.0\" encoding=\"utf-16\"?><ExceptionInfo><Message>An error occurred while processing this request.</Message></ExceptionInfo>"}}} 

मैं इस को हल करने के साथ प्रगति और इसके बारे में सिर्फ एक मामला है हूँ जेसन अनुरोध निकाय गलत तरीके से संरचित किया जा रहा है? मैंने सफलता के बिना कुछ विचलन की कोशिश की है, हालांकि एक्सएमएल के साथ पोस्टिंग काम कर रही है।

----- समाधान ------

जेन की मदद एक OData सेवा करने के लिए json प्रारूप का उपयोग कर पोस्टिंग के लिए धन्यवाद मेरे लिए काम कर रहा है।

POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1 
Accept: application/json;odata=verbose; 
Content-Type: application/json; 
Content-Length: 62 
Host: scdb38:8888 
DataServiceVersion: 1.0; 


{ 
    "Name":"Great White ", 
    "Food":"Surfers" 
} 


HTTP/1.1 201 Created 
Cache-Control: no-cache 
Content-Length: 298 
Content-Type: application/json;odata=verbose;charset=utf-8 
ETag: W/"X'00000000000007E7'" 
Location: http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(4) 
Server: Microsoft-IIS/7.5 
X-Content-Type-Options: nosniff 
DataServiceVersion: 1.0; 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Thu, 17 Oct 2013 23:22:12 GMT 

{"d":{"__metadata":{"id":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(4)","uri":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(4)","etag":"W/\"X'00000000000007E7'\"","type":"LightSwitchApplication.Shark"},"Id":4,"RowVersion":"AAAAAAAAB+c=","Name":"Great White ","Food":"Surfers"}} 

उत्तर

50

ऐसा लगता है कि इस मुद्दे की तरह Content-Type और Accept हेडर के बीच अंतर के साथ क्या करना है। HTTP में, Content-Type का उपयोग वर्तमान पेलोड के मीडिया प्रकार को व्यक्त करने के लिए अनुरोध और प्रतिक्रिया पेलोड में किया जाता है। Accept अनुरोध पेलोड में उपयोग किया जाता है यह कहने के लिए कि प्रतिक्रिया पेलोड में सर्वर किस प्रकार का उपयोग कर सकता है।

तो, शरीर के बिना अनुरोध में Content-Type होने पर (आपके जीईटी अनुरोध की तरह) का कोई मतलब नहीं है। जब आप POST अनुरोध करते हैं, तो आप एक संदेश निकाय भेज रहे हैं, इसलिए Content-Type कोई फर्क नहीं पड़ता।

यदि कोई सर्वर अनुरोध के Content-Type को संसाधित करने में सक्षम नहीं है, तो यह 415 HTTP त्रुटि लौटाएगा। (यदि कोई सर्वर अनुरोध Accept शीर्षलेख में किसी भी प्रकार के मीडिया प्रकार को संतुष्ट करने में सक्षम नहीं है, तो यह 406 त्रुटि लौटाएगा।)

ओडाटा वी 3 में, मीडिया प्रकार "एप्लिकेशन/जेसन" का अर्थ नया है जेएसओएन प्रारूप ("जेएसओएन लाइट")। यदि सर्वर JSON प्रकाश पढ़ने का समर्थन नहीं करता है, तो यह 415 त्रुटि फेंक देगा जब यह देखता है कि आने वाला अनुरोध JSON प्रकाश है। आपके पेलोड में, आपका अनुरोध निकाय जेएसओएन है, जेएसओएन प्रकाश नहीं, इसलिए सर्वर आपके अनुरोध को संसाधित करने में सक्षम होना चाहिए। यह सिर्फ इसलिए नहीं है क्योंकि यह JSON प्रकाश सामग्री प्रकार को देखता है।

आप इस दो तरीकों में से एक में तय कर सकते हैं:

  1. सामग्री प्रकार बनाने "application/json; OData = वर्बोज़" अपने पोस्ट अनुरोध में, या
  2. में DataServiceVersion शीर्षक शामिल करें अनुरोध करें और इसे v3 से कम सेट करें। उदाहरण के लिए:

    DataServiceVersion: 2.0; 
    

(विकल्प 2 मानता है कि आप अपने अनुरोध पेलोड में किसी भी v3 सुविधाओं का उपयोग नहीं कर रहे हैं।)

विस्तृत और तार्किक प्रतिक्रिया के लिए धन्यवाद
+0

जेन एस, यह सही समझ में आता है। मैंने उपरोक्त दोनों फिक्सेस की कोशिश की है और दोनों के परिणामस्वरूप एक त्रुटि 400: खराब अनुरोध। मुझे यकीन नहीं है कि यह प्रगति कर रहा है, क्या यह अब जेसन अनुरोध निकाय के प्रारूप के साथ एक समस्या हो सकती है जिसे मैं भेज रहा हूं? मैं उपर्युक्त पोस्ट में प्रतिक्रिया पाठ को आज़माकर रखूंगा। – PaddleFish

+0

हां, यह प्रगति कर रहा है :)। JSON Verbose अनुरोध पेलोड में "डी" बाहरी तत्व नहीं होना चाहिए। यह केवल प्रतिक्रियाओं के लिए है। और मेरा मानना ​​है कि आप एक समय में केवल एक तत्व पोस्ट कर सकते हैं, इसलिए आपके पास JSON अनुरोध में कोई सरणी नहीं होनी चाहिए। क्या आप लाइब्रेरी का उपयोग कर रहे हैं, या इन्हें हाथ से तैयार कर रहे हैं? यदि आप एक ऐसी भाषा का उपयोग कर रहे हैं जिसमें ओडाटा लाइब्रेरी है, तो मैं पेलोड को हाथ से तैयार करने के बजाय इसका उपयोग करने का सुझाव दूंगा। (लेकिन इस समय सभी भाषाओं में अच्छी पुस्तकालय नहीं हैं :(।) –

+0

यह काम करता है! धन्यवाद आपकी सभी मदद के लिए जेन। मैंने इस पोस्ट पर ठोकर खाई गई किसी भी अन्य व्यक्ति के लिए अंतिम कार्य अनुरोध और प्रतिक्रिया पोस्ट की है। अगर मेरे पास अधिक प्रतिष्ठा थी मैं आपको एक अपवित्र दूंगा। – PaddleFish

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