Dans ASP.NET MVC WebAPI projet par défaut, nous avons créé le contrôleur suivant
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
// POST api/values
public void Post([FromBody]string value)
{
}
// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}
}
Mais est-il possible d'ajouter ici des méthodes personnalisées afin qu'elles puissent également prendre en charge get/post?
Je vous remercie!
Vous pouvez utiliser des attributs tels que RoutePrefix avec le type Http.
[Route("ChangePassword")]
[HttpPost] // There are HttpGet, HttpPost, HttpPut, HttpDelete.
public async Task<IHttpActionResult> ChangePassword(ChangePasswordModel model)
{
}
Le type http le mappera à sa méthode correcte en combinaison avec le nom de la route.
Je ne suis pas sûr de suivre car vous avez GET
et POST
juste là dans votre code, mais en tout cas vous avez d'autres options:
Tout d'abord, vous pouvez configurer vos itinéraires personnalisés dans le App_Start
dossier dans le WebApiConfig.cs
fichier. Voici ce que j'utilise normalement:
// GET /api/{resource}/{action}
config.Routes.MapHttpRoute(
name: "Web API RPC",
routeTemplate: "{controller}/{action}",
defaults: new { },
constraints: new { action = @"[A-Za-z]+", httpMethod = new HttpMethodConstraint("GET") }
);
// GET|PUT|DELETE /api/{resource}/{id}/{code}
config.Routes.MapHttpRoute(
name: "Web API Resource",
routeTemplate: "{controller}/{id}/{code}",
defaults: new { code = RouteParameter.Optional },
constraints: new { id = @"\d+" }
);
// GET /api/{resource}
config.Routes.MapHttpRoute(
name: "Web API Get All",
routeTemplate: "{controller}",
defaults: new { action = "Get" },
constraints: new { httpMethod = new HttpMethodConstraint("GET") }
);
// PUT /api/{resource}
config.Routes.MapHttpRoute(
name: "Web API Update",
routeTemplate: "{controller}",
defaults: new { action = "Put" },
constraints: new { httpMethod = new HttpMethodConstraint("PUT") }
);
// POST /api/{resource}
config.Routes.MapHttpRoute(
name: "Web API Post",
routeTemplate: "{controller}",
defaults: new { action = "Post" },
constraints: new { httpMethod = new HttpMethodConstraint("POST") }
);
// POST /api/{resource}/{action}
config.Routes.MapHttpRoute(
name: "Web API RPC Post",
routeTemplate: "{controller}/{action}",
defaults: new { },
constraints: new { action = @"[A-Za-z]+", httpMethod = new HttpMethodConstraint("POST") }
);
J'utilise une combinaison de points de terminaison RESTful
ainsi que de points de terminaison RPC
. Pour certains puristes, c'est le motif d'une guerre sainte. Pour moi, j'utilise une combinaison des deux parce que c'est une combinaison puissante et je ne trouve aucune raison sensée de ne pas le faire.
Comme les autres l'ont souligné et comme je le fais moi-même de nos jours, utilisez le routage d'attributs:
[HttpGet]
[GET("SomeController/SomeUrlSegment/{someParameter}")]
public int SomeUrlSegment(string someParameter)
{
//do stuff
}
J'avais besoin d'un package NuGet pour le routage d'attributs pour que cela fonctionne (recherchez simplement NuGet pour "Routage d'attributs"), mais je pense que MVC 5/WebAPI 2 l'a nativement.
J'espère que cela t'aides.
Vous pouvez utiliser le routage d'attributs:
[Route("customers/{customerId}/orders")]
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }
Quelques documents pour vous aider à démarrer:
http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
Mettez d'abord cette route vers webapiconfig.cs
config.Routes.MapHttpRoute(
name: "ApiWithAction",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Vous pouvez maintenant ajouter des actions à vos contrôleurs comme ceci
[HttpPost]
public void Upload()
{
//Do some thing
}
J'ai décoré l'action de téléchargement avec l'attribut httppost, ce qui signifie que cette action accepte uniquement les demandes de publication, si vous souhaitez que les actions soient GET, vous pouvez supprimer l'attribut ou simplement décorer votre suite