Öppna Data Protocol

Inom datoranvändning är Open Data Protocol ( OData ) ett öppet protokoll som tillåter skapandet och konsumtionen av frågebara och interoperabla REST API : er på ett enkelt och standardmässigt sätt. Microsoft initierade OData 2007. Versioner 1.0, 2.0 och 3.0 släpps under Microsoft Open Specification Promise . Version 4.0 standardiserades hos OASIS , med en release i mars 2014. I april 2015 skickade OASIS OData v4 och OData JSON Format v4 till ISO/IEC JTC 1 för godkännande som en internationell standard . I december 2016 publicerade ISO/IEC OData 4.0 Core som ISO/IEC 20802-1:2016 och OData JSON-formatet som ISO/IEC 20802-2:2016.

Protokollet möjliggör skapandet och konsumtionen av REST- API:er, som tillåter webbklienter att publicera och redigera resurser, identifierade med URL:er och definierade i en datamodell , med enkla HTTP-meddelanden. OData delar vissa likheter med JDBC och med ODBC ; precis som ODBC är OData inte begränsad till relationsdatabaser .

Standardisering

Efter initial utveckling av Microsoft blev OData ett standardiserat protokoll för OASIS OData Technical Committee (TC).

OASIS OData tekniska kommitté

"OASIS OData TC arbetar för att förenkla sökning och delning av data mellan olika applikationer och flera intressenter för återanvändning i företaget, molnet och mobila enheter. Ett REST-baserat protokoll, OData bygger på HTTP , AtomPub och JSON med hjälp av URI:er för att adressera och komma åt dataflödesresurser. Det gör det möjligt att komma åt information från en mängd olika källor inklusive (men inte begränsat till) relationsdatabaser, filsystem, innehållshanteringssystem och traditionella webbplatser. OData ger ett sätt att bryta ner data silos och öka det delade värdet av data genom att skapa ett ekosystem där datakonsumenter kan samverka med dataproducenter på ett sätt som är mycket kraftfullare än vad som för närvarande är möjligt, vilket gör att fler applikationer kan förstå en bredare uppsättning data. Varje producent och konsument av data som deltar i detta ekosystem ökar dess totala värde."

TC-deltagare inkluderar CA Technologies , Citrix Systems , IBM , Microsoft , Progress Software , Red Hat , SAP SE och SDL .

Arkitektur

OData är ett protokoll för att skapa och konsumera RESTful API:er. Således, som vanliga metoder för REST, bygger OData på HTTP, AtomPub och JSON och använder URI:er för att adressera och komma åt dataflödesresurser.

Resursidentifiering

OData använder URI:er för att identifiera resurser. För varje OData-tjänst vars tjänstrot förkortas till http://host/service/ , kan följande fasta resurser hittas:

Servicedokumentet

Servicedokumentet listar entitetsuppsättningar, funktioner och singletons som kan hämtas. Kunder kan använda servicedokumentet för att navigera i modellen på ett hypermediadrivet sätt.

Servicedokumentet finns tillgängligt på http://host/service/ .

Metadatadokumentet

Metadatadokumentet beskriver de typer, uppsättningar, funktioner och åtgärder som OData-tjänsten förstår. Klienter kan använda metadatadokumentet för att förstå hur man frågar och interagerar med enheter i tjänsten.

Metadatadokumentet är tillgängligt på http://host/service/$metadata .

Dynamiska resurser

URI:erna för de dynamiska resurserna kan beräknas från hypermediainformationen i tjänstedokumentet och metadatadokumentet.

Resursdrift

OData använder HTTP-verben för att indikera operationerna på resurserna.

  • GET: Hämta resursen (en samling enheter, en enstaka enhet, en strukturell egenskap, en navigationsegenskap, en ström, etc.).
  • POST: Skapa en ny resurs.
  • PUT: Uppdatera en befintlig resurs genom att ersätta den med en komplett instans.
  • PATCH: Uppdatera en befintlig resurs genom att ersätta en del av dess egenskaper med en partiell instans.
  • DELETE: Ta bort resursen.

Frågar

