<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="https://www.w3.org/2005/Atom">
  <channel>
    <title>OData - the Best Way to REST</title>
    <description>OData, short for Open Data Protocol, is an open protocol to allow the creation and consumption of queryable and interoperable RESTful APIs in a simple and standard way.
</description>
    <link>https://www.odata.org/</link>
    <atom:link href="https://www.odata.org/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Tue, 16 Jun 2026 19:54:34 +0300</pubDate>
    <lastBuildDate>Tue, 16 Jun 2026 19:54:34 +0300</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>
    
      <item>
        <title>OData 4.01 Committee Spec Approved</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part1-protocol.html&quot;&gt;OData V4.01&lt;/a&gt; was officially approved as a Committee Specification this week, marking the next step toward final standardization of the much anticipated extensions to OData V4.0.&lt;/p&gt;

&lt;p&gt;OData v4.01 is a fully compatible extension of the OData V4.0 protocol that adopts many popular conventions, syntax and payload simplifications, and incorporates new functionality.&lt;/p&gt;

&lt;p&gt;Some of the major enhancements in OData V4.01 include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model improvements.&lt;/strong&gt;
OData V4.01 services can support the following new metadata constructs:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Edm.Untyped – For specifying that a property may be any type. Supports representing things outside of the OData data model, such as variant typed properties, mixed collections, or collections of collections.&lt;/li&gt;
  &lt;li&gt;Keyless entity types for Singletons – entity types used as singletons, or singleton navigation properties, no longer need to have a defined key value&lt;/li&gt;
  &lt;li&gt;Specialization in Derived Types – Derived types can restrict properties of a base type to be a subtype of the property’s declared type.&lt;/li&gt;
  &lt;li&gt;Ordered Collections – Services can annotate a collection as being “Ordered”, and syntax is added for referencing a member of an ordered collection of primitive or complex types for the purposes of retrieval, update, or delete, as well as inserting into a given location within an ordered collection.&lt;/li&gt;
  &lt;li&gt;Optional Function Parameters – Function parameters can be annotated as optional. Optional parameters may be omitted when invoking the function.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Simplified URL patterns.&lt;/strong&gt;
OData V4.01 adds support for simplified URL syntax, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Key as Segment – Common semantics for representing keys within a URL as a segment, rather than enclosed in parenthesis.&lt;/li&gt;
  &lt;li&gt;Query Option Simplification – Query options are now case-insensitive, and can optionally omit the $ prefix.&lt;/li&gt;
  &lt;li&gt;Optional type prefix for Enums, Durations – Enum and duration values in a Url can be specified without the type prefix.&lt;/li&gt;
  &lt;li&gt;Simplified Operations – Operation names are now case-insensitive, and namespace qualification is optional.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;New Query Features.&lt;/strong&gt;
OData V4.01 adds support for new query functionality, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Computed Properties – Support for projecting computed properties&lt;/li&gt;
  &lt;li&gt;Set Operations – Support for updating/deleting/invoking actions on resources matching a particular criteria&lt;/li&gt;
  &lt;li&gt;New “in” operator – Expressions containing many OR statements can be simplified with the new “in” operator&lt;/li&gt;
  &lt;li&gt;Filtered Count – $count can be computed on a filtered nested collection&lt;/li&gt;
  &lt;li&gt;In-lined stream properties – Stream properties can be requested inline within a payload&lt;/li&gt;
  &lt;li&gt;Delta Update Payloads – Delta payloads can now be used in updates to submit a set of changes, including nested changes, to a collection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Simplified OData JSON Payloads.&lt;/strong&gt;
OData V4.01 simplifies JSON payloads to look more like custom payloads, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Optional OData Prefix – OData Prefix may be omitted from control information&lt;/li&gt;
  &lt;li&gt;Default Namespaces – Services can declare default namespaces in order to omit namespace prefixes from instance annotations&lt;/li&gt;
  &lt;li&gt;Optionally Omit Null Values – Clients can specify a preference to reduce payload size by omitting null or default values.&lt;/li&gt;
  &lt;li&gt;Improved Async response message – In OData V4.0, completed async responses were wrapped as an application/http response message. In 4.01, clients can request async responses be returned unwrapped.&lt;/li&gt;
  &lt;li&gt;New delta payload representation – OData V4.01 introduces a simplified representation for delta payloads, including nested delta sets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A JSON representation for CSDL Metadata.&lt;/strong&gt;
OData V4.01 defines a new JSON representation for CSDL Metadata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A JSON representation for Batch payloads.&lt;/strong&gt;
OData V4.01 defines a new JSON representation for batch request and response payloads.&lt;/p&gt;

&lt;p&gt;For a full description of the new features and conventions, see &lt;a href=&quot;https://docs.oasis-open.org/odata/new-in-odata/v4.01/new-in-odata-v4.01.html&quot;&gt;What’s New in OData V4.01&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Please take a look and send feedback to the &lt;a href=&quot;https://www.oasis-open.org/committees/comments/form.php?wg_abbrev=odata&quot;&gt;OASIS OData TC&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;about-the-author&quot;&gt;About the Author&lt;/h2&gt;

&lt;p&gt;Michael Pizzo is Co-Chair of the OASIS OData Technical Committee and co-editor of the OASIS Standard documents. He has worked for over 30 years in the design and delivery of data access solutions and APIs at Microsoft as a key designer and driver of Microsoft’s Data Access APIs including ODBC, OLEDB, ADO.NET, ADO.NET Entity Framework, and OData.&lt;/p&gt;

