Download presentation
Presentation is loading. Please wait.
Published byClaud Maxwell Modified over 9 years ago
1
OPEN DATA PROTOCOL (ODATA) DEEP DIVE A common, open, RESTful Web protocol for querying and updating data that provides a uniform way to unlock data and free it from silos that exist in applications today.
2
ODATA = REST Resource-oriented o Entities modeled as URI-addressable Resources o Relationships modeled as links (URIs) o CRUD = POST, GET, PUT/PATCH, DELETE Hypermedia-driven o Navigate from Service Document to Sets to Members to related items to… o Links in Payload for editing, navigation, operations, etc. + Data Model URLs, operations, namespaces, derived from declarative model + Common Conventions Common query string options Representation within Formats + Common Formats ATOM, JSON
3
USE OF HTTP HTTP Methods GET, POST, PUT/PATCH, DELETE HTTP Headers Content Negotiation o Accept, Accept-Charset, Accept-Encoding, Accept-Language o Content-Type, Content-Length, Content-Encoding, Content-Language Concurrency o Etags, If-Match, If-None-Match Etc… HTTP Result Codes 2xx Success Codes 3xx Redirection 4xx Client Error Messages
4
ODATA FEATURE AREAS Versioning Service Metadata Data Requests Data Modification Relationships Content Types Extensibility
5
VERSIONING
6
PROTOCOL VERSIONING DataServiceVersion header Describes the protocol version according to which the request/response should be interpreted MaxDataServiceVersion Request Header The maximum protocol version that the client can accept MinDataServiceVersion Request Header The minimum protocol version the client can accept -Clients SHOULD specify a MaxDataService -Services return a response formatted according to the latest protocol version the service supports that is less than MaxDataServiceVersion but at least MinDataServiceVersion
7
SCHEMA VERSIONING When a data model or other breaking change is made to the service, the service URL is generally versioned. For example: odata.netflix.com/v1/Catalog odata.netflix.com/v2/Catalog
8
SERVICE METADATA
9
SERVICE DOCUMENT Root of service exposes a “Service Document” Describes collections of Entities GET /odata.netflix.com/v2/Catalog HTTP/1.1 <service xmlns="http://www.w3.org/2007/app" xmlns:app="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" xml:base="http://odata.netflix.com/v2/Catalog/"> Default - Genres - Titles - TitleAudioFormats - TitleAwards - People - TitleScreenFormats - Languages <service xmlns="http://www.w3.org/2007/app" xmlns:app="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" xml:base="http://odata.netflix.com/v2/Catalog/"> Default - Genres - Titles - TitleAudioFormats - TitleAwards - People - TitleScreenFormats - Languages
10
ENTITY DATA MODEL Exposed on /$metadata Describes Entity Model of Data Service Entity Types Complex Types Association Types EntityContainers GET /odata.netflix.com/v2/Catalog/$metadata HTTP/1.1 <edmx:DataServices m:DataServiceVersion="1.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" Namespace="Netflix.Catalog.v2"> + <edmx:DataServices m:DataServiceVersion="1.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" Namespace="Netflix.Catalog.v2"> +
11
ENTITY TYPE Named structures with keys Support Inheritance Properties String, Integer, Boolean, DateTime, Spatial datatypes Collections, Complex Types Relationship Properties May be marked as "Open" May return "dynamic" properties not described in $metadata <NavigationProperty Name="Titles" Relationship="Self.Genre_Titles" ToRole="Genre_Titles_Target" FromRole="Genre_Titles_Source"/> <NavigationProperty Name="Titles" Relationship="Self.Genre_Titles" ToRole="Genre_Titles_Target" FromRole="Genre_Titles_Source"/>
12
COMPLEX TYPE Named Structures w/o keys Support Inheritance Don't support relationships Because they don't have an independent ID
13
ASSOCIATIONS Define relationships (navigation paths) between Entities Bi-directional Specify Cardinality of each end Can also impose integrity constraints
14
ENTITY CONTAINER Contains EntitySets – collections of Entity Instances AssociationSets – relationships between entities FunctionImports – Actions/Functions exposed by service
15
DATA REQUESTS
16
QUERYING DATA Querying a Set GET /v2/Catalog/Genres HTTP/1.1 Requesting an Individual Entity by ID GET /v2/Catalog/Genres('Adventures') HTTP/1.1 Requesting an Individual Property GET /v2/Catalog/Genres('Adventures')/Name HTTP/1.1 Requesting an Individual Property Raw Value GET /v2/Catalog/Genres('Adventures')/Name/$value HTTP/1.1
17
$FILTER Basic predicates, built-in functions GET /v2/Catalog/Titles?$filter=Name eq 'The Sting' HTTP/1.1 Filter on Properties of a derived type Only returns entities of that type that match the predicate GET /v2/Catalog/Awards?$filter=Netflix.AcademyAward/Category HTTP/1.1 Query based on collection Membership using Any/All GET /v2/Catalog/Titles?$filter=Genres/Any(g:g/Name eq 'Adventure') HTTP/1.1 GET /v2/Catalog/Titles?$filter=Genres/Any(g:g/Name eq 'Adventure') HTTP/1.1
18
OPERATORS Logical Operators eq, ne, gt, ge, lt, le, and, or, not Mathematic Operators add, sub, mult, div, mod Grouping Operator () NULL literal null
19
BUILT-IN FUNCTIONS String Functions substringof, endswith, startswith, length, indexof, substring, tolower, toupper, trim, concat DateTime Functions year(), month(), day(), hour(), minute(), second() Math Functions round(), floor(), ceiling() Type Functions isof() Casting Insert type in path Geo Functions geo.length, geo.intersects, geo.distance
20
$ORDERBY Comma separated list of properties, expressions GET /v2/Catalog/Titles?$orderby=AverageRating,ReleaseYear HTTP/1.1 GET /v2/Catalog/Titles?$orderby=AverageRating,ReleaseYear HTTP/1.1 Can specify asc (default) or desc GET /v2/Catalog/Titles?$orderby=AverageRating desc HTTP/1.1
21
$TOP/$SKIP Enables Client-side paging through large result sets GET /v2/Catalog/Titles?$top=10&$orderby=AverageRating desc HTTP/1.1 GET /v2/Catalog/Titles?$top=10&$orderby=AverageRating desc HTTP/1.1 GET /v2/Catalog/Titles?$top=10&$skip=10 &$orderby=AverageRating desc HTTP/1.1 GET /v2/Catalog/Titles?$top=10&$skip=10 &$orderby=AverageRating desc HTTP/1.1 If no $orderby, server guarantees stable ordering
22
$EXPAND Specify comma separated list of navigation property paths to include in response GET /v2/Catalog/Titles?$expand=Cast,Awards HTTP/1.1 GET /v2/Catalog/Titles?$expand=Cast,Awards HTTP/1.1 Result are returned inline according to the appropriate format
23
$SELECT Narrow the set of fields returned GET /v2/Catalog/Titles?$select=Name,Synopsis,Rating HTTP/1.1 Related properties must be specified in $expand GET /v2/Catalog/Titles?$select=Name,Cast/Name&$expand=Cast HTTP/1.1 GET /v2/Catalog/Titles?$select=Name,Cast/Name&$expand=Cast HTTP/1.1 Can include all properties using * Does not include navigation properties GET /v2/Catalog/Titles?$select=* HTTP/1.1
24
$COUNT/$INLINECOUNT Get just the count Can include additional query operators GET /v2/Catalog/Titles/$count HTTP/1.1 Include the count with the results $inlinecount ignores $top/$skip but includes $filter GET /v2/Catalog/Titles?$inlinecount=allpages&$top=10 HTTP/1.1
25
$FORMAT Specify a particular format "atom" o application/atom+xml, o application/atomsvc+xml for service document "json" o application/json "xml" o application/xml Overrides content type specified in headers
26
SERVER DRIVEN PAGING Server controls the maximum number of records to return at a time Each "page" of results includes a "next link" for retrieving the next page of results Pages can vary in size; some may be blank i.e., return records as computed or across a federation
27
DATA MODIFICATION
28
INSERT POST entity to the EntitySet collection Returns inserted entity Use PREFER header to request no content returned Media Resources have special rules according to AtomPub: POST media resource to the collection Returns Media Link Entry Update the Media Link Entry
29
UPDATE PUT to the edit-link to replace Unspecified values are set to null or default PATCH to the edit-link to affect only specified values Unspecified values are left unchanged Use PREFER header to request content returned Use entity etag in if-match for concurrency control Obtained from header or payload
30
DELETE DELETE to the edit-link to delete Use entity etag in if-match for concurrency control Obtained from header or payload
31
BATCH REQUESTS "Batch" multiple statements in a single multi-part mime request Results for each statement returned in a multi-part mime response Multiple Data Modification statements may be grouped in a single "ChangeSet" ChangeSets are atomic Reference the results of other statements in the changeset o i.e., add a child to an added parent May have multiple ChangeSets per Batch
32
RELATIONSHIPS
33
REQUESTING RELATIONSHIP LINKS Use $links to request the relationship links for a particular navigation property Results are returned as an array of URIs o GET /v2/Catalog/Titles/Genres('Adventures')/$links/Titles HTTP/1.1 GET /v2/Catalog/Titles/Genres('Adventures')/$links/Titles HTTP/1.1
34
CREATING LINKS TO NEW ENTITIES Create a new Entity with a new related entity by POSTing the entity with the related entity as inline content ("Deep Inserts") Create a new entity related to an existing entity by POSTing to the relationship collection of the existing entity POST /v2/Catalog/Titles/Genres('Adventures')/$links/Titles HTTP/1.1 …
35
CREATING LINKS TO EXISTING ENTITIES Create a relationship between two existing entities by POSTing the URL of the one entity to the appropriate $links collection of the other entity o POST /v2/Catalog/Titles/Genres('Adventures')/$links/Titles HTTP/1.1 http://odata.netflix.com/v2/Catalog/Titles('13kbf')
36
DELETING LINKS Remove a relationship by sending a DELETE request to the $links collection specifying the url to remove o DELETE /v2/Catalog/Titles/Genres('Adventures')/$links/Titles HTTP/1.1 http://odata.netflix.com/v2/Catalog/Titles('13kbf')
37
CONTENT TYPES (FORMATS)
38
ATOM FORMAT Multiple entities represented as a Count optionally returned in element Next link returned as element Each entity represented as an is unique id specifies type Self, edit s element for Relationships o Inline content as child element containing feed or element element for editing media Properties nested in element Individual properties namespace qualified with data namespace For Media Resources, has a src property to the media stream o is a sibling of For non-Media Resources, is a child of Functions/Actions returned as and elements
39
<feed xml:base="http://odata.netflix.com/v2/Catalog/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom"> Genres http://odata.netflix.com/v2/Catalog/Genres/ 2012-07-26T18:37:18Z 326 http://odata.netflix.com/v2/Catalog/Genres('Adventures') Adventures 2012-07-26T19:08:35Z <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Titles" type="application/atom+xml;type=feed" title="Titles" href="Genres('Adventures')/Titles" /> <category term="Netflix.Catalog.v2.Genre" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /> Adventures <feed xml:base="http://odata.netflix.com/v2/Catalog/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom"> Genres http://odata.netflix.com/v2/Catalog/Genres/ 2012-07-26T18:37:18Z 326 http://odata.netflix.com/v2/Catalog/Genres('Adventures') Adventures 2012-07-26T19:08:35Z <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Titles" type="application/atom+xml;type=feed" title="Titles" href="Genres('Adventures')/Titles" /> <category term="Netflix.Catalog.v2.Genre" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /> Adventures ATOM PAYLOAD - EXAMPLE
40
JSON VERBOSE FORMAT Results wrapped in a "d" wrapper Multiple entities returned as JSON Array property named "Result" o Optionally has __Count property for number of elements in query result (across all pages) o Optionally has "__next" property for next link Each Entity has o A "__metadata" property containing: – URI – Type – Media Link, edit-media link, content type, etag for media resources o A "__deferred" property for each un-expanded relationship containing the URL for the related entity/collection o Properties a Name/Value pairs Each Complex Type has a "__metadata" property containing the Type
41
JSON PAYLOAD - EXAMPLE { "d" : { "results": [ { "__metadata": { "uri":"http://odata.netflix.com/Genres('Adventures')", "type": "Netflix.Catalog.v2.Genre" }, "Name": "Adventures", "Titles": { "__deferred": { "uri":"http://odata.netflix.com/Genres('Adventures')/Titles"} } ], "__count": "326", "__next": " Genres/?$skiptoken='Adventures'" }
42
NEW JSON ODATA FORMAT Effort to simplify JSON More readable JSON format Reduce size Preserve OData-ness o Still Hypermedia-driven Uses Namespacing Mechanism Removes almost all metadata from payloads Calculates values from conventions or templates in metadata 80-90% more efficient than Atom Future contribution to TC
43
NEW JSON PAYLOAD - EXAMPLE { "odata.metadata":"http://odata.netflix.com/$metadata#Netflix/Genres", "count":"830", "value": [ { "Name": "Adventures", } ], "nextLink":" http://odata.netflix.com/Genres('Adventures')/Titles " }
44
EXTENSIBILITY
45
CUSTOM ACTIONS Side-effecting operations that may or may not return a value May be exposed on instances (Hypermedia-driven) Use entity etag in if-match for concurrency control Obtained from header or payload
46
CUSTOM FUNCTIONS Extend query language May be exposed on instances (Hypermedia-driven) Use entity etag in if-match for concurrency control Obtained from header or payload
47
VOCABULARIES An OData Vocabulary defines a shareable set of Annotations that may be applied to metadata or instance data Extended Property Information o Units of measurement o Read-only, read-write Ontologies o This entity represents the common concept of a person Validation o This integer property is between 10 and 20 Display hints o Caption field, grouping, navigation Service Capabilities o Query limitations, etc. Extension o Analytics
48
ANNOTATIONS CONSIST OF: A Target: The construct against which the annotation is applied o May be any Model Construct (type, property, etc.) A Term: The global name of the annotation o For example, org.odata.display.Title A Value: The value for the annotation o May be a static value, path, or expression A Vocabulary is a set of terms in a common namespace
49
ANNOTATIONS MAY… Be defined in a common format Machine readable (i.e., for validation) Be embedded in a model To define extended metadata Be applied through an external annotation application file Externally annotate existing services Be applied to Instance Data Information that may vary per instance
50
TYPES OF ANNOTATIONS ValueTerm A single annotation term applied to a type, property, association, etc. Complex TypeTerm Generally used to describe an is-a relationship Relationships may be modeled as properties of individual or collections of other complex type terms Entity TypeTerm Most prescriptive; define keys, relationships
51
UNANNOTATED ENTITY TYPE <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="Sales"> <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="Sales">
52
VOCABULARY DEFINITIONS “Person” vocabulary TypeTerm: Display Vocabulary Value Terms <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="myorg.schemas.person"> <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="myorg.schemas.person"> <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="org.odata.display"> <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="org.odata.display">
53
EXTERNAL ANNOTATION FILE <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="Person"> <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="Person">
54
ANNOTATED METADATA <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="Sales"> <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="Sales">
55
INSTANCE ANNOTATIONS { "odata.json.metadata": "http://myservice.com/sales.svc/$metadata#Sales.Customer", "results" : { “CustomerID" : 123, "FirstName" : "John", "LastName" : "Public", "Email" : "John@public.com", "@CustomerID" : { odata.org.display.readonly : true } } { "odata.json.metadata": "http://myservice.com/sales.svc/$metadata#Sales.Customer", "results" : { “CustomerID" : 123, "FirstName" : "John", "LastName" : "Public", "Email" : "John@public.com", "@CustomerID" : { odata.org.display.readonly : true } }
56
ANNOTATION/METADATA REFERENCING AnnotationReference Specifies a separate document that annotates this model Constrain to individual namespaces, qualifiers through "Include" Reference Brings a separate model "into scope" for use within this model
57
SUMMARY OData = REST o Entities, Entity Sets as URI addressable Resources o Hypermedia Driven o CRUD = POST, GET, PUT/PATCH, DELETE + Data Model o Entity Relational Model + Common Conventions o Query Syntax, Server Driven Paging, … + Common Formats o Atom, JSON + Extensibility o Custom Functions, Actions, Shared Annotations
59
BACKUP
60
{ "d": { "results": [ { "__metadata": { "uri": "http://services.odata.org/OData/OData.svc/Products(0)",http://services.odata.org/OData/OData.svc/Products(0) "type": "ODataDemo.Product" }, "ID": 0, "Name": "Bread", "Description": "Whole grain bread", "ReleaseDate": "\/Date(694224000000)\/", "DiscontinuedDate": null, "Rating": 4, "Price": "2.5", "Category": { "__deferred": { "uri": "http://services.odata.org/OData/OData.svc/Products(0)/Category"http://services.odata.org/OData/OData.svc/Products(0)/Category } }, "Supplier": { "__deferred": { "uri": "http://services.odata.org/OData/OData.svc/Products(0)/Supplier"http://services.odata.org/OData/OData.svc/Products(0)/Supplier } }, { "__metadata": { "uri": "http://services.odata.org/OData/OData.svc/Products(1)",http://services.odata.org/OData/OData.svc/Products(1) "type": "ODataDemo.Product" }, "ID": 1, "Name": "Milk", "Description": "Low fat milk", "ReleaseDate": "\/Date(812505600000)\/", "DiscontinuedDate": null, "Rating": 3, "Price": "3.5", "Category": { "__deferred": { "uri": "http://services.odata.org/OData/OData.svc/Products(1)/Category"http://services.odata.org/OData/OData.svc/Products(1)/Category } }, "Supplier": { "__deferred": { "uri": "http://services.odata.org/OData/OData.svc/Products(1)/Supplier"http://services.odata.org/OData/OData.svc/Products(1)/Supplier } }], "__count": 9 } { "odata.json.metadata": "http://services.odata.org/OData/OData.svc/$metadata#ODataDemo.DemoService.Products",http://services.odata.org/OData/OData.svc/$metadata#ODataDemo.DemoService.Products "results": [ { "ID": 0, "Name": "Bread", "Description": "Whole grain bread", "ReleaseDate": "\/Date(694224000000)\/", "DiscontinuedDate": null, "Rating": 4, "Price": "2.5" }, { "ID": 1, "Name": "Milk", "Description": "Low fat milk", "ReleaseDate": "\/Date(812505600000)\/", "DiscontinuedDate": null, "Rating": 3, "Price": "3.5" }], "__count": 9 } OData.svc/Products?$top=2&$inlinecount=allpages&$format=json
61
QUERY $filter Basic predicates, built-in functions $sort Properties, expressions $select Narrow the set of fields returned $top/$skip Client-side paging $expand Include related entities $count/$inlinecount Include count of entities Server Driven Paging
62
ENTITY DATA MODEL Entity Types Named structures with keys Support Inheritance May be Open Properties String, Integer, Boolean, DateTime, Spatial datatypes Collections, Complex Types Relationship Properties Complex Types Named Structures w/o keys Can’t have relationships to ComplexTypes Associations Expose navigation paths EntityContainer Contains EntitySets, AssociationSets, FunctionImports <NavigationProperty Name="Titles" Relationship="Self.Genre_Titles" ToRole="Genre_Titles_Target" FromRole="Genre_Titles_Source"/>
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.