web-dev-qa-db-fra.com

415 Type de support non pris en charge - POST Service json au service OData dans le commutateur léger 2012)

Le message d'erreur "Erreur 415: type de support non pris en charge" s'affiche lors de la publication sur un service OData lors de l'utilisation de JSON.

Solution au bas de ce post plutôt long.

Je peux utiliser JSON mais dès que j'essaie et POST j'obtiens cette erreur.

Je peux également obtenir/POST en utilisant XML mais j'ai besoin d'utiliser JSON.

Je pense que cette erreur fait référence à quelque chose qui ne va pas dans mon en-tête, pas au format json de mon corps de requête qui peut également être incorrect ci-dessous, j'ai essayé un certain nombre de variantes ayant pour résultat la même erreur.

J'ai essayé de déboguer en utilisant Fiddler et voici les résultats.

JSON POST

Demande

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

Réponse

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

En-tête de demande

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;

En-tête de réponse

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

Je ne comprends pas pourquoi le type de support ne serait pas pris en charge pour POST lorsque GET fonctionne correctement. Je réalise que j'utilise DataServiceVersion: 1.0 et que j'ai recherché une mise à niveau, mais que j'utilise LightSwitch 2012 et que Nous pensons que LightSwitch 2013 utilise la version la plus récente (?), mais la mise à niveau m'apporte de nouveaux défis (non techniques). J'ai l'impression de tourner en rond et c'est mon dernier recours. et après avoir parlé à un collègue, ma seule autre option qui échoue est de créer un modèle de données sur la base de données et de créer un service OData à ce sujet.

---- UPDATE ----

J'ai depuis essayé les deux correctifs fournis par Jen S et reçois maintenant Error: 400 Bad Request.

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

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

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

Est-ce que je progresse dans la résolution de ce problème et est-ce juste une question de structuration incorrecte du corps de la requête json? J'ai essayé quelques tentatives sans succès, mais poster avec XML fonctionne.

----- SOLUTION ------

Grâce à l'aide de Jen, la publication au format json d'un service OData fonctionne pour moi.

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

Il semble que ce problème a à voir avec la différence entre le Content-Type et Accept en-têtes. En HTTP, Content-Type est utilisé dans les charges utiles de demande et de réponse pour transmettre le type de support de la charge utile actuelle. Accept est utilisé dans les charges utiles des demandes pour indiquer les types de support que le serveur peut utiliser dans les données utiles de la réponse.

Donc, avoir un Content-Type dans une demande sans corps (comme votre demande GET) n'a aucune signification. Lorsque vous faites une demande POST, vous envoyez un corps de message, le message Content-Type est important.

Si un serveur ne peut pas traiter le fichier Content-Type de la demande, une erreur HTTP 415 sera renvoyée. (Si un serveur ne peut satisfaire aucun des types de média de l'en-tête de requête Accept, il retournera une erreur 406.)

Dans OData v3, le type de média "application/json" est interprété comme désignant le nouveau format JSON ("JSON light"). Si le serveur ne prend pas en charge la lecture de la lumière JSON, il génère une erreur 415 lorsqu'il constate que la demande entrante est une lumière JSON. Dans votre charge utile, le corps de votre demande est JSON détaillé, et non JSON light. Le serveur doit donc pouvoir traiter votre demande. Ce n'est tout simplement pas le cas, car il voit le type de contenu JSON light.

Vous pouvez résoudre ce problème de deux manières:

  1. Définissez le type de contenu "application/json; odata = verbose" dans votre demande POST, ou
  2. Incluez l'en-tête DataServiceVersion dans la demande et définissez-le sur une valeur inférieure à v3. Par exemple:

    DataServiceVersion: 2.0;
    

(L'option 2 suppose que vous n'utilisez aucune fonctionnalité de la v3 dans le contenu de votre requête.)

57
Jen S