REST & .NET
-
Upload
halla-guerrero -
Category
Documents
-
view
29 -
download
0
description
Transcript of REST & .NET
![Page 1: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/1.jpg)
REST &
.NET
James Crisp.NET Practice Lead
ThoughtWorks Australia
![Page 2: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/2.jpg)
James Crisp
![Page 3: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/3.jpg)
![Page 4: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/4.jpg)
The Web
![Page 5: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/5.jpg)
*-ilities
![Page 6: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/6.jpg)
Scalability
![Page 7: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/7.jpg)
Recoverability & Reliability
![Page 8: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/8.jpg)
Security
![Page 9: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/9.jpg)
Discoverability
![Page 10: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/10.jpg)
![Page 11: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/11.jpg)
How to bring toWeb services?
![Page 12: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/12.jpg)
Tunneling
RPC URLs
POX
SOAP & WS-*
![Page 13: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/13.jpg)
REpresentational State Transfer
![Page 14: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/14.jpg)
![Page 15: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/15.jpg)
“REST contributes ... the rationale behind the modern Web's software architecture...”
-- Roy Fielding
![Page 16: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/16.jpg)
Resourcese.g. Person, Car, Post
![Page 17: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/17.jpg)
Representations
<person> <name>Bill Gates</name> <gender>m</gender></person>
![Page 18: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/18.jpg)
![Page 19: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/19.jpg)
Addressabilityhttp://mysite.com/people/joe_citizen
http://mysite.com/people/joe_citizen/friends
![Page 20: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/20.jpg)
Uniform Interface
![Page 21: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/21.jpg)
GET
POST
HEAD
PUT
DELETE
OPTIONS
Su
pp
ort
![Page 22: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/22.jpg)
GET
GET /people/joe_citizen HTTP/1.1Host: mysite.comAccept: application/xml
![Page 23: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/23.jpg)
Response200 OKContent-Type: application/xmlLast-Modified: 2008-1-1 15:00..
<person> <name>Joe Citizen</name> <age>42</age> <gender>m</gender></person>
![Page 24: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/24.jpg)
HEADHEAD /people/joe_citizen HTTP/1.1Host: mysite.com
200 OKContent-Type: application/xmlLast-Modified: 2008-1-1 15:00..ETag: a32daf15-b33da2a4d
Response
![Page 25: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/25.jpg)
POSTPOST /people HTTP/1.1Content-Type: text/xmlHost: mysite.com....<person> <name>Tina Jones</name> <age>25</age> <gender>F</gender></person>
![Page 26: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/26.jpg)
Response
201 CREATEDLocation: /people/tina_jones
(optionally with body)
![Page 27: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/27.jpg)
PUTPUT /people/tina_jones HTTP/1.1Content-Type: text/xmlHost: mysite.com....<person> <name>Tina Jones</name> <age>24</age> <gender>F</gender></person>
![Page 28: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/28.jpg)
Response
200 OKLocation: /people/tina_jones
(optionally with body)
![Page 29: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/29.jpg)
DELETEDELETE /people/joe_citizen HTTP/1.1Host: mysite.com
200 OKContent-Type: application/xml<admin:personDeleted> joe_citizen</admin:personDeleted>
Response
![Page 30: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/30.jpg)
OPTIONS
OPTIONS /people HTTP/1.1Host: mysite.com
200 OKAllowed: GET,HEAD,POST
Response
![Page 31: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/31.jpg)
Status Codes
![Page 32: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/32.jpg)
2xx = All good200 – OK201 – Created
![Page 33: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/33.jpg)
3xx = Redirect301 – Moved permanently307 – Temporary redirect304 – Not modified (ie, see cache)
![Page 34: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/34.jpg)
4xx = Client error400 – Bad request401 – Unauthorized403 – Forbidden405 – Method not allowed409 – Conflict
![Page 35: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/35.jpg)
5xx = Server error500 – Internal server error
![Page 36: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/36.jpg)
Headers
![Page 37: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/37.jpg)
Content-Type:text/htmlapplication/xmlimage/jpeg....
![Page 38: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/38.jpg)
WWW-Authenticate:
Authorization:
![Page 39: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/39.jpg)
Last-Modified:If-Modified-Since:
ETag:If-None-Match:
![Page 40: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/40.jpg)
Location:
![Page 41: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/41.jpg)
Describe your services?
![Page 42: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/42.jpg)
URI Templateshttp://s3.amazon.com/{bucket-name}/{object-name}
http://mysite.com/users/{user-name}/photos
http://google.com/search?q={search-query}
![Page 43: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/43.jpg)
Start URL + Links
https://bank.com/accounts/345095
<account> <name>Tina Jones</name> <link rel="history" href="/tjones/account_history"> <link rel="close" verb="delete" href="/tjones"></account>
![Page 44: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/44.jpg)
Microformats<account> <name>Tina Jones</name> <link rel="transaction-search" href="account_history?
from={date-from}&to={date-to}">
</account>
![Page 45: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/45.jpg)
State Management
http://google.com
Search
google.com/search?q=rest
google.com/search?q=rest&start=10
Next Page
Searching
Searched
More Results
![Page 46: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/46.jpg)
Data Format?
![Page 47: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/47.jpg)
XHTML<h1>Accounts</h1> <ul> <li> <a rel="account_details" href="/tjones">Tina Jones</a> </li>
<li>.....
![Page 48: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/48.jpg)
JSON
{ "account_name": "Tina Jones", "links":
{"history": "/tjones/history"}}
![Page 49: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/49.jpg)
<XML></XML>
![Page 50: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/50.jpg)
Framework
![Page 51: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/51.jpg)
Ordering Pizza
![Page 52: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/52.jpg)
http://epizza.com
GET / HTTP/1.1Host: epizza.comContent-Type: application/xml
![Page 53: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/53.jpg)
Response
200 OKLocation: http://epizza.comContent-Type: application/xmlContent-Length: ...
<epizza xmlns="/schema"> <message>Welcome!</message> <link rel="menu" href="/menu" /> <link rel="place-order" href="/orders" /><epizza>
![Page 54: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/54.jpg)
Let's see the menu!
GET /menu HTTP/1.1Host: epizza.comContent-Type: application/xml
![Page 55: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/55.jpg)
200 OKLocation: ...
<epizza xmlns="/schema"> <menu> <pizza name="pepperoni"> <ingredients>...</ingredients> </pizza> ... <menu> <link rel="place-order" href="/orders" /></epizza>
Menu Response
![Page 56: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/56.jpg)
Ordering time!POST /orders HTTP/1.1Host: epizza.comContent-Type: application/xmlContent-Length: ...
<order xmlns="/schema"> <pizza name="pepperoni" /></order>
![Page 57: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/57.jpg)
201 CreatedLocation: http://epizza.com/orders/413Content-Type: ...
<epizza xmlns="/schema"> <order> <pizza name="pepperoni" /> </order> <link rel="destination" href="/orders/413/address"></epizza>
Place Order Response
![Page 58: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/58.jpg)
Beer with that?
![Page 59: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/59.jpg)
OPTIONS /orders/413 HTTP/1.1Host: epizza.com
200 OKAllowed: GET, HEAD, POST, PUT
![Page 60: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/60.jpg)
Add BeerPOST /orders/413 HTTP/1.1Host: epizza.comContent-Type: application/xmlContent-Length: ...
<order xmlns="/schema"> <drink name="corona" /></order>
![Page 61: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/61.jpg)
200 OKLocation: http://epizza.com/orders/413Content-Type: ...
<epizza xmlns="/schema"> <order> <pizza name="pepperoni" /> <drink name="corona" /> </order> <link rel="destination" href="/orders/413/destination"></epizza>
Response
![Page 62: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/62.jpg)
Destination AddressPUT /orders/413/address HTTP/1.1
Host: epizza.comContent-Type: application/xmlContent-Length: ...
<address xmlns="/schema"> <line1>35 Rue Rd</line1> <suburb>Potts Point</suburb></address>
![Page 63: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/63.jpg)
Destination Response200 OKHost: epizza.comContent-Type: application/xmlContent-Length: ...
<address xmlns="/schema"> <line1>35 Rue Rd</line1> <suburb>Potts Point</suburb></address>
![Page 64: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/64.jpg)
200 OKLocation: http://epizza.com/orders/413Content-Type: ...
<epizza xmlns="/schema"> <order> <pizza name="pepperoni" /> <drink name="corona" /> </order></epizza>
GET /orders/413
![Page 65: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/65.jpg)
![Page 66: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/66.jpg)
Can we?
OPTIONS /orders/413 HTTP/1.1Host: epizza.com
200 OKAllowed: GET, HEAD
![Page 67: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/67.jpg)
Too late!
![Page 68: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/68.jpg)
![Page 69: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/69.jpg)
Back at theePizza
Kitchen..
![Page 70: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/70.jpg)
GET /orders
![Page 71: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/71.jpg)
Implementation
![Page 72: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/72.jpg)
Clientvar request =
(HttpWebRequest) WebRequest.Create(URL);
request.Methodrequest.ContentTyperequest.GetRequestStream()
var response = (HttpWebResponse)request.GetResponse();
response.StatusCoderesponse.Headersresponse.GetResponseStream()
![Page 73: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/73.jpg)
![Page 74: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/74.jpg)
Server
![Page 75: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/75.jpg)
IHttpHandlerpublic class RestHandler : IHttpHandler{ public void ProcessRequest(HttpContext context) { context.Response.ContentType =
"application/xml"; if (context.Request.HttpMethod == "GET") { context.Response.Write("<xml>...</xml>"); }}
![Page 76: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/76.jpg)
WCF REST
[ServiceContract]public interface IPizzaService{
[WebGet(UriTemplate="/orders/{orderId}")][OperationContract]Order GetOrder(int orderId);
}
![Page 77: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/77.jpg)
Status codes?
Headers?
Links?
Microformats?
![Page 78: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/78.jpg)
ASP.NET MVC
![Page 79: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/79.jpg)
Routing Table
Controller Method
Model View
![Page 80: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/80.jpg)
RoutesIn GlobalApplication : HttpApplication
void RegisterRoutes(RouteCollection routes) { routes.MapRoute( "AddToOrder", "orders/{id}", new { controller = "Orders", action = "AddToOrder" }, new { httpMethod = new HttpMethodConstraint("POST")});
... }
![Page 81: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/81.jpg)
Controllerpublic class OrdersController : Controller{ public ActionResult AddToOrder(int id) { var order = Order.Load(id); var itemToAdd = CreateMenuItemFromRequest(); order.Items.Add(itemToAdd); order.Save();
// response.StatusCode = 200;
return View(order); }}
![Page 82: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/82.jpg)
Model
public class Order{ public MenuItem[] Items { get { ... }; }
public Address DeliveryAddress { get; set; }}
![Page 83: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/83.jpg)
View
<%@ Page Language="C#" ...>
<epizza xmlns="/schema"> <order> <% foreach (var item in Order.Items) { %> <pizza name= "<%= item.Name %>" /> <% } %> </order> <% if (Order.DeliveryAddress == null) { %> <link rel="destination" href= ...</epizza>
![Page 84: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/84.jpg)
MVC REST
Wrinkles
![Page 85: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/85.jpg)
![Page 86: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/86.jpg)
See also...Slides & Code
http://www.jamescrisp.org MVC http://www.asp.net/mvc/
RESTful Web Services
![Page 87: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/87.jpg)
http://flickr.com/photos/misserion/2190827125/ - webhttp://flickr.com/photos/hyougushi/412600118/ - bridgehttp://en.wikipedia.org/wiki/Image:Internet_map_1024.jpg - webhttp://flickr.com/photos/gradin/3361527/ - defibrillatorhttp://flickr.com/photos/keoki/1418303458/ - padlockshttp://roadmap.cbdiforum.com/reports/protocols/ - ws* stackhttp://flickr.com/photos/chainsawpanda/1528894/ - tunnelhttp://flickr.com/photos/psd/421186578/ - fieldinghttp://flickr.com/photos/esparta/187132368/ - bill gateshttp://flickr.com/photos/acme_explosives/117276632/ - network plugshttp://flickr.com/photos/walterhertman/101489766/ - speedometershttp://flickr.com/photos/sis/5908199/ - Petco explosionhttp://flickr.com/photos/pleasewait/476776136/ - letterhttp://flickr.com/photos/bigpinkcookie/108895725/ - Eiffel towerhttp://flickr.com/photos/bala_/2077047513/ - pizza restauranthttp://flickr.com/photos/57231735@N00/201482385/ - pepperoni pizzahttp://flickr.com/photos/sheeshoo/10321250/ - coronahttp://flickr.com/photos/freddy/39340695/ - saladhttp://flickr.com/photos/huthfamily/1304336305/ - 42 pizza boxeshttp://www.crummy.com/writing/RESTful-Web-Services/cover.png – REST book
Image References
![Page 88: REST & .NET](https://reader035.fdocuments.us/reader035/viewer/2022062321/56812b99550346895d8fba76/html5/thumbnails/88.jpg)
Questions?