URL:er som begärs från en OData-slutpunkt kan innehålla frågealternativ. OData-protokollet specificerar olika "systemfrågealternativ" som slutpunkter ska acceptera, dessa kan användas för att filtrera, beställa, kartlägga eller paginera data.

Frågealternativ kan läggas till i en URL efter en ? tecken och separeras av & tecken; varje alternativ består av ett $ -tecken med prefixnamn och dess värde, åtskilda av ett = -tecken, till exempel: OData/Products?$top=2&$orderby=Name . Ett antal logiska operatorer och funktioner är definierade för användning vid filtrering av data, till exempel: OData/Products?$filter=Pris lt 10,00 och startswith(Name,'M') begär produkter med ett pris som är mindre än 10 och ett namn som börjar med bokstaven 'M'.

Resursrepresentation

OData använder olika format för att representera data och datamodellen. I OData-protokollversion 4.0 är JSON-formatet standarden för att representera data, där Atom -formatet fortfarande befinner sig i kommittéspecifikationsstadiet. För att representera datamodellen används Common Schema Definition Language (CSDL), som definierar en XML-representation av entitetsdatamodellen som exponeras av OData-tjänster.

Ett exempel på OData JSON-datanyttolast

En samling produkter:


   
   
    
       0
       
       
       
       
       
       
    
    
       
       
       
       
       
       
       
    
    
  
 {  "@odata.context"  :  "http://services.odata.org/V4/OData/OData.svc/$metadata#Products"  ,  "value"  :  [  {  "ID"  :  ,  "Name"  :  "Kött "  ,  "Description"  :  "Red Meat"  ,  "ReleaseDate"  :  "1992-01-01T00:00:00Z"  ,  "DiscontinuedDate"  :  null  ,  "Rating"  :  14  ,  "Price"  :  2.5  },  {  "ID"  :  1  ,  "Name"  :  "Milk"  ,  "Description"  :  "Low fat milk"  ,  "ReleaseDate"  :  "1995-10-01T00:00:00Z"  ,  "DiscontinuedDate"  :  null  ,  "Rating"  :  3  ,  " Pris"  :  3,5  },  ...  ]  } 

Ett exempel på OData Atom-datanyttolast

