L'api Web ne supporte pas la méthode POST
dans mon contrôleur d'api web 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;
}
quand j'appelle avec fiddler je reçois cette erreur
{"Message":"The requested resource does not support http method 'POST'."}
mon tripoter les paramètres sont
en-Tête
User-Agent: Fiddler
Host: myhost:8823
Content-Type: application/json; charset=utf-8
Content-Length: 26
corps de la Requête
{"schooltypeName":"Aided"}
Demander l'url
http://myhost:8823/SchoolType
(j'ai configuré url, GET fonctionne avec cette url)
quel est le problème ici ?
5 réponses
changez votre action pour être comme Post([FromBody]string schooltypeName)
comme par défaut le type de chaîne de caractères est prévu pour venir Uri.
mise à Jour:
Changez votre corps en juste "Aided"
comme actuellement, vous auriez besoin d'une classe pour faire de la deserialiation autrement ( ex:class School { public string SchoolTypeName { get; set; } }
voir le utiliser namespace en haut de la manette, si vous utilisez Système.Web.Mvc, alors, ce problème peut être produite:
Utilisation:
using System.Web.Http;
Le Problème se résume à ceci:
si vos routes en démarrage sont enregistrées avec routes.MapRoute(
vous devez décorer votre post méthodes [System.Web.Mvc.HttpPost]
si vos routes en démarrage sont enregistrées avec Routes.MapHttpRoute(
vous devez décorer votre post méthodes [System.Web.Http.HttpPost]
si vous utilisez MapRoute()
[System.Web.Http.HttpPost]
il l'habitude de travailler
si vous utilisez MapHttpRoute()
[System.Web.Mvc.HttpPost]
il l'habitude de travailler
Pour les futurs lecteurs. J'ai trouvé cette question..mais trouvé (ma) réponse ailleurs.
j'ai décoré la méthode avec l'attribut vu ci-dessous.
[System.Web.Http.HttpPost]
public MyOutputObject DoSomething([FromBody]MyInputObject args)
{
Console.Writeline(args.ToString());
}
mon code client (c#, console app) 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:
veuillez vérifier le nom de la méthode GET action que vous utilisez. Les Chances sont que vous pourriez être en utilisant les mêmes noms de Route pour obtenir la méthode et la méthode de poste et d'attendre le résultat.
Exemple :
nom du contrôleur : StudentController
[Route("api/Student/names")]
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "student1", "student2" };
}
Url (méthode GET): http://localhost:59342/api/student/names
[HttpPost]
[Route("api/Student/names")]
public String Post(String name)
{
return "success";
}
Pour la méthode POST à l'url : http://localhost:59342/api/student/names
alors vous obtiendrez l'erreur mentionnée ci-dessus
Solution: Changer le POST de l'action nom de la méthode, comme ci-dessous
[HttpPost]
[Route("api/Student/getName")]
public String Post(String name)
{
return "success";
}
Alors que l'url est utilisée pour obtenir la réponse pour la méthode post est :