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):
0 komentarze:
Prześlij komentarz