web-dev-qa-db-fra.com

API Web ne prenant pas en charge POST

Dans mon contrôleur Web API, j'ai une fonction avec les codes suivants

       [HttpPost]
        public HttpResponseMessage Post(string schooltypeName)
        {
            _schoolTypeService.RegisterSchoolType(schooltypeName);

            var message = Request.CreateResponse(HttpStatusCode.Created);

            return message;
        }

Lorsque j'appelle avec un violoneux, je reçois cette erreur

{"Message":"The requested resource does not support http method 'POST'."}

mes paramètres de violon sont

En-tête

User-Agent: Fiddler

Host: myhost:8823

Content-Type: application/json; charset=utf-8

Content-Length: 26

Corps de la demande

{"schooltypeName":"Aided"}

L'URL demandée est

http://myhost:8823/SchoolType

(J'ai configuré l'URL, GET travaille avec cette URL)

Qu'est-ce qui ne va pas ici?

31
Binson Eldhose

Modifiez votre action pour qu'elle ressemble à Post([FromBody]string schooltypeName) car, par défaut, le type de chaîne devrait venir Uri.

mis à jour:
Changez votre corps pour simplement "Aided" comme actuellement vous auriez besoin d'une classe pour faire fonctionner la désérialisation sinon ( ex : class School { public string SchoolTypeName { get; set; } }

50
Kiran Challa

Voir en utilisant l'espace de noms en haut du contrôleur, si vous utilisez System.Web.Mvc, alors ce problème peut se produire:

Utilisez ceci:

using System.Web.Http;
14
Sohail xIN3N

Le problème se résume à ceci:

si vos itinéraires au démarrage sont enregistrés avec routes.MapRoute(, vous devez décorer vos méthodes de publication avec [System.Web.Mvc.HttpPost]

Si vos itinéraires au démarrage sont enregistrés avec Routes.MapHttpRoute(, Vous devez décorer vos méthodes de publication avec [System.Web.Http.HttpPost]

si vous utilisez MapRoute() avec [System.Web.Http.HttpPost] cela ne fonctionnera pas

si vous utilisez MapHttpRoute() avec [System.Web.Mvc.HttpPost] cela ne fonctionnera pas

10
Gerrie Pretorius

Pour les futurs lecteurs. J'ai trouvé cette question ... mais j'ai trouvé (ma) réponse ailleurs.

J'ai décoré la méthode avec l'attribut ci-dessous.

    [System.Web.Http.HttpPost]
    public MyOutputObject DoSomething([FromBody]MyInputObject args)
    {
        Console.Writeline(args.ToString());
    }

Mon code client (C #, application console) pour être complet.

    private static Task<MyOutputObject> MyClientCall(string baseAddress, MyInputObject args)
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(baseAddress);
        client.DefaultRequestHeaders.Accept.Add(
           new MediaTypeWithQualityHeaderValue("application/json"));

           /* Your class name would be "MyEntityController" most likely */
        string serviceUrl = baseAddress + @"api/MyEntity/DoSomething";

        HttpResponseMessage response = client.PostAsJsonAsync(serviceUrl, args).Result;

        Console.WriteLine(response);
        Console.WriteLine(response.Content.ReadAsStringAsync().Result);

        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine("ERROR:  :(   " + response.ReasonPhrase);
            return null;
        }
        Task<MyOutputObject> wrap = response.Content.ReadAsAsync<MyOutputObject>();
        return wrap;
    }

J'ai trouvé ma réponse ici:

http://blog.dontpaniclabs.com/post/2013/01/23/That-Pesky-Requested-Resource-Does-Not-Support-HTTP-Method-POST-Error-When-Using-MVC- Web-API

6
granadaCoder

Veuillez vérifier le nom de la méthode GET Action que vous utilisez. Il est probable que vous utilisiez les mêmes noms de route vers la méthode GET et la méthode POST et attendez le résultat.

Exemple :

Nom du contrôleur: StudentController

    [Route("api/Student/names")]
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "student1", "student2" };
    }

URL de la méthode (GET): http: // localhost: 59342/api/student/names

     [HttpPost]
     [Route("api/Student/names")]
     public String Post(String name)
     {
         return "success";
     }

Pour POST à url: http: // localhost: 59342/api/student/names

Ensuite, vous obtiendrez l'erreur mentionnée ci-dessus

Solution: modifiez le nom de la méthode d'action POST comme ci-dessous)

    [HttpPost]
    [Route("api/Student/getName")]
    public String Post(String name)
    {
        return "success";
    }

L'URL qui est utilisée pour obtenir la réponse pour la méthode post est alors:

http: // localhost: 59342/api/student/getName

1
Thriveni

Ce qui m'a aidé à la fin était d'ajouter l'attribut Route et de répéter simplement la même route que celle enregistrée globalement.

1
Đonny