Ricevo "errore 415: tipo di supporto non supportato" durante la registrazione su un servizio OData quando si utilizza JSON.415 Tipo di supporto non supportato - servizio POST da json a OData nell'interruttore luci 2012
Soluzione in fondo a questo post piuttosto lungo.
Riesco a utilizzare JSON ma non appena provo e POST ottengo questo errore.
Posso anche OTTENERE/POSTARE utilizzando XML, tuttavia ho bisogno di usare JSON.
Penso che questo errore si riferisca a qualcosa di sbagliato nella mia intestazione, non al formato json del mio corpo di richiesta che potrebbe anche essere errato di seguito, ho provato un numero di variazioni che hanno causato lo stesso errore.
Ho cercato di eseguire il debug utilizzando Fiddler e il seguito sono i risultati.
JSON POST
Richiesta
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"
}
]
}
risposta
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
Request Header
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
intestazione di risposta
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"}]}
Non understany perché il tipo di supporto sarebbe supportato per POST quando GET funziona bene. Mi rendo conto che sto usando DataServiceVersion: 1.0 e ho cercato l'aggiornamento ma sto usando LightSwitch 2012 e ho riscontrato problemi con riferimento alla nuova versione senza rompere l'app LightSwitch. Penso che LightSwitch 2013 usi la versione più recente (?), Tuttavia l'aggiornamento per me apre nuove sfide (non tecniche). Mi sento come se stessi andando in giro in cirlces e questa è la mia ultima risorsa e dopo aver parlato con un collega la mia unica altra opzione in mancanza di questo è quello di creare un modello di dati sul database e creare un servizio OData su questo.
---- UPDATE ----
allora ho provato entrambe le correzioni forniti da Jen S e ora ottenere Errore: 400 Bad Request.
Utilizzando odata = verbose
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>"}}}
Utilizzando 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>"}}}
Utilizzando 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>"}}}
sono io progredendo con la soluzione di questo ed è solo una questione di il corpo della richiesta JSON è strutturato in modo errato? Ho provato un paio di varianti senza successo, tuttavia la pubblicazione di XML sta funzionando.
----- SOLUZIONE ------
Grazie per i messaggi di Jen utilizzando formato JSON a un servizio di OData sta lavorando per me.
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"}}
Grazie Jen S per la risposta dettagliata e logica, ha perfettamente senso. Ho provato entrambe le correzioni di cui sopra e entrambi si traducono in un errore 400: Bad Request. Non sono sicuro che questo stia facendo progressi, potrebbe essere un problema ora con il formato del corpo della richiesta json che sto trasmettendo? Proverò a inserire il testo della risposta nel post precedente. – PaddleFish
Sì, sta facendo progressi :). In JSON i carichi utili delle richieste dettagliati non dovrebbero essere un elemento esterno "d". Questo è solo per le risposte. E credo che puoi pubblicare solo un elemento alla volta, quindi non dovresti avere un array nella richiesta JSON. Stai usando una libreria o la fabbricazione a mano? Se stai usando una lingua che ha una libreria OData, ti suggerirei di utilizzarla invece di creare manualmente i payload. (Ma non tutte le lingue hanno buone librerie al momento :(.) –
Questo ha funzionato! Grazie Jen per tutto il tuo aiuto. Ho pubblicato la richiesta di lavoro finale e le risposte sopra per chiunque altro incappasse in questo post. Io ti darei un upvote – PaddleFish