web-dev-qa-db-fra.com

Comment résoudre le problème - La ressource demandée ne prend pas en charge la méthode http 'POST'

Ci-dessous, l'action WebAPI. En googlant sur l'erreur ci-dessous: -

La ressource demandée ne supporte pas la méthode http 'POST'

J'ai eu le nombre de liens et mis à jour mon api en conséquence mais je reçois toujours la même erreur.

Mais toujours en appelant ce qui précède via post man lance l'erreur.

 Error

Comment puis-je me débarrasser de cette erreur?

Est-il également possible de résoudre ce problème sans utiliser l'attribut [FromBody] dans la liste des paramètres de méthode?

Toute aide/suggestion hautement appréciée. Merci.

6
Kgn-web

Vous avez déclaré une route qui nécessite des paramètres d'URL

[Route("rename/{userId}/{type}/{title}/")]

Ainsi, lorsque vous envoyez une demande à api/customer/rename, cette méthode ne correspond pas. Vous devez supprimer les paramètres que vous transmettez dans le corps de la demande des paramètres de route.

[Route("rename")]

Assurez-vous que vous avez l'attribut RoutePrefix("api/customer") approprié sur votre contrôleur.


Le deuxième problème est plusieurs paramètres [FromBody]. Vous obtiendrez ne peut pas lier plusieurs paramètres error. Il y a une limitation - vous ne pouvez marquer qu'un paramètre comme FromBody. Voir Envoi de types simples notes:

L'API Web lit le corps de la demande au plus une fois. Ainsi, un seul paramètre de Une action peut provenir du corps de la demande. Si vous devez obtenir plusieurs valeurs À partir du corps de la demande, définissez un type complexe.

Vous devez créer un type complexe qui contiendra tous les paramètres

public class RenameModel
{
   public int UserId { get; set; }
   public string Type { get; set; }
   public string Title { get; set; }
}

Et changez la signature de la méthode pour

[HttpPost]
[Route("rename")]
public IHttpActionResult Rename(RenameModel model)

Et envoyer les données de la demande sous la forme application/x-www-form-urlencoded

3
Sergey Berezovskiy
 [Route("rename/{userId}/{type}/{title}/")]
 public IHttpActionResult Rename([FromBody] int userId,  [FromBody] string  type, [FromBody] string title)

La dernière réponse est correcte, vous demandez ces paramètres dans la route, mais vous dites les attendre dans le corps du message. En outre, la route commence généralement par un nom plutôt que par un verbe. Qu'est-ce que vous êtes en train de renommer? (i.e. [Route ("utilisateurs/renommer/{IDutilisateur}/{type}/{titre}")]

Sur la base de votre message initial, essayez plutôt ceci:

 [HttpPost]
 [Route("rename/{userId}/{type}/{title}" Name = "RenameUser"]
 public IHttpActionResult Rename(int userId, string type, string title)
 {
     _myServiceMethod.Rename(userId, type, title);
     return new StatusCodeResult(HttpStatusCode.Created, this);   
 }

Ou, si vous vouliez faire une publication avec les informations dans le corps: Déclarez votre contrat de données:

public class User
{
    public string Type { get; set; }
    public string Title { get; set; }
}

Puis sur le noeud final:

[HttpPost]
[Route("rename/{userId}", Name = "RenameUserPost")]
public IHttpActionResult RenameUserPost(int userId, [FromBody] User userData)
{
    return new StatusCodeResult(HttpStatusCode.Created, this);
}

Notez que dans les deux retours, "ceci" fait référence à votre classe de contrôleur qui hérite d'ApiController. Vérifié tous les deux dans swagger, et ils acceptent les POST et les codes d'état de retour.

J'espère que cela t'aides.

1
jeffj23