Miejmy model testowy.Obsługa GET * i * POST w WebApi
public class TestRequestModel
{
public string Text { get; set; }
public int Number { get; set; }
}
Chciałbym tę usługę, aby móc przyjąć następujące wnioski:
- GET/Test Number = 1234 & Text = myText
- POST/test z nagłówka? : Content-Type: application/x-www-form-urlencoded i treść: Numer = 1234 & Text = MyText
- POST/test z nagłówkiem: Content-Type: application/json i ciała: { "Text": "Pod", "Number": 9876}
Trasy są skonfigurowane w następujący sposób:
_config.Routes.MapHttpRoute(
"DefaultPost", "/{controller}/{action}",
new { action = "Post" },
new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) });
_config.Routes.MapHttpRoute(
"The rest", "/{controller}/{action}",
defaults: new { action = "Get" });
Mój kontroler wygląda następująco:
public class TestController : ApiController
{
[HttpGet]
public TestResponseModel Get([FromUri] TestRequestModel model)
{
return Do(model);
}
[HttpPost]
public TestResponseModel Post([FromBody] TestRequestModel model)
{
return Do(model);
}
(...)
Wygląda to na akceptowalną ilość kodu płyty kotła, ale nadal chciałbym tego uniknąć, jeśli to możliwe.
Posiadanie dodatkowej trasy również nie jest idealne. Mam obawy przed trasami MVC/WebAPi i uważam, że są złe.
Czy istnieje sposób na uniknięcie dwóch metod i/lub trasy domyślnej DefaultPost?
Myślę, że dodałeś za dużo kodu, spójrz na domyślny projekt, który zostanie wygenerowany. Nie potrzebujesz swoich atrybutów ani specjalnych dróg, by robić to, co robisz.Również różne czasowniki oznaczają różne intencje, 'GET' służy do uzyskiwania dostępu do danych, podczas gdy' POST' służy do tworzenia nowych danych. – Matthew