&lt;p&gt;Contact Michael Pizzo:
&lt;a href=&quot;https://www.linkedin.com/in/michaeljpizzo/&quot;&gt;www.linkedin.com/in/michaeljpizzo/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow on twitter &lt;a href=&quot;https://twitter.com/michael_pizzo&quot;&gt;@michael_pizzo&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 01 Feb 2018 12:59:43 +0300</pubDate>
        <link>https://www.odata.org/blog/OData-401-Committee-Spec-Published/</link>
        <guid isPermaLink="true">https://www.odata.org/blog/OData-401-Committee-Spec-Published/</guid>
        
        
      </item>
    
      <item>
        <title>Whats New in REST APIs Seminar December 5 2017</title>
        <description>&lt;p&gt;Join experts from Progress and Gartner on Tuesday, December 5th, 2017, in a webinar on using OData to modernize enterprise data.&lt;/p&gt;

&lt;h2 id=&quot;deliver-odata-based-rest-apis-to-modernize-your-enterprise-data&quot;&gt;&lt;a href=&quot;https://www.progress.com/campaigns/datadirect/webinars/whats-new-in-rest-apis-for-your-database&quot;&gt;Deliver OData-based REST APIs to Modernize your Enterprise Data&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;REST APIs have grown exponentially over the past decade thanks to the rise of SaaS applications and highly integrated microservices architectures. Organizations are adopting REST API strategies to better integrate data assets with modern consumers across desktop, web and mobile applications.&lt;/p&gt;

&lt;p&gt;To simplify the process of building and consuming their REST APIs, many enterprises have increasingly adopted OData, an OASIS/ISO approved standard. In the wake of new data privacy laws such as GDPR, organizations are once again looking for powerful REST APIs to access their systems of record in real-time without duplicating or moving sensitive customer data from their enterprise databases.&lt;/p&gt;

&lt;p&gt;Join experts from Progress and Gartner to learn:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Why you should RESTify your database&lt;/li&gt;
  &lt;li&gt;What OData is and what’s new in the latest ISO-approved version&lt;/li&gt;
  &lt;li&gt;Different options for REST-enabling your databases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus—don’t miss our quick demo of provisioning OData without code.&lt;/p&gt;

&lt;p&gt;Speakers:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Sanjeev Mohan, Research Director, Big Data and Advanced Analytics, Gartner&lt;/li&gt;
  &lt;li&gt;Mark Biamonte, Senior Software Architect and OData TC Editor, Progress&lt;/li&gt;
  &lt;li&gt;Nishanth Kadiyala, Product Marketing Specialist, Progress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;https://www.progress.com/campaigns/datadirect/webinars/whats-new-in-rest-apis-for-your-database&quot;&gt;Sign-up today&lt;/a&gt; for what promises to be an interesting webinar!&lt;/p&gt;

&lt;h2 id=&quot;about-the-author&quot;&gt;About the Author&lt;/h2&gt;

&lt;p&gt;Sumit Sarkar is the Chief Data Evangelist at Progress Software new to developing on the Salesforce platform.  He has presented five Dreamforce sessions on data connectivity including the most recent session from DF16 on &lt;a href=&quot;https://www.youtube.com/watch?v=Hqg0FUInSnM&quot;&gt;External Objects for External Big Data Platforms&lt;/a&gt;. Contact Sumit Sarkar:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/meetsumit&quot;&gt;www.linkedin.com/in/meetsumit&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 22 Nov 2017 12:59:43 +0300</pubDate>
        <link>https://www.odata.org/blog/Whats-new-in-REST-APIs-Seminar-December-5-2017/</link>
        <guid isPermaLink="true">https://www.odata.org/blog/Whats-new-in-REST-APIs-Seminar-December-5-2017/</guid>
        
        
      </item>
    
      <item>
        <title>Visual Studio Code Knows OData</title>
        <description>&lt;p&gt;&lt;strong&gt;Visual Studio Code Knows OData&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Through a new &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=stansw.vscode-odata&quot;&gt;Visual Studio Code Extension for OData&lt;/a&gt;, developers can now get rich language support for the OData query language.&lt;/p&gt;

&lt;p&gt;Enabled features include syntax highlighting and query encoding/decoding.  Syntax aware formatting, metadata-driven code completion, and diagnostics are available in a beta state, and can be enabled through settings.&lt;/p&gt;

&lt;p&gt;If you’re an OData developer using Visual Studio Code, this is a must-have extension. Give it a quick try, send feedback, and tell your friends!&lt;/p&gt;

&lt;h2 id=&quot;about-the-author&quot;&gt;About the Author&lt;/h2&gt;

&lt;p&gt;Michael Pizzo is Co-Chair of the OASIS OData Technical Committee and co-editor of the OASIS Standard documents. He has worked for almost 30 years in the design and delivery of data access solutions and APIs at Microsoft as a key designer and driver of Microsoft’s Data Access APIs including ODBC, OLEDB, ADO.NET, ADO.NET Entity Framework, and OData.&lt;/p&gt;