En samling produkter:

       
  
   
  
     
  
    
      
       
        
        
        
        
        
        
    
    
    
      
    
     
      
         0
        
        
         
         
         
         
      
    
  
  
    
      
       
        
        
        
        
        
        
    
    
    
      
    
     
      
         
        
        
         
         
         
         
      
    
  
 <feed  xml:base=  "http://services.odata.org/V4/OData/OData.svc/"  m:context=  "http://services.odata.org/V4/OData/OData.svc/$ metadata#Products"  xmlns=  "http://www.w3.org/2005/Atom"  xmlns:d=  "http://docs.oasis-open.org/odata/ns/data"  xmlns:m=  "http://docs.oasis-open.org/odata/ns/data" ://docs.oasis-open.org/odata/ns/metadata"  xmlns:georss=  "http://www.georss.org/georss"  xmlns:gml=  "http://www.opengis.net/gml "  >  <id>  http://services.odata.org/v4/odata/odata.svc/Products  </id>  <title  type=  "text"  >  Produkter  </title>  <updated>  2015-05-19T03: 38:50Z  </updated>  <link  rel=  "self"  title=  "Products"  href=  "Products"  />  <entry>  <id>  http://services.odata.org/V4/OData/OData.svc/ Produkter(0)  </id>  <category  term=  "#ODataDemo.Product"  scheme=  "http://docs.oasis-open.org/odata/ns/scheme"  />  <länk  rel=  "edit"  title=  "Product"  href=  "Products(0)"  />  <link  rel=  "http://docs.oasis-open.org/odata/ns/relatedlinks/Categories"  type=  "application/xml"  title=  "Kategorier"  href=  "Products(0)/Categories/$ref"  />  <länk  rel=  "http://docs.oasis-open.org/odata/ns/related/Categories"  type=  "application/atom+xml;type =feed"  title=  "Kategorier"  href=  "Produkter(0)/Kategorier"  />  <länk  rel=  "http://docs.oasis-open.org/odata/ns/relatedlinks/Supplier"  type=  "application/ xml"  title=  "Leverantör"  href=  "Products(0)/Supplier/$ref"  />  <länk  rel=  "http://docs.oasis-open.org/odata/ns/related/Supplier"  type=  " application/atom+xml;type=entry"  title=  "Leverantör"  href=  "Products(0)/Supplier"  />  <länk  rel=  "http://docs.oasis-open.org/odata/ns/relatedlinks/ ProductDetail"  type=  "application/xml"  title=  "ProductDetail"  href=  "Products(0)/ProductDetail/$ref"  />  <länk  rel=  "http://docs.oasis-open.org/odata/ns/ related/ProductDetail"  type=  "application/atom+xml;type=entry"  title=  "ProductDetail"  href=  "Products(0)/ProductDetail"  />  <title/>  <updated>  2015-05-19T03:38:50Z  </updated>  <author>  <name/>  </author>  <content  type=  "application/xml"  >  <m:properties>  <d:ID  m:type=  "Int32"  >  </d:ID>  <d :Name>  Bröd  </d:Name>  <d:Description>  Fullkornsbröd  </d:Description>  <d:ReleaseDate  m:type=  "DateTimeOffset"  >  1992-01-01T00:00:00Z  </d:ReleaseDate >  <d:DiscontinuedDate  m:null=  "true"  />  <d:Rating  m:type=  "Int16"  >  4  ​​</d:Rating>  <d:Price  m:type=  "Dubbel"  >  2,5  </d: Pris>  </m:properties>  </content>  </entry>  <entry>  <id>  http://services.odata.org/V4/OData/OData.svc/Products(1)  </id>  <category  term=  "#ODataDemo.Product"  scheme=  "http://docs.oasis-open.org/odata/ns/scheme"  />  <länk  rel=  "edit"  title=  "Produkt"  href=  "Produkter(1) "  />  <link  rel=  "http://docs.oasis-open.org/odata/ns/relatedlinks/Categories"  type=  "application/xml"  title=  "Categories"  href=  "Products(1)/Categories/ $ref"  />  <länk  rel=  "http://docs.oasis-open.org/odata/ns/related/Categories"  type=  "application/atom+xml;type=feed"  title=  "Kategorier"  href=  "Products(1)/Categories"  />  <link  rel=  "http://docs.oasis-open.org/odata/ns/relatedlinks/Supplier"  type=  "application/xml"  title=  "Leverantör"  href=  " Products(1)/Supplier/$ref"  />  <link  rel=  "http://docs.oasis-open.org/odata/ns/related/Supplier"  type=  "application/atom+xml;type=entry"  title=  "Supplier"  href=  "Products(1)/Supplier"  />  <länk  rel=  "http://docs.oasis-open.org/odata/ns/relatedlinks/ProductDetail"  type=  "application/xml"  title= =  "ProductDetail"  href=  "Products(1)/ProductDetail/$ref"  />  <länk  rel=  "http://docs.oasis-open.org/odata/ns/related/ProductDetail"  type=  "application/atom +xml;type=entry"  title=  "ProductDetail"  href=  "Products(1)/ProductDetail"  />  <title/>  <updated>  2015-05-19T03:38:50Z  </updated>  <author>  <name/ >  </author>  <content  type=  "application/xml"  >  <m:properties>  <d:ID  m:type=  "Int32"  >  1  </d:ID>  <d:Name>  Mjölk  </d:Name >  <d:Description>  Lågfettsmjölk  </d:Description>  <d:ReleaseDate  m:type=  "DateTimeOffset"  >  1995-10-01T00:00:00Z  </d:ReleaseDate>  <d:DiscontinuedDate  m:null=  "true"  />  <d:Rating  m:type=  "Int16"  >  3  </d:Rating>  <d:Price  m:type=  "Dubbel"  >  3,5  </d:Price>  </m:properties>  < /content>  </entry>  ...  </feed> 

