5. Representational
State
Transfer
Architectural style
based on HTTP protocol usage and
principles of The Web
Tightly coupled to HTTP protocol
Lightweight
Stateless
Simple caching “from the box”
Easy to consume (e.g. mobile devices, JavaScript etc.)
Goal: scaling, loose coupling and
compose functionality across service boundaries
6. Richardson Maturity Model
I
Level3: Hypermedia
controls
Level2: HTTP Verbs
Level1: Resources
Level0: POX, Single URI
7. Level0
POX, Single URI, Transport
The systems focus are service end point URI and
one HTTP verb (likely POST verb) for communication.
AppointmentService
GetOpenTimeSlot
TimeSlotsList
Servic
Client
e
MakeAppointment
ReservationResult
8. Level1
Resources
Introduces resources, URIs per resource, but one HTTP ve
Handling complexity by using divide and conquer,
breaking a large endpoint down into multiple resources.
http://klinik.com/
POST doctors/eberwein Doctor
s
TimeSlotsList
Client
POST slots/15092012
Slots
ReservationResult
9. Level2
HTTP Verbs
The system relies on more HTTP verbs and
HTTP response codes on each resource.
http://klinik.com/
doctors/eberwein
GET ?date=…&open=1 Doctor
s
200 OK TimeSlotsList
Client
POST slots/15092012
Slots
204 CREATED ReservationResult
10. Level3
Hypermedia
Introduces discoverability, providing a way of making
a protocol more self-documenting.
http://klinik.com/
doctors/eberwein
GET ?date=…&open=1 Doctor
200 OK TimeSlotsList
s
<link rel = "/linkrels/slot/book"
Client uri = "/slots/5678"/>
POST slots/15092012 Slots
204 CREATED ReservationResult
11. Cooking REST on .NET –
Web API
URL Routing to produce clean URLs
Content Negotiation based on Accept headers
for request and response serialization
Support for a host of supported output formats
including JSON, XML, ATOM
Extensible (easy to add new formats, custom handlers,
routing, error handlers)
Self-hostable in non-Web applications
Testable using testing concepts similar to MVC
12. Web API Routing
Routing “à la” ASP.NET MVC
Register your routs from Application_Start in Global.asax.cs
RouteTable.Routes.MapHttpRoute(
name: "UploadDownlaodOnlyTrhougthTransport",
routeTemplate: "api/transports/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { controller = "uploads|downloads" }
);
RouteTable.Routes.MapHttpRoute(
name: "AllExceptUploadaDownload",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints:
new { controller = @"^((?!(downloads|uploads)).)*$" }
);
13. Web API Controller
Derived from ApiController
Actions are mapped to URIs
via naming convention or attributes
Deep support for more advanced HTTP features
via HttpResponseMessage and HttpRequestMessage.
public class ProductsController : ApiController
{
public IEnumerable<Product> GetAllProducts(){}
public Product GetProduct(int id) {}
public HttpResponseMessage PostProduct(Product item) {}
public void PutProduct(int id, Product contact) {}
[AcceptVerbs("GET", "HEAD")]
public Product FindProduct(id) {}
[HttpGet]
public Product FindProduct(id) {}
}
14. OData support
Support “in the box” for OData $top, $skip, $filter, $orderby,
advanced support in pre-release
Install-Package Microsoft.AspNet.WebApi.OData -Pre
Till release - as alternative use of WCF Data Services
Queryable attribute to enable OData queries
http://localhost:38856/api/products?$filter=category+eq+'Toys'
[Queryable]
public IQueryable<Product> GetAllProducts()
{
return repository.GetAll().AsQueryable();
}
15. Web API extensiblity
Message handlers
to handle request and responses
Action filters
for custom logic before and after action execution
Custom formatters
to add custom media type formats
Dependency resolver
to enable dependency injection for controllers
16. Things that help
HTTP debugging proxies
Fiddler
fiddler2.com
Curl, for cmd-line fans
curl.haxx.se
Httpie, for cmd-line fans
github.com/jkbr/httpie
Debugging
Wireshark
Remote debug
Service things
REST service help page
Test web client
17. Read more and references
RFCs ietf.org/rfc/... URI …/rfc3986.txt,
URL …/rfc1738.txt HTTP, …/rfc2616.txt
Web API bloggers
webapibloggers.com
ASP.NET Web API
asp.net/webapi
aspnetwebstack.codeplex.com
Alternatives to Web API
servicestack.net
Martin Fowler’s article about Richardson Maturity Model
martinfowler.com/articles/richardsonMaturityModel.ht
ml