305 votes

Le POST sous forme ASP.NET Core entraîne une réponse de type de support HTTP 415 non pris en charge

L'envoi d'une requête HTTP POST de formulaire ( Content-Type: application/x-www-form-urlencoded ) au contrôleur ci-dessous entraîne une réponse de type de support HTTP 415 non pris en charge .

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

En-têtes de formulaire 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.

500voto

Bart Verkoeijen Points 1567

Pour les formulaires, utilisez l'attribut [FromForm] au lieu de l'attribut [FromBody] .

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

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

174voto

Bjorn Bailleul Points 359

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

comme

 Content-Type: application/json
 

18voto

gavri Points 161

Vous devez d'abord préciser dans les en-Têtes de l' Content-Type, par exemple, il peut être application/json.

Si vous définissez application/json type de contenu, alors vous devez l'envoyer au format json.

Ainsi, dans l' body de votre demande, vous envoyer pas form-data, pas x-www-for-urlencoded mais raw json, par exemple {"Username": "user", "Password": "pass"}

Vous pouvez adapter l'exemple à différents types de contenus, y compris ce que vous voulez envoyer.

Vous pouvez utiliser un outil comme Facteur ou curl de jouer avec cela.

12voto

hasan Points 2776

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

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

8voto

Quang Vu Points 59

Voici mon cas: il est exécuté Environnement: Contrôleur AspNet Core 2.1:

 public class MyController
{
    // ...

    [HttpPost]
    public ViewResult Search([FromForm]MySearchModel searchModel)
    {
        // ...
        return View("Index", viewmodel);
    }
}
 

Vue:

 <form method="post" asp-controller="MyController" asp-action="Search">
    <input name="MySearchModelProperty" id="MySearchModelProperty" />
    <input type="submit" value="Search" />
</form>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X