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?
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
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.
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)
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.
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.
Content-Type:application/json
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);
}
Toutes les données d'entrée JSON doivent être raw data.