web-dev-qa-db-fra.com

Le formulaire ASP.NET Core POST donne lieu à une réponse de type de support HTTP 415 non pris en charge.

L'envoi d'un formulaire POST _ Une requête HTTP (Content-Type: application/x-www-form-urlencoded) au contrôleur ci-dessous aboutit à une réponse 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.

122
Bart Verkoeijen

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)
    {
        //...
    }
}
_
203
Bart Verkoeijen

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

Content-Type: application/json
70
Bjorn Bailleul

Vous devez d’abord spécifier dans les en-têtes le Content-Type, par exemple, il peut s’agir de application/json.

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

Ainsi, dans la body de votre demande, vous n’enverrez pas form-data, ni x-www-for-urlencoded mais un raw json, 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.

5
gavri

En plus des bonnes réponses, vous n’avez pas à utiliser [FromForm] pour obtenir les 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)
{
    //...
}
5
hasan

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>
5
Quang Vu