web-dev-qa-db-fra.com

Publier JSON HttpContent sur l'API Web ASP.NET

J'ai une API Web ASP.NET hébergée et je peux accéder aux requêtes http get très bien, j'ai maintenant besoin de passer quelques paramètres à une demande PostAsync comme ceci:

var param = Newtonsoft.Json.JsonConvert.SerializeObject(new { id=_id, code = _code });
HttpContent contentPost = new StringContent(param, Encoding.UTF8, "application/json");

var response = client.PostAsync(string.Format("api/inventory/getinventorybylocationidandcode"), contentPost).Result;

Cet appel renvoie un résultat 404 Not Found.

L'action de l'API côté serveur ressemble à ceci:

[HttpPost]
public List<ItemInLocationModel> GetInventoryByLocationIDAndCode(int id, string code) {
...
}

Et juste pour confirmer mon itinéraire sur l'API Web ressemble à ceci:

config.Routes.MapHttpRoute(
            name: "DefaultApiWithAction",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
);

Je suppose que je passe le contenu JSON HttpContent de manière incorrecte, pourquoi cela retournerait-il le statut 404?

12
Leigh

La raison pour laquelle vous recevez un 404 est que le framework n'a pas trouvé de méthode à exécuter compte tenu de votre demande. Par défaut, l'API Web utilise les règles suivantes pour lier les paramètres dans les méthodes:

  • Si le paramètre est de type "simple", l'API Web essaie d'obtenir la valeur de l'URI. Les types simples incluent les types primitifs .NET (int, bool, double, etc.), plus TimeSpan, DateTime, Guid, décimal et chaîne, ainsi que tout type avec un convertisseur de type qui peut convertir à partir d'une chaîne. (Plus d'informations sur les convertisseurs de type plus tard.)
  • Pour les types complexes, l'API Web essaie de lire la valeur dans le corps du message, à l'aide d'un formateur de type média .

Compte tenu de ces règles, si vous souhaitez lier le paramètre à partir du corps POST ajoutez simplement un [FromBody] attribut devant le type:

[HttpPost]
public List<ItemInLocationModel> GetInventoryByLocationIDAndCode([FromBody] int id, string code) {
...
}

Pour plus d'informations veuillez consulter la documentation .

5
Justin Helgerson