2013-10-16 10 views
19

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"}} 

risposta

50

Sembra che questo problema ha a che fare con la differenza tra le intestazioni Content-Type e Accept. In HTTP, Content-Type viene utilizzato nei payload di richiesta e di risposta per trasmettere il tipo di supporto del carico utile corrente. Accept viene utilizzato nei payload delle richieste per indicare quali tipi di supporto il server può utilizzare nel carico utile della risposta.

Quindi, avere un Content-Type in una richiesta senza un corpo (come la richiesta GET) non ha significato. Quando si esegue una richiesta POST, si invia un corpo del messaggio, quindi lo Content-Type è importante.

Se un server non è in grado di elaborare lo Content-Type della richiesta, restituirà un errore HTTP 415. (Se un server non è in grado di soddisfare nessuno dei tipi di media nella richiesta Accept, restituirà un errore 406.)

In OData v3, il tipo di supporto "application/json" viene interpretato come il nuovo Formato JSON ("luce JSON"). Se il server non supporta la lettura della luce JSON, genererà un errore 415 quando vedrà che la richiesta in ingresso è luce JSON. Nel tuo payload, il tuo corpo della richiesta è verboso JSON, non JSON light, quindi il server dovrebbe essere in grado di elaborare la tua richiesta. Semplicemente non perché vede il tipo di contenuto luminoso JSON.

Si potrebbe risolvere questo problema in uno dei due modi:

  1. Fai il Content-Type "application/json; odata = verbose" nella vostra richiesta POST, o
  2. includere l'intestazione DataServiceVersion nel richiesta e impostarlo essere inferiore a v3. Per esempio:

    DataServiceVersion: 2.0; 
    

(opzione 2 presuppone che non si sta utilizzando tutte le funzioni v3 nella richiesta payload.)

+0

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

+0

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 :(.) –

+0

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

Problemi correlati