Jestem nowym Web API ... Oto moja podstawowa trasa:Czy mogę mieć wiele metod POST w interfejsie Web API z różnymi złożonymi typami parametrów?
config.Routes.MapHttpRoute(
name: "Workitems",
routeTemplate: "api/{controller}/{workitemID}",
defaults: new { controller = "workitems", workitemID = RouteParameter.Optional }
);
Oto, co chciałbym mieć:
public HttpResponseMessage Post([FromBody] FolderModel theModel)
public HttpResponseMessage Post([FromBody] DocumentModel theModel)
Ale Web API nie znajdzie mojego druga metoda Post. Zrobiłem wiele wyszukiwania tutaj i w Google, ale nie znalazłem nic, co działa dla mnie (dobrze). Wiem, że mógłbym dodać drugi nieużywany parametr do drugiej metody - ale to za dużo z hackowania. Jeśli byłby to normalny kod C#, kompilator nie miałby problemu ze świadomością, który wybrać b/c metody mają różne sygnatury. Ale Web API nie jest wystarczająco inteligentny.
Przyjrzałem się niestandardowym ograniczeniom, ale nie wydawało się to odpowiednie. Nie mogę również używać różnych {działań}, ponieważ naruszają one restrykcje RESTful (bez RPC, tylko zasoby) dla mojego API. Nie mogę również umieścić drugiego postu na innym kontrolerze.
Jedynym sposobem stałam się to do pracy jest zawinąć zarówno FolderModel i DocumentModel w obiekcie nadrzędnym tak:
public class WorkitemCreateModel
{
public DocumentModel Document { get; set; }
public FolderModel Folder { get; set; }
}
public HttpResponseMessage Post([FromBody] WorkitemCreateModel theModel)
Następnie mieć pojedynczy metody POST, która pobiera WorkitemCreateModel. Ale to jest odpowiedzialność dewelopera za pomocą mojego API, które muszą przekazać w WorkitemCreateModel, ale muszą tylko przekazać obiekt DocumentModel LUB obiekt FolderModel. To denerwujące zbyt b/c mój GET API może zwrócić obiekt DocumentModel lub obiekt FolderModel. Tak więc byłoby miło po prostu przekazać obiekt otrzymany od GET do POST. Ale to nie działa i muszą najpierw zawinąć go w obiekt WorkitemCreateModel.
Jakieś inne sugestie?
BTW: ta strona jest najlepsza! Znalazłem wiele odpowiedzi tutaj!
Dzięki za odpowiedź ... Widziałem ten inny link, ale to nie pomogło. Wypróbowałem twoją sugestię. To też nie pomogło. –