&lt;p&gt;Contact Michael Pizzo:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/michaeljpizzo/&quot;&gt;www.linkedin.com/in/michaeljpizzo/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow on twitter &lt;a href=&quot;https://twitter.com/michael_pizzo&quot;&gt;@michael_pizzo&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Wed, 02 Aug 2017 00:00:00 +0300</pubDate>
        <link>https://www.odata.org/blog/Visual-Studio-Code-Knows-OData/</link>
        <guid isPermaLink="true">https://www.odata.org/blog/Visual-Studio-Code-Knows-OData/</guid>
        
        
      </item>
    
      <item>
        <title>OData Published as an ISO Standard</title>
        <description>&lt;p&gt;&lt;strong&gt;OData 4.0 Published as ISO/IEC 20802&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For those that missed the announcement, I’m thrilled to report that OData 4.0 has been ratified and published as an ISO/IEC Standard.&lt;/p&gt;

&lt;p&gt;OData 4.0 was published as an OASIS Standard in February of 2014. OASIS submitted OData 4.0 (including Errata) to the ISO/IEC JTC 1 Information Technology body the following year, where it went through the standard review process before being unanimously approved in early 2016. The ISO/IEC publication became available early this year.&lt;/p&gt;

&lt;p&gt;The OData 4.0 Core Protocol is available as ISO/IEC 20802-1:2016, and the OData 4.0 JSON Format is available as ISO/IEC 20802-2:2016.&lt;/p&gt;

&lt;p&gt;ISO ratification confirms a higher level of interoperability, and is important to many government agencies worldwide for open data solutions.&lt;/p&gt;

&lt;p&gt;I’d like to take a moment to thank and congratulate the many individuals who have contributed over the years to establishing OData as an International Standard.&lt;/p&gt;

&lt;h2 id=&quot;resources&quot;&gt;Resources&lt;/h2&gt;

&lt;p&gt;OASIS Press Release: &lt;a href=&quot;https://www.oasis-open.org/news/pr/iso-iec-jtc-1-approves-oasis-odata-standard-for-open-data-exchange&quot;&gt;ISO/IEC JTC 1 Approves OASIS OData Standard for Open Data Exchange&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ISO OData Standards Publications &lt;a href=&quot;https://www.iso.org/iso/catalogue_detail.htm?csnumber=69208&quot;&gt;ISO/IEC 20802-1:2016&lt;/a&gt; and &lt;a href=&quot;https://www.iso.org/iso/catalogue_detail.htm?csnumber=69209&quot;&gt;ISO/IEC 20802-2:2016&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.oasis-open.org/committees/odata/&quot;&gt;OASIS OData Technical Committee&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.oasis-open.org/standards#odatav4.0&quot;&gt;OData 4.0 OASIS Standard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.oasis-open.org/standards#odatajsonv4.0&quot;&gt;OData JSON Format 4.0 OASIS Standard&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;about-the-author&quot;&gt;About the Author&lt;/h2&gt;

&lt;p&gt;Michael Pizzo is Co-Chair of the OASIS OData Technical Committee and co-editor of the OASIS Standard documents. He has worked for almost 30 years in the design and delivery of data access solutions and APIs at Microsoft as a key designer and driver of Microsoft’s Data Access APIs including ODBC, OLEDB, ADO.NET, ADO.NET Entity Framework, and OData.&lt;/p&gt;

&lt;p&gt;Contact Michael Pizzo:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/michaeljpizzo/&quot;&gt;www.linkedin.com/in/michaeljpizzo/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow on twitter &lt;a href=&quot;https://twitter.com/michael_pizzo&quot;&gt;@michael_pizzo&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Thu, 23 Feb 2017 00:00:00 +0300</pubDate>
        <link>https://www.odata.org/blog/OData-Published-as-an-ISO-Standard/</link>
        <guid isPermaLink="true">https://www.odata.org/blog/OData-Published-as-an-ISO-Standard/</guid>
        
        
      </item>
    
      <item>
        <title>Webinar on Salesforce Connect External Object Reporting</title>
        <description>&lt;p&gt;&lt;strong&gt;Salesforce External Object Reporting with OData&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reporting against external objects has been highly anticipated based on numerous requests on the &lt;a href=&quot;https://success.salesforce.com/ideaView?id=08730000000lAFWAA2&quot;&gt;Idea on the success community&lt;/a&gt;. Back in Winter ‘16, Mark Kovacevich &lt;a href=&quot;https://developer.salesforce.com/blogs/engineering/2016/02/salesforce-connect-reporting.html&quot;&gt;blogged&lt;/a&gt; on a popular workaround to use external objects for reporting with custom visual force pages and apex controllers. But starting in Winter ’17, there is much rejoicing among report geeks as the Salesforce Connect product team delivers a seamless reporting experience with external data made possible by support for a standard OData REST interface.&lt;/p&gt;

&lt;p&gt;Ralf Schundelmeier Director of Product Management, Salesforce and Sumit Sarkar Chief Data Evangelist, Progress DataDirect will host a webinar with live Q&amp;amp;A and a demo of this new capability for Salesforce developers.&lt;/p&gt;

