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
 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 IQueryable 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" };
        }
    }
Pozostaje 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)
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.MapServiceRoute("api/contacts"); //!!!!
           
            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

        }
    }
}
To by było na tyle. Teraz możemy zobaczyć efekt naszej pracy (ograniczymy się na razie do najprostszej postaci czyli XMLa w przeglądarce):

Komentarze

Popularne posty