Gaining the Knowledge of the Open Data Protocol (OData) Chris Woodruff Director, Perficient Level: Intermediate
Jan 27, 2015
Gaining the Knowledge of the Open Data Protocol (OData)
Chris WoodruffDirector, Perficient
Level: Intermediate
Who I am?
Chris Woodruff
MVP, Visual C#
Director at Perficient
Co-host of Deep Fried Bytes Podcast
@cwoodruff / [email protected] / Skype: cwoodruff
You will learn:
• Understand the background of OData• Have an understanding of the OData
protocol• How to produce an OData feed using
WCF Data Services• How to produce an OData feed using
ASP.NET Web API• How to consume an OData feed using
LINQ
BACKGROUNDKnowledge of OData
Today, the tools for capturing data both at the mega-scale and at the milli-scale are just dreadful. After you have captured the data, you need to curate it before you can start doing any kind of data analysis, and we lack good tools for both data curation and data analysis.
Jim Gray
Quote
Problem: Data APIs frequently create more problems than solutionsTHIS TALK IS ABOUT ONE SOLUTION.
Survey
…knows what the web is
…are comfortable w/ HTTP and XML? JSON?
…have a basic understanding of the term REST
…have created a Data API
Is there really a problem?What is it?QUIZ TIME
Facebook: What fields will I get when I read a post?
Facebook: How do you like a post?
How do developers know what to do?
SO GIVEN THAT NOBODY KNEW THE ANSWERS TO THESE QUESTIONS,
I guess they use docs
So is there really a problem?YesDEVELOPERS DON’T HAVE TIME TO ACTUALLY READ THE DOCS
Can OData Magically cure the problem? No, but it can help.LET’S SEE HOW
THE PROTOCOLKnowledge of OData
The Basics of OData
Feeds, which are Collections of typed Entities
OData services can expose Actions and Functions (v4), Services (v3)
OData services expose all these constructs via URIs
OData service may also expose a Service Metadata Document
Full SQL like Query “Language”
HTTP Command (Verb)
SQL Command
GET SELECT
PUT UPDATE
POST INSERT
DELETE DELETE
The $metadata endpoint
URL Conventions
http://services.odata.org/OData/OData.svc
\_______________________________________/
|
service root URI
http://services.odata.org/OData/OData.svc/Category(1)/Products?$top=2&$orderby=name
\_______________________________________/ \__________________/ \_________________/
| | |
service root URI resource path query options
URL Conventions
$filter/Suppliers?$filter=Address/City eq 'Redmond‘
$orderby/Products?$orderby=ReleaseDate asc, Rating desc
$top and $skip/Products?$top=5&$skip=2
$select and $expand/Products?$select=*,Category/Name&$expand=Category
Combining UEL Conventions
• http://.../Players/–?$skip=10–&$top=2–&filter=substringof(‘Wood',nameLast)–&$orderby=nameLast%20desc–&$select=nickname,yearBorn,nameFirst–&$format=json
Payload Conventions
• Success and error Codes– 200 OK, 201 Created, 415 Unsupported Media Type,
etc
• Overall Format– JSON– AtomPub– JSON Verbose
• Nuances– PATCH, Null payloads, etc
JSON Format
• Friendly to Javascript• 90% more compact than AtomPub• Reads like a custom API• Very little OData “gunk”
Atom Format
• Atom parsers exist in many frameworks• Element fields can be mapped to their
Atom counterparts• A good example of OData interoperability
What else can you do with OData?
• Actions and Functions allow hypermedia-based method calls (non-CRUD operations)
• Defined conventions for PATCH and deep insert
• Vocabularies
OData isn’t always the best fit
• OData may not be a good fit for highly opinionated APIs laden with developer intent
• OData may not be a good fit for bulk data transfer
• OData may not be a good fit for the APIs that dramatically different in shape than the backend
OData does not support all queries
• OData doesn’t currently support aggregation– You can’t ask for customers that have at least 2
orders
• OData doesn’t currently support filters expansions– You can’t ask for a customer and only their orders
placed in 2013
• OData doesn't support “graph” queries– You can ask friend-of-a-friend type queries, but there
are limitations
OData is becoming a standard
• OASIS, ISO• ETA early 2014
Who uses OData?
What does OData give me and my organization?
Empower Internal Power Users
Empower Existing and Future Customers
Monetize Data for untapped Revenue
CREATING FEED W/ WCF DATA SERVICES
Knowledge of OData
WCF DATA SERVICESDEMO
CREATING FEED W/ ASP.NET WEB API
Knowledge of OData
ASP.NET WEB APIDEMO
OData Best Practices (Producer)
• Always design your OData feed will server-side paging if your entity collections hold large amounts of data.
• Looks at server-side validation of queries and data updates based on the user credentials sent through HTTP
CONSUMING ODATAKnowledge of OData
What if Data API’s were like…
LINQ?• What are the last 50 invoices we sent?
– context.Invoice.OrderByDescending(i=>i.PostedAt).Take(50);
• What are the invoices from the last 24 hours?– context.Invoice.Where(i=>i.PostedAt > DateTime.Now.AddDays(-1));
• How many $1M invoices have we sent?– context.Invoice.Where(i=>i.TotalAmount >= 1000000);
CONSUMING ODATA WITH LINQ
DEMO
OData Best Practices (Consumer)
• Use Query Projection to only bring back the entity properties you or your app needs.
• Think about client-side paging even if their exists server-side paging.
• Design and implement a client-side data caching function in your app (unless sensitive data).
Why are we excited!!
WRAP-UPKnowledge of OData
The demo projects can be found at:
github.com/cwoodruff/
Resources
RESThttp://www.ics.uci.edu/~taylor/documents/2002-REST-TOIT.pdf
OData
http://odata.org
http://odataprimer.com
Contact Me
Chris “Woody” [email protected]
Twitter @cwoodruff
Skype cwoodruff
http://chriswoodruff.com
http://deepfriedbytes.com