ASPTNET Core form POST génère une réponse HTTP 415 non prise en charge de type de média

Envoi d’un formulaire de requête HTTP POST ( Content-Type: application/x-www-form-urlencoded ) aux résultats du contrôleur ci-dessous dans une réponse HTTP 415 Unsupported Media Type .

 public class MyController : Controller { [HttpPost] public async Task Submit([FromBody] MyModel model) { //... } } 

Formulaire après les en-têtes HTTP:

 POST /submit HTTP/1.1 Host: example.com:1337 Connection: keep-alive Content-Length: 219 Pragma: no-cache Cache-Control: no-cache Origin: https://example.com:1337 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Content-Type: application/x-www-form-urlencoded Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Referer: https://example.com:1337/submit Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.8,nl;q=0.6 

Cela fonctionnait avec ASP.NET MVC 5 sur .NET 4.6.

Pour les formulaires, utilisez l’atsortingbut [FromForm] au lieu de l’atsortingbut [FromBody] .

Le contrôleur ci-dessous fonctionne avec ASP.NET Core 1.1:

 public class MyController : Controller { [HttpPost] public async Task Submit([FromForm] MyModel model) { //... } } 

Vous pouvez utiliser [FromBody] mais vous devez définir l’en tête Content-Type de votre requête sur application / json.

comme

 Content-Type: application/json 

En plus de bonnes réponses, vous n’avez pas à utiliser [FromForm] pour obtenir des données de formulaire dans le contrôleur. Le framework convertit automatiquement les données du formulaire en modèle comme vous le souhaitez. Vous pouvez implémenter comme suit.

 [HttpPost] public async Task Submit(MyModel model) { //... } 

Tout d’abord, vous devez spécifier dans les en-têtes le type de Content-Type , par exemple, il peut être application/json .

Si vous définissez le type de contenu application/json , vous devez envoyer un fichier json.

Donc, dans le body de votre requête, vous enverrez pas form-data , pas x-www-for-urlencoded mais un fichier json raw , par exemple {"Username": "user", "Password": "pass"}

Vous pouvez adapter l’exemple à différents types de contenu, y compris ce que vous souhaitez envoyer.

Vous pouvez utiliser un outil comme Postman ou Curl pour jouer avec cela.