4. WCF Web Api - simple GET
Bardzo prosty przykład pobrania danych. Prosty przykład na prostych danych czyli standardowo mamy stringa i inta. Sama nienawidzę takich przykładów bo jeśli cokolwiek dołożymy przestają działać. Bez obaw - dokładać będziemy później.
Poprzednio :
Mamy tylko 3 miejsca gdzie musimy coś napisać Moja przykładowa klasa Contact czy Resource
[ServiceContract] wskazuje że dana klasa będzie serwisem - potem ją powiążemy z URI i będziemy mogli korzystać.
[WebGet(UriTemplate ="")] definicja metody - jeśli nie podamy metody to wiadomo że chodzi o GET tutaj mamy listę naszych kontaktów, UriTemplate steruje URI, jeśli chcemy konkretny kontakt to przekazujemy jego ID, które będzie parametrem wejściowym do metody - używamy UriTemplate = "{id}"
Niestety parametry są zawsze stringiem i trzeba zadbać o walidację
Wszystkie konstrukcje są spójne z MVC.
Poprzednio :
Mamy tylko 3 miejsca gdzie musimy coś napisać Moja przykładowa klasa Contact czy Resource
public class Contact { public int ContactId { get; set; } public string Name { get; set; } }Service Contract - czyli funkcje wystawiane. Moje funkcje nie są ani eleganckie ani prawdziwe. Otrzymany ID powinno się przetworzyć jakoś sensownie a nie tworzyć nowy obiekt do zwrócenia, podobnie jest z tworzeniem nowej listy w metodzie pobierającej osoby. Ale ważne są nie dane a atrybuty
[ServiceContract] wskazuje że dana klasa będzie serwisem - potem ją powiążemy z URI i będziemy mogli korzystać.
[WebGet(UriTemplate ="")] definicja metody - jeśli nie podamy metody to wiadomo że chodzi o GET tutaj mamy listę naszych kontaktów, UriTemplate steruje URI, jeśli chcemy konkretny kontakt to przekazujemy jego ID, które będzie parametrem wejściowym do metody - używamy UriTemplate = "{id}"
Niestety parametry są zawsze stringiem i trzeba zadbać o walidację
Wszystkie konstrukcje są spójne z MVC.
[ServiceContract] public class ContactsApi { [WebGet(UriTemplate = "")] public IQueryablePozostaje Global.asax i rejestracja URI. Wcinamy się przed standardowym routes.MapRoute(...), ponieważ w innym wypadku wszystkożerna konstrukcja przechwytywała by nasze URI rejestrowane za pomocą MapServiceRoute (extension method z Microsoft.ApplicationServer.Http.Activation)Get() { var contacts = new List () { new Contact {ContactId = 1, Name = "Glenn Block"}, new Contact {ContactId = 2, Name = "Howard Dierking"} }; return contacts.AsQueryable(); } [WebGet(UriTemplate = "{id}")] public Contact GetContact(string id) { return new Contact { ContactId = 100, Name = "JL" }; } }
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; using Microsoft.ApplicationServer.Http.Activation; using Microsoft.ApplicationServer.Http.Description; using WcfWebApi.APIs; namespace WcfWebApi { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); } public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapServiceRouteTo by było na tyle. Teraz możemy zobaczyć efekt naszej pracy (ograniczymy się na razie do najprostszej postaci czyli XMLa w przeglądarce):("api/contacts"); //!!!! routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); } } }
Komentarze
Prześlij komentarz