web-dev-qa-db-fra.com

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

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

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

Et puis j'ai implémenté à l'intérieur de mon contrôleur

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

Mais quand j'appelle l'API en transmettant à 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?

83
GVillani82

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

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

175
beaumondo

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

1
john santora

Tous mes paramètres étaient couverts dans la réponse acceptée .. Le problème que j’avais était que j’essayais de mettre à jour le type d’entité Entity Framework "Task" comme ceci:

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
Michael Washington

Il est nécessaire d’inclure Content-Type:application/json dans la section d’en-tête de la requête d’API Web lorsque aucun contenu n’est mentionné. Par défaut, Content-Type:text/plain passe à la requête.

Le meilleur moyen de tester api sur l'outil postier.

0
Kiran Sagvekar

Veuillez vérifier si vous passez la méthode en tant que POST à la place de GET. Si c'est le cas, vous obtiendrez la même erreur que celle que vous avez affichée ci-dessus.

$http({               
 method: 'GET',

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

0
sudheer kondala
  1. Vous devez obligatoirement ajouter la 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 demande POST qui doit être annoté comme suit: [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 raw data.

0
Kiran Sagvekar