Erreur lors de l'envoi de json dans le POST au service d'API Web


90

Je crée un service Web à l'aide de l'API Web. J'ai implémenté une classe simple

public class ActivityResult
{
    public String code;
    public int indexValue;
    public int primaryCodeReference;
}

Et puis j'ai implémenté dans mon contrôleur

[HttpPost]
public HttpResponseMessage Post(ActivityResult ar)
{
    return new HttpResponseMessage(HttpStatusCode.OK);
}

Mais quand j'appelle l'API en passant en POST le fichier json:

{"code":"XXX-542","indexValue":"3","primaryCodeReference":"7"}

J'obtiens le message d'erreur suivant:

{
    "Message": "The request entity's media type 'text/plain' is not supported for this resource.",
    "ExceptionMessage": "No MediaTypeFormatter is available to read an object of type 'ActivityResult' from content with media type 'text/plain'.",
    "ExceptionType": "System.Net.Http.UnsupportedMediaTypeException",
    "StackTrace": "   in System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n   in System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n   in System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)"
}

Qu'est-ce que je fais mal?


9
Vous devez ajouter un en-tête «application / json» pour que la charge utile soit acceptée par le client.
Adam Zuckerman

J'ai correctement défini les en-têtes dans ma requête HTTP. Cependant, le problème semble être côté serveur: dropbox.com/s/xlidnnybs8v6d0u/Cattura.JPG
GVillani82

4
Il semble que vous ne définissez l'en- Accepttête que sur application/json. Vous devez également définir l'en- Content-Typetête sur application/json.
Brian Rogers

Réponses:


186

Dans la requête HTTP, vous devez définir Content-Type sur: Content-Type: application/json

Donc, si vous utilisez un client fiddler, ajoutez Content-Type: application/jsonà l'en-tête de la demande


2
  1. Vous devez ajouter une propriété d'en-tête Content-Type:application/json
  2. Lorsque vous définissez un paramètre d'entrée de méthode de requête POST qui doit être annoté comme [FromBody], par exemple :

    [HttpPost]
    public HttpResponseMessage Post([FromBody]ActivityResult ar)
    {
      return new HttpResponseMessage(HttpStatusCode.OK);
    }
  3. Toutes les données d'entrée JSON doivent être des données brutes .


1

autre astuce ... où ajouter "content-type: application / json" ... au champ de zone de texte sur l'onglet Composer / Parsed. Il y a 3 lignes déjà remplies ici, j'ai donc ajouté ce type de contenu comme 4ème ligne. Cela a fait fonctionner la poste.


0

Veuillez vérifier si vous passiez la méthode comme à la POSTplace GET. si c'est le cas, vous obtiendrez la même erreur que celle que vous avez publiée ci-dessus.

$http({               
 method: 'GET',

Le type de support «text / plain» de l'entité de demande n'est pas pris en charge pour cette ressource.


1
La question concerne spécifiquement un POST http, il ne demande pas de données au serveur, il envoie des données au serveur.
Guerre du

0

J'avais tous mes paramètres couverts dans la réponse acceptée. Le problème que j'ai eu était que j'essayais de mettre à jour le type d'entité Entity Framework «Tâche» comme:

public IHttpActionResult Post(Task task)

Ce qui a fonctionné pour moi a été de créer ma propre entité "DTOTask" comme:

public IHttpActionResult Post(DTOTask task)

0

Il doit être inclus Content-Type:application/jsondans la section d'en-tête de demande de l'API Web lorsqu'il ne mentionne aucun contenu, alors par défaut, il est Content-Type:text/plaintransmis à la demande.

Meilleur moyen de tester l'API sur l'outil Postman.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.