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?

GVillani82
la source
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

Beaumondo
la source
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 .

Kiran Sagvekar
la source
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.

john santora
la source
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.

sudheer kondala
la source
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)
Michael Washington
la source
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.

Kiran Sagvekar
la source