Ett exempel på OData-metadatadokument

  
  
      
       
        
           
        
           
          
          
           
          
           
           
      

       
          
          
          
          
          
      
      
       
          
      
    
  
 <edmx:Edmx  Version=  "4.0"  xmlns:edmx=  "http://docs.oasis-open.org/odata/ns/edmx"  >  <edmx:DataServices>  <Schema  Namespace=  "ODataDemo"  xmlns=  "http: //docs.oasis-open.org/odata/ns/edm"  >  <EntityType  Name=  "Product"  >  <Key>  <PropertyRef  Name=  "ID"  />  </Key>  <Property  Name=  "ID"  Type=  "Edm.Int32"  Nullable=  "false"  />  <Property  Name=  "Name"  Type=  "Edm.String"  />  <Property  Name=  "Description"  Type=  "Edm.String"  />  <Property  Name=  "ReleaseDate "  Type=  "Edm.DateTimeOffset"  Nullable=  "false"  />  <Property  Name=  "DiscontinuedDate"  Type=  "Edm.DateTimeOffset"  />  <Property  Name=  "Rating"  Type=  "Edm.Int16"  Nullable=  "false"  />  <Property  Name=  "Price"  Type=  "Edm.Double"  Nullable=  "false"  />  </EntityType>  <ComplexType  Name=  "Address"  >  <Property  Name=  "Street"  Type=  "Edm.String"  / >  <Property  Name=  "City"  Type=  "Edm.String"  />  <Property  Name=  "State"  Type=  "Edm.String"  />  <Property  Name=  "ZipCode"  Type=  "Edm.String"  />  < Property  Name=  "Country"  Type=  "Edm.String"  />  </ComplexType>  <EntityContainer  Name=  "DemoService"  >  <EntitySet  Name=  "Products"  EntityType=  "ODataDemo.Product"  ></EntitySet>  </EntityContainer>  </Schema>  </edmx:DataServices>  </edmx:Edmx> 

Ekosystem

ODatas ekosystem består av klient/serverbiblioteken som implementerar protokollet och applikationer som är baserade på protokollet.

Bibliotek

Det finns ett antal OData-bibliotek tillgängliga för att komma åt/producera OData API:er:

.NETTO

  • Server och klient: Microsofts OData .NET-bibliotek
  • Klient: Simple.OData.Client

Java

  • Server och klient: Apache Olingo
  • Serversidan: Jello-Framework
  • Klient: odata-klient

JavaScript

  • Klient: Apache Olingo (med OASIS )
  • Klient: data.js
  • Klient: JayData för högre abstraktionsnivå (LINQ-liknande syntax, stöd för OData geofunktioner, IndexedDB, WebSQL, integration för DevExtreme, Kendo UI, Angular.js, Knockout.js och Sencha).
  • Klient: OpenUI5 -biblioteket underhålls av SAP
  • Klient (Node.js): JayData för nod
  • Klient: Breeze
  • Klient: OData4 och Invantive Bridge Online
  • Klient: odata-fluent-query: en Javascript OData-frågespråkparser
  • Server: nod-odata

PHP

  • Klient: odataphp
  • Server: POData

Pytonorm

  • Klient: PyOData
  • Server och klient: Pyslet

Rubin

  • Klient: ruby_odata library
  • Klient: Gratis OData V4.0-bibliotek för Ruby
  • Server: Safrano

Andra

Andra implementerade språk inkluderar:

  • AJAX: ASP.NET Ajax Library för att komma till OData.
  • C++: odatacpp_client är en implementering av OData-protokollet endast på klientsidan.
  • Windward Studios stödjer OData i deras rapporterings- och dokumentgenereringslösningar.
  • Rapporteringsverktyget List & Label har en specialiserad dataleverantör för OData.
  • Blackberry (C++): OData-BB10 Open Data Protocol (OData)-bibliotek för BlackBerry 10 (BB10) Cascades-appar

Ansökningar

Applikationer inkluderar:

Verktyg

  • Nucleon Database Master

Se även

externa länkar

OData OASIS-standarder

Kommittéspecifikationer

Kommittéanteckningar