J'ai une configuration d'API .net Core 2 avec une fonction de test. (Visual Studio 2017)
En utilisant Postman, je fais un post avec les données brutes de cette méthode, mais le modèle est juste vide? Pourquoi?
// POST api/Product/test
[HttpPost]
[Route("test")]
public object test(MyTestModel model)
{
try
{
var a = model.SomeTestParam;
return Ok("Yey");
}
catch (Exception ex)
{
return BadRequest(new { message = ex.Message });
}
}
public class MyTestModel
{
public int SomeTestParam { get; set; }
}
Vous devez inclure le [FromBody
] attribut sur le modèle:
[FromBody] MyTestModel model
Voir Andrew Lock's post pour plus d'informations:
Afin de lier correctement le JSON dans ASP.NET Core, vous devez modifier votre action pour inclure l'attribut
[FromBody]
sur le paramètre. Cela indique au framework d'utiliser l'en-tête de type de contenu de la demande pour décider lequel des IInputFormatters configurés utiliser pour la liaison de modèle.
Comme indiqué par @anserk dans les commentaires, cela nécessite également le Content-Type
en-tête à définir sur application/json
.
Pour ajouter plus d'informations à la réponse acceptée:
Il existe trois sources à partir desquelles les paramètres sont liés automatiquement sans utiliser d'attribut:
Valeurs de formulaire: ce sont des valeurs de formulaire qui vont dans la requête HTTP en utilisant la méthode POST. (Y compris jQuery POST)).
Valeurs de route: ensemble de valeurs de route fournies par le routage
Chaînes de requête: partie de chaîne de requête de l'URI.
Notez que Body
n'en fait PAS partie (bien que je pense que cela devrait l'être).
Donc, si vous avez des valeurs qui doivent être liées au corps, vous DEVEZ utiliser l'attribut de liaison d'attribut.
Cela m'a fait trébucher hier car j'ai supposé que les paramètres du corps seraient liés automatiquement.
Le deuxième point mineur est qu'un seul paramètre peut être lié au corps.
Il peut y avoir au plus un paramètre par action décoré de [FromBody]. Le runtime ASP.NET Core MVC délègue la responsabilité de la lecture du flux de demande au formateur. Une fois que le flux de demande est lu pour un paramètre, il n'est généralement pas possible de relire le flux de demande pour lier d'autres paramètres [FromBody].
Ainsi, si vous avez besoin de plusieurs paramètres, vous devez créer une classe Model pour les lier:
public class InputModel{
public string FirstName{get;set;}
public string LastName{get;set;}
}
[HttpPost]
public IActionResult test([FromBody]InputModel model)...