&lt;p&gt;For a developer preview, below are screenshots of the &lt;a href=&quot;https://releasenotes.docs.salesforce.com/en-us/winter17/release-notes/rn_forcecom_external_data_reports.htm&quot;&gt;high level steps from the Winter ’17 release notes&lt;/a&gt; on getting started with external object reporting. The external data in this example is accessed from an on-premises SQL Server data mart connected on-demand by the &lt;a href=&quot;https://www.progress.com/data-connectivity/odata-salesforce-lightning-connect&quot;&gt;Progress DataDirect OData Reporting service&lt;/a&gt; for Salesforce Connect. Other popular reporting OData feeds are available with on-premises reporting platforms such as SAP Business Objects and SQL Server Reporting Services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preview on Creating Salesforce External Object Reports&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;1. Get started with an External Object Report&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/SalesforceWebinar1.png&quot; alt=&quot;SalesForce Webinar One External Object Report&quot; width=&quot;623&quot; height=&quot;348&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/SalesforceWebinar2.png&quot; alt=&quot;SalesForce Webinar Two External Object Report&quot; width=&quot;623&quot; height=&quot;310&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/SalesforceWebinar3.png&quot; alt=&quot;SalesForce Webinar Three External Object Report&quot; width=&quot;624&quot; height=&quot;350&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2. To expand on this, create a new report type that blends standard objects with external data&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/SalesforceWebinar4.png&quot; alt=&quot;SalesForce Webinar Four External Object Report&quot; width=&quot;623&quot; height=&quot;349&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/SalesforceWebinar5.png&quot; alt=&quot;SalesForce Webinar Five External Object Report&quot; width=&quot;624&quot; height=&quot;351&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/SalesforceWebinar6.png&quot; alt=&quot;SalesForce Webinar Six External Object Report&quot; width=&quot;623&quot; height=&quot;352&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/SalesforceWebinar7.png&quot; alt=&quot;SalesForce Webinar Seven External Object Report&quot; width=&quot;624&quot; height=&quot;351&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Webinar: &lt;a href=&quot;prgress.co/2fWHBDE&quot;&gt;Configuring Salesforce External Object Reports&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Date: December 15, 2016&lt;/p&gt;

&lt;p&gt;Time: 12:00 pm ET&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;During this webinar, you’ll get:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;An introduction to external objects and their new capabilities for reporting and Wave trending&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Steps to setup Salesforce reports with external data sources&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Steps to produce OData from warehouses, marts, lakes and other reporting systems&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Report considerations and limitations with Salesforce Connect&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;[&lt;a href=&quot;prgress.co/2fWHBDE&quot;&gt;Register for the Webinar&lt;/a&gt;]&lt;/p&gt;

&lt;h2 id=&quot;resources&quot;&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://releasenotes.docs.salesforce.com/en-us/winter17/release-notes/rn_forcecom_external_data_reports.htm&quot;&gt;Winter ’17 Release Notes&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://trailhead.salesforce.com/en/module/lightning_connect&quot;&gt;Trailhead for Salesforce Connect&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.progress.com/products/data-sources/salesforce-lightning-connect-odata&quot;&gt;DataDirect Hybrid OData Services&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://developer.salesforce.com/page/Building_a_Data_Integration_Proof_of_Concept_Using_Lightning_Components&quot;&gt;Salesforce Developers guide to hybrid connectivity&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;about-the-author&quot;&gt;About the Author&lt;/h2&gt;

&lt;p&gt;Sumit Sarkar is the Chief Data Evangelist at Progress Software new to developing on the Salesforce platform.  He has presented five Dreamforce sessions on data connectivity including the most recent session from DF16 on &lt;a href=&quot;https://www.youtube.com/watch?v=Hqg0FUInSnM&quot;&gt;External Objects for External Big Data Platforms&lt;/a&gt;. Contact Sumit Sarkar:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/meetsumit&quot;&gt;www.linkedin.com/in/meetsumit&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 12 Dec 2016 00:00:00 +0300</pubDate>
        <link>https://www.odata.org/blog/Webinar-on-Salesforce-Connect-External-Object-Reporting/</link>
        <guid isPermaLink="true">https://www.odata.org/blog/Webinar-on-Salesforce-Connect-External-Object-Reporting/</guid>
        
        
      </item>
    
      <item>
        <title>OData Hackathon at API World</title>
        <description>&lt;p&gt;Progress DataDirect held the first known OData Hackathon this week at APIWorld 2016.&lt;/p&gt;

&lt;p&gt;Participants built applications to integrate with voice assistant services like Microsoft Cortana 
and Amazon Alexa that used OData to pull and update data from Salesforce, Microsoft Dynamics CRM and Sugar CRM.&lt;/p&gt;

&lt;p&gt;The winners, Echo Jokes, used facial recognition from the Microsoft Cognitive Services API to evaluate 
jokes retrieved from Salesforce and Sugar CRMs using OData.&lt;/p&gt;

&lt;p&gt;Other contestants built applications for homebuyers to find listings based on personality, and for executives 
to leverage Alexa as a real-time secretary to assist with customer leads.&lt;/p&gt;

&lt;p&gt;Check it out at https://www.progress.com/blogs/first-odata-hackathon-challenge-winner-at-apiworld!&lt;/p&gt;

&lt;p&gt;Doing something exciting with OData? Don’t be shy – Let us know!&lt;/p&gt;
</description>
        <pubDate>Mon, 12 Sep 2016 12:59:43 +0300</pubDate>
        <link>https://www.odata.org/blog/OData-Hackathon-at-API-World/</link>
        <guid isPermaLink="true">https://www.odata.org/blog/OData-Hackathon-at-API-World/</guid>
        
        
      </item>
    
      <item>
        <title>Recap on OData session for SAP Business Objects Universe</title>
        <description>&lt;p&gt;The OData road show continues with a stop at SAP Analytics conference, IBIS 2016 in Carlsbad, CA. The previous stop was the &lt;a href=&quot;https://www.progress.com/blogs/shifting-the-analytics-industry-at-datadirect-partner-summit&quot;&gt;Progress DataDirect Partner Summit in Redwood City, CA&lt;/a&gt; where Michael Pizzo from the OData Technical Committee co-presented with me to talk about OData specification updates and adoption across V2 and V4.x.&lt;/p&gt;

&lt;p&gt;For this event, we talked about the future of SAP Business Objects Universes in the context of data connectivity. Starting BO 4.1 SP2, SAP introduced OData support where the Universe semantic layer (UNX) serves as both a producer and consumer.&lt;/p&gt;

&lt;p&gt;What this means for analytics professionals is that they can connect their favorite tools across SAP Lumira, Tableau, Spotfire or Microsoft PowerBI to access the Universe in a couple of clicks without having to install any client software. There is a requirement on the server side with BI Platform services for WebApplicationContainerServer and WebIntelligence ProcessingServer. And with support for Generic OData 2.0 Sources for the Universe, there is new potential to access any OData 2.0 endpoint on the backend such as those from the &lt;a href=&quot;https://www.progress.com/odata&quot;&gt;DataDirect Cloud OData Service&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is an exciting development for the OData ecosystem and we can expect similar developments in semantic layers from other enterprise platforms across Oracle OBIEE RPD and IBM Cognos FM.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/sap-analytics-odata1.png&quot; alt=&quot;SAP Analytics OData session&quot; /&gt;&lt;/p&gt;

&lt;p&gt;#We had a packed room and great Q&amp;amp;A:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;What limitations are there for OData REST API as a data source?&lt;/li&gt;
  &lt;li&gt;Does it support connect live from Tableau?&lt;/li&gt;
  &lt;li&gt;When is OData 4.0 supported?&lt;/li&gt;
  &lt;li&gt;How would a PowerBI user connecting to the API be seen from a license perspective?&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How much data could be extracted for data visualization before violating the license based on this info? “This API is solely for the purposes of accessing semantic data, so you can’t use the API for mass data/metadata extraction, for bypassing SAP licensing, or for reverse-engineering a Universe.”&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.slideshare.net/SumitSarkar10/odata-and-the-future-of-business-objects-universes&quot;&gt;Download session from Slideshare&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;bit.ly/odataunx&quot;&gt;Learn more from the SAP Semantic Layer Product Team&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;#Let’s Connect:&lt;/p&gt;

&lt;p&gt;Sumit Sarkar, Chief Data Evangelist&lt;/p&gt;

&lt;p&gt;Progress Software&lt;/p&gt;

&lt;p&gt;@SAsInSumit&lt;/p&gt;
</description>
        <pubDate>Thu, 07 Jul 2016 12:59:43 +0300</pubDate>
        <link>https://www.odata.org/blog/Recap-on-OData-session-for-SAP-Business-Objects-Universe/</link>
        <guid isPermaLink="true">https://www.odata.org/blog/Recap-on-OData-session-for-SAP-Business-Objects-Universe/</guid>
        
        
      </item>
    
      <item>
        <title>OData JavaScript library - o.js explained</title>
        <description>&lt;p&gt;o.js is a small (minified 14.4 KB) client-side library for requesting data from an OData service. It is designed to run in a browser environment, however it also runs in node.js. In a browser environment it has no dependencies on other libraries and can be used standalone. The main goal of the library is, to provide a simple solution to query OData services from any browser. If you like to use it you can install it via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npm install odata&lt;/code&gt; or just download the o.min.js file from this &lt;a href=&quot;https://github.com/janhommes/o.js&quot;&gt;GitHub repository&lt;/a&gt; and add it to your webpage in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;script&amp;gt;&lt;/code&gt;-tag.&lt;/p&gt;

&lt;p&gt;In this tutorial I will show you how easy you can use it in your web application and explain to you &lt;a href=&quot;https://www.janhommes.de/o.js/example/&quot;&gt;the example app&lt;/a&gt;. This application using some extended &lt;em&gt;routing&lt;/em&gt; functionalities of o.js in combination with &lt;em&gt;knockout.js&lt;/em&gt; to display detailed information about the OData TripPinService, a example service provided by odata.org.&lt;/p&gt;

&lt;h1 id=&quot;getting-started-with-ojs&quot;&gt;Getting started with o.js&lt;/h1&gt;
&lt;p&gt;The installation of o.js is simple. You just need to include the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;o.js&lt;/code&gt; file into your page and you are ready to query OData services:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;path/to/o.min.js&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;o.js adds a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;o()&lt;/code&gt; function to the global namespace. This function can be used to define a query. It returns a oHandler, which then allows to retrive, change or push data to the service:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;oHandler&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;https://services.odata.org/V4/(S(wptr35qf3bz4kb5oatn432ul))/TripPinServiceRW/People&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;oHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// data of the TripPinService/People endpoint&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The example above shows how to get the data from the defined handler with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get()&lt;/code&gt; function. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get()&lt;/code&gt;-function accepts an success- and error-callback to get the return of the request. If you prefer to use promise, you can use &lt;a href=&quot;https://github.com/kriskowal/q&quot;&gt;q.js&lt;/a&gt;. The following example shows how to get data from the endpoint and manipulate the result with promise:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;nf&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;https://services.odata.org/V4/(S(wptr35qf3bz4kb5oatn432ul))/TripPinServiceRW/People(&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Russell Whyte&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;FirstName&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;New Name&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;First name is now New Name&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;If you include q.js you can call the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get()&lt;/code&gt; function without a callback and it returns a promise. The data is then stored in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;o.data&lt;/code&gt; which you can manipulate and save by calling save(). The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;save()&lt;/code&gt; itself is used for POST and PUT request to the database and returns a second promise. This way the function above requested a resource, manipulates it and saves the manipulated data back to the service.&lt;/p&gt;

&lt;p&gt;As you can see the requested service URL is quite long. If you use o.js to query one endpoint often you can configure o.js to use the same endpoint all the time:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;nf&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
	&lt;span class=&quot;na&quot;&gt;endpoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;https://services.odata.org/V4/(S(ms4wufavzmwsg3fjo3eqdgak))/TripPinServiceRW/&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;From now on you can use only the resource name to query an endpoint. The following example uses the configured endpoint and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;save()&lt;/code&gt; function to POST, PUT and DELETE data to the TripPinService:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;    &lt;span class=&quot;nf&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;People&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;UserName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;FirstName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;LastName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Because o.js does not know which key to use, you need to initialize a new handler&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;oHandler&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;People&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&apos;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;UserName&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&apos;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;patch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;FirstName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;new name&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;oHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;A person was added, modified and deleted.&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;In the promise chain above o.js first adds a new user using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post()&lt;/code&gt; and saves it to the service. When this is promised we initializing a new handler to find the person which was added and modify him with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;patch()&lt;/code&gt; function. Afterwards we delete him from the service by using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;delete()&lt;/code&gt; function.&lt;/p&gt;

&lt;h1 id=&quot;chaining-the-query&quot;&gt;Chaining the query&lt;/h1&gt;
&lt;p&gt;We already used the chained function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;find()&lt;/code&gt; to find a specific person. o.js allows multiple functions to detail your query. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;find()&lt;/code&gt; is a special case, because it allows to find a specific resource by the key. But you can also use functions to limit the result. For example you can chain your query with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.skip(2).take(5)&lt;/code&gt; to request only the first 5 rows skipped by the first 2 rows. There are many more chained function and you can find a complete list in the &lt;a href=&quot;https://github.com/janhommes/o.js&quot;&gt;o.js readme&lt;/a&gt;. Mostly you will use the where function to find something:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;nf&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;People&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;FirstName == &quot;foo&quot;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//all persons where the firstname is &quot;foo&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;blockquote&gt;
  &lt;p&gt;Note: o.js automatically maps some basic operations from JavaScript to OData. For complex &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;where&lt;/code&gt; request, you need to use the OData equivalent (e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FirstName eq &quot;foo&quot;&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As mentioned you can chain multiple functions to build a query. The following example shows a pagination function which expands the result with the Trip result:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;loadNextPage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;skip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;People&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;expand&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Trips&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;skip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;skip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;take&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 5 People skipped by the function parameter and extended by &quot;Trips&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h1 id=&quot;complex-pages-with-routing&quot;&gt;Complex pages with routing&lt;/h1&gt;
&lt;p&gt;o.js has a build in hash-routing functionality. This allows you to map a oHandler to a route. It allows an easy way to display data from a OData service on a Single Page Application. &lt;a href=&quot;https://www.janhommes.de/o.js/example/#People&quot;&gt;The o.js example&lt;/a&gt; uses the TripPinService, knockout.js and only 70 lines of code to display some useful information from the page.&lt;/p&gt;

&lt;p&gt;For the example we will use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;route()&lt;/code&gt; function of o.js and bind the data to the DOM with knockout.js. I will not go in detail of knockout.js. If you want to learn more about knockout, you should try the excellent tutorials on knockoutjs.com.&lt;/p&gt;

&lt;p&gt;If you try the example you will see a top navigation point &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;People&lt;/code&gt;. This is basically a typical html hash-link &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;a href=&quot;#People&quot;&amp;gt;People&amp;lt;/a&amp;gt;&lt;/code&gt; which does not change anything. But if we register a o.js route on this hash value, o.js automatically triggers the request to the configured endpoint. Therefore we first configure the endpoint:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;    &lt;span class=&quot;c1&quot;&gt;// initialize the ko observables&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;People&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ko&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;observableArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([]);&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ko&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;observable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;detailPeople&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ko&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;observable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isLoading&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ko&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;observable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

	&lt;span class=&quot;c1&quot;&gt;// configure the endpoint and define what to do while loading&lt;/span&gt;
	&lt;span class=&quot;nf&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
		&lt;span class=&quot;na&quot;&gt;endpoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;https://services.odata.org/V4/%28S%28wptr35qf3bz4kb5oatn432ul%29%29/TripPinServiceRW/&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;na&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;isLoading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
		&lt;span class=&quot;na&quot;&gt;ready&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;isLoading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The start and ready function defines what should be done when the request starts and what to do if the request ends. Here we just set a ko observable to true while the request is processed. We will later bind it to the DOM to display a loading spinner.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Note: The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;self&lt;/code&gt; object is a reference to this. This is usually done in knockout ViewModels-Function. For easier understanding the ViewModel-Function is left out here. You can find the full file &lt;a href=&quot;https://github.com/janhommes/o.js/blob/master/example/app.js&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Afterwards you can define a route to map to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#People&lt;/code&gt; hash:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;nf&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;People&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;People&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;People&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;People&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The first parameter of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;route&lt;/code&gt; function is a string that maps to the hash. The second parameter is a callback that is triggered as soon as the first parameter and the hash is equal and the request to the OData service is done. When you now click on the top navigation link the callback gets triggered with the Data from the TripPinService. This callback then sets the knockout observable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;self.route&lt;/code&gt; to ‘People’ and adds the data to the observableArray &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;self.People&lt;/code&gt;. Afterwards you only need to bind the data to your DOM with the knockout &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data-bind&lt;/code&gt; property:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-bind=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;visible:route()===&apos;People&apos;&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- ko foreach: People --&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;h4&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-bind=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text:FirstName&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/h4&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;h2&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-bind=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text:LastName&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/h4&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;role=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;button&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;btn btn-primary&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-bind=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;attr { href:&apos;#People/Detail/&apos;+UserName }&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Details&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- /ko --&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;self.route&lt;/code&gt; parameter is used to handle the visibility of a route. We then bind all the People returned by the OData service with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ko foreach&lt;/code&gt; statement. In this statement we display the FirstName and LastName property to headings. Also we bind a href hash-link to the route &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#People/Detail/ + UserName&lt;/code&gt;. To handle this route we register a second o.js route-handler:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;nf&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;People&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;UserName == &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;:0&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&apos;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;expand&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Trips&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;People/Detail/:0&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Detail&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;detailPeople&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The added route is a dynamic route. With &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:0&lt;/code&gt; the dynamic part of the route is defined. This dynamic part is added to the OData request as soon as the route matches. So for example, if you navigate to the hash &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#People/Detail/russellwhyte&lt;/code&gt; the service request the resource &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/People/?$format=json&amp;amp;$filter=UserName%20%20eq%20%20%27russellwhyte%27&amp;amp;$expand=Trips&amp;amp;$top=1&lt;/code&gt;. You can add multiple dynamic parts by defining them with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:0&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:1&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:2&lt;/code&gt; etc.&lt;/p&gt;

&lt;p&gt;As you can see this routing also expands the Trips resource and saves all to the knockout observable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;detailPeople&lt;/code&gt;. Therefore we can display the Trips of the person in the details by using the following DOM binding:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-bind=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;visible:route()===&apos;Detail&apos;,with:detailPeople&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jumbotron&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;h1&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-bind=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text:FirstName + &apos; &apos; + LastName &quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

	&lt;span class=&quot;nt&quot;&gt;&amp;lt;table&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;table table-hover&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
		  &lt;span class=&quot;nt&quot;&gt;&amp;lt;tbody&amp;gt;&lt;/span&gt;
			&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- ko foreach: Trips --&amp;gt;&lt;/span&gt;
        		&lt;span class=&quot;nt&quot;&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
        			&lt;span class=&quot;nt&quot;&gt;&amp;lt;td&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-bind=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text:Name&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        			&lt;span class=&quot;nt&quot;&gt;&amp;lt;td&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-bind=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text:Description&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        		&lt;span class=&quot;nt&quot;&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
			&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- /ko --&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;/tbody&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;That’s all to display people from the TripPin-Example service and their Trips. With the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;put&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;delete&lt;/code&gt; functions, explained in the beginning of this post, you can now add, modify or delete this data. In the full example you can find an example to delete Trips of a user.&lt;/p&gt;

&lt;p&gt;One last thing is the loading animation. That is quite easy to do, because we already defined the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;self.isLoading&lt;/code&gt; observable. By simply binding this to the DOM we can show a loading spinner to the user:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;loading&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-bind=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;visible:isLoading()&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jumbotron&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;img/ajax-loader.gif&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alt=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Loading ...&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Loading ...&lt;span class=&quot;nt&quot;&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;o.js is a simple way to query OData services fast. It allows to add CRUD operations on any OData-Service easily into your page. So everything perfect? Sadly not. o.js is not a complete OData-Solution. It only supports the basic OData functions and is not suitable for complex scenarios. For example the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;batch&lt;/code&gt; operation is only supported rudimentary and ETag are not supported. However, if you need a quick request or want to display some OData service on a simple webpage, o.js is the right choice.&lt;/p&gt;

&lt;p&gt;Links:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/janhommes/o.js&quot;&gt;o.js on Github&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/janhommes/o.js/tree/master/example&quot;&gt;The example souce code&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.janhommes.de/o.js/example/&quot;&gt;The example to try it out&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://services.odata.org/V4/%28S%28temce5hlnkmezxe0zghrzv4p%29%29/TripPinServiceRW/&quot;&gt;The example TripPinService&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.knockoutjs.com&quot;&gt;Knockout.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Tue, 23 Feb 2016 01:14:00 +0300</pubDate>
        <link>https://www.odata.org/blog/OData-JavaScript-library-o.js-explained/</link>
        <guid isPermaLink="true">https://www.odata.org/blog/OData-JavaScript-library-o.js-explained/</guid>
        
        
      </item>
    
      <item>
        <title>Webinar: External data integration strategies</title>
        <description>&lt;p&gt;&lt;small&gt;The following is a post by Mark Stafford of Microsoft’s OData team.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Join us on January 19th at 1:00pm Eastern Time for a webinar discussing external data integration strategies. This webinar is free of charge and hosted by Progress Software, Oracle, and Microsoft. To register for the webinar, please follow this link: &lt;a href=&quot;https://forms.progress.com/wbr-odata-integration-for-saas&quot;&gt;https://forms.progress.com/wbr-odata-integration-for-saas&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;self-service-integration-and-the-explosion-of-data-sources-are-driving-odata-adoption-from-leading-saas-vendors&quot;&gt;Self-service integration and the explosion of data sources are driving OData adoption from leading SaaS vendors.&lt;/h2&gt;

&lt;p&gt;Why have Salesforce and Oracle adopted OData for external data integration strategies with SaaS applications? Because OData hybrid connectivity gives direct access to a wide range of external data sources that can be integrated directly “out-of-box” with the ease of point-and-click. And citizen developers increasingly demand easy, point-and-click integration patterns that link their SaaS applications directly to external data. With tight deadlines to deliver data-driven features to SaaS users, find out why OData connectivity is gaining ground on traditional data integration patterns.&lt;/p&gt;

&lt;p&gt;Join us for a live demo to see how OData hybrid data connectivity enables self service integration with Oracle Service Cloud Accelerators and Salesforce Connect, both powered by OData.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Webinar Title:&lt;/strong&gt; OData External Data Integration Strategies For SaaS&lt;br /&gt;
&lt;strong&gt;Date:&lt;/strong&gt; January 19, 2016&lt;br /&gt;
&lt;strong&gt;Time:&lt;/strong&gt; 1:00 p.m. ET&lt;br /&gt;
&lt;strong&gt;Presenters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Roderick Peace, Director Product Management, Oracle Service Cloud&lt;/li&gt;
  &lt;li&gt;Mike Pizzo, Principal Software Architect, Microsoft&lt;/li&gt;
  &lt;li&gt;Sumit Sarkar, Chief Data Evangelist, Progress DataDirect&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During this webinar, you’ll:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Gain a clear understanding from Microsoft of the OData ecosystem across consumers and producers&lt;/li&gt;
  &lt;li&gt;Learn why the OData standard was selected as an external data integration pattern for Oracle Service Cloud&lt;/li&gt;
  &lt;li&gt;See firsthand how OData hybrid data connectivity enables point-and-click integration to external data of all shapes and sizes, deployed on-premise or cloud&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 13 Jan 2016 11:17:23 +0300</pubDate>
        <link>https://www.odata.org/blog/external-data-integration-strategies-webinar/</link>
        <guid isPermaLink="true">https://www.odata.org/blog/external-data-integration-strategies-webinar/</guid>
        
        
      </item>
    
      <item>
        <title>Enabling Innovation: Making NSW Biodiversity Data Open</title>
        <description>&lt;p&gt;&lt;small&gt;The following is a guest post by James Bibby of NSW Office of Environment &amp;amp; Heritage. The views expressed and statements made are those of Biodiversity Information Systems and not of OData.org or its administrators.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;The NSW Office of Environment and Heritage has recently opened up its massive store of biodiversity data to IT developers using an OData based web service.  This first release of BioNet Web Services makes over 7 million species sightings records available for direct access by software applications enabling open innovation on this valuable public resource.&lt;/p&gt;

&lt;p&gt;##Why was OData selected?##&lt;/p&gt;

&lt;p&gt;OEH’s Science Division had a clear aim of improving both environmental decision making and engagement with the natural environment through open data.  To achieve this aim the project team realised that making the data openly accessible was only one of the barriers to active usage of the data.  Their evaluation of existing APIs for biodiversity data indicated that up front and long term development costs, both to learn and develop against proprietary APIs, introduced additional barriers to use.&lt;/p&gt;

&lt;p&gt;By adopting the OASIS OData standard for the BioNet web service, the project team saw that these barriers could be significantly reduced.   IT developers wishing to consume data via the OData API would be able to easily access a range of pre-existing libraries across a range of platforms, and in addition tap into existing online developer communities to support their development.&lt;/p&gt;

&lt;p&gt;Realisation of these benefits was borne out by &lt;a href=&quot;https://www.gaiaguide.info&quot;&gt;Gaia Guide&lt;/a&gt;, one of the early adopters of the service who use the Apache Olingo Library.  “The API is really nice and transparent”, commented Geoff Shuetrim, Director at GaiaGuide.  “It took us 2 hours of development effort to connect to the BioNet web service compared with nearly a week for any other web service we have connected to.”&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/biodiversitypowermap.png&quot; alt=&quot;Excel Biodiversity Powermap&quot; /&gt;
&lt;em&gt;An extract of all sightings for Clarence Valley Local Government Area retrieved using Power Query for Excel and displayed via Power Map for Excel&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;##What next?##&lt;/p&gt;

&lt;p&gt;The project team continues to work on making more biodiversity data held in BioNet openly available.  Release 2 is targeted this coming year, and will add data held on vegetation communities.&lt;/p&gt;

&lt;p&gt;##Where can I find out more?##&lt;/p&gt;

&lt;p&gt;More information, including developer guides, can be found at &lt;a href=&quot;https://data.bionet.nsw.gov.au&quot;&gt;data.bionet.nsw.gov.au&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;James Bibby&lt;/p&gt;

&lt;p&gt;Senior Scientist, Biodiversity Information Systems&lt;/p&gt;
</description>
        <pubDate>Mon, 30 Nov 2015 12:59:43 +0300</pubDate>
        <link>https://www.odata.org/blog/Enabling-innovation-making-NSW-biodiversity-data-open/</link>
        <guid isPermaLink="true">https://www.odata.org/blog/Enabling-innovation-making-NSW-biodiversity-data-open/</guid>
        
        
      </item>
    
  </channel>
</rss>
