Contact Free trial Login

Creating an OData-Enabled API

The APIkit OData Extension supports OData (Open Data Protocol) Version 2 for creating HTTP-based data services. Through these services, you can query the data sources using HTTP.
The APIkit OData Extension builds the services from the entity data model (EDM), which OData services use to formalize their resource descriptions. You write the EDM in RAML using EDM-compatible data types to represent API entities.
The APIkit OData Extension generates Mule flows to handle OData requests. After configuring a data source and adding endpoints to the flows, deploying the app exposes a RESTful API and an OData API accessible through different URLs. The OData MySQL example on this page shows how to use an HTTP-based data service to query a MySQL database.

You can use the APIkit OData Extension to expose a legacy API as an OData API, orchestrate data before exposing it in Salesforce, or create a bidirectional OData API for Oracle, DB2, or Azure DB, for example.

Prerequisites

The following software is required for creating and using an OData-enabled API with APIkit:

  • OData Plugin

  • Mule EE 4.1.1 and later

  • Anypoint Studio 7.1.4 and later

  • Maven

Installing the APIKit OData Extension

You install the APIKit OData Extension from Anypoint Studio as described in the following procedure:

  1. From the Help menu in Studio, select Install New Software.

  2. Click Add…​

  3. In the Name field, type APIkit for ODATA Update Site.

  4. In the Location field, type http://studio.mulesoft.org/s3/apikit-for-odata/.

  5. Click OK.

    Studio displays a list of items to select.

  6. Check the check box to update Anypoint OData Plugin.

  7. Click Next.

    An Install Remediation Page might show.

  8. Click Next, and click Next again to install the remedial software.

  9. Accept the terms and conditions of the product, then click Finish.

    An Installing Update (%) message appears at the bottom right corner of Studio.

  10. Restart Studio to complete the installation.

Using the APIkit OData Extension

After installing the prerequisite software, perform the following high-level steps to use the APIkit OData Extension:

  1. Define an entity data model named odata.raml, formatting the file as a RAML library.

    You can download an example entity data model to see exactly how to create the file.
  2. Create a new Mule project in Anypoint Studio. Click File, then select New > Mule Project.

    Select the Specify API definition file location or URL on the New Mule Project dialog.

  3. Click Finish

  4. Copy the odata.raml to /src/main/resources/api in Studio project explorer.

  5. In the project explorer, right-click odata.raml and select Mule > Generate OData API from RAML Types.

    The OData Extension generates the api.raml in /src/main/resources/api and ODataLibrary.raml in /src/main/resources/api/libraries. Generated flows are displayed on the canvas when you select api.xml.

    creating an odata api
  6. Add logic and endpoints for querying a data source.

  7. Deploy the OData API.

Deploying an OData API

You can deploy the example app in different ways, including the following ones:

  • Locally

    Right-click your project, then select Run As > Mule Application.

  • To CloudHub

    Right-click your project, then select Anypoint Platform > Deploy to Cloud.

Once deployed, you can also register the OData app in external OData consumer services like Salesforce.

OData MySQL Example

The OData MySQL example is a fully functional OData API packaged as a Maven project. In this example, the data source, the app, and the service are local.

First, you install a MySQL database and load tables using a provided script. Next, you import the compressed project into Studio, which includes a MySQL database driver. You can examine the flows to see how to implement the endpoints you need by accessing the data. Then you run the project and call the REST and OData services.

  1. Install a MySQL database. Launch MySQL.

    The Maven project you download in step 3 contains the mysql-connector-java-5.1.37.jar MySQL database driver, so you do not need to make a driver available to the project.
  2. Download the example.sql script. Run the script using MySQL commands to load data into a database named apikit-odata-example.

  3. Download and unpack the compressed Maven project, apikit-odata-example-master.zip.

    You can find the pom.xml and other project files in the apikit-odata-example-master directory.
  4. In Studio, Select File > Import.

    The Select dialog shows.

  5. Select Anypoint Studio > Anypoint Studio Project from file system. Click Next.

    The Import Mule Project dialog shows.

  6. Browse to and select the POM file from the apikit-odata-example-master directory. Click Finish.

    The test-drive project shows in the project explorer. APIkit OData Extension generates flows that are displayed in the canvas when you click api.xml in src/main/app in the project explorer.
  7. In Studio, edit the mule-app.properties file inside the src/main/app folder, and set the following properties to access the local MySQL database:

    ds.db.port=3306
    ds.db.user=<your MySQL user name>
    ds.db.host=<your MySQL host name>
    ds.db.database=apikit-odata-example
    ds.db.password=<your MySQL password>
  8. Run the API locally: Right-click the project, and select Run As > Mule Application with Maven.

You can now access the REST and OData Service.

Accessing the REST and OData Service

To run the API locally:

  1. Right-click the project, and select Run As > Mule Application with Maven.

  2. Access the REST and OData Service using the following URLs:

    • REST API: /api

    • OData API: /api/odata.svc

      The following examples cover a few of the many REST calls and OData queries you can use.

Retrieve a List of Customers

Call the REST API to retrieve the list of customers:

http://localhost:8081/api/customers

The response is:

{
  "entries": [
    {
      "ContactName": "Maria Anders",
      "ContactTitle": "Sales Representative",
      "CompanyName": "Alfreds Futterkiste",
      "CustomerID": ""
    },
    {
      "ContactName": "Maria Anders",
      "ContactTitle": "Sales Representative",
      "CompanyName": "Alfreds Futterkiste",
      "CustomerID": "ALFKI"
    },
  ]
}

Access a Description of the OData Service

Get information about the collections behind this service:

http://localhost:8081/api/odata.svc

The response is:

<service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xml:base="http://localhost:8081">
  <workspace>
    <atom:title>Default</atom:title>
    <collection href="customers">
      <atom:title>customers</atom:title>
    </collection>
    <collection href="orders">
      <atom:title>orders</atom:title>
    </collection>
  </workspace>
</service>

Get OData Service Metadata

The Service Metadata exposes the structure of OData service resources, its operations, and EDM for a given service.

Get the metadata for HTTP Services:

http://localhost:8081/api/odata.svc/$metadata

The response aligns with the odata.raml EDM you used to build the HTTP Services API example:

<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="1.0">
<edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="2.0">
<Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="odata2.namespace">
<EntityType Name="customers">
<Key>
<PropertyRef Name="CustomerID"/>
</Key>
<Property Name="CompanyName" Type="Edm.String" Nullable="true" MaxLength="40" Unicode="false"/>
<Property Name="ContactName" Type="Edm.String" Nullable="true" MaxLength="30" Unicode="false"/>
<Property Name="ContactTitle" Type="Edm.String" Nullable="true" MaxLength="30" Unicode="false"/>
<Property Name="CustomerID" Type="Edm.String" Nullable="false" MaxLength="5" Unicode="false"/>
</EntityType>
<EntityType Name="orders">
<Key>
<PropertyRef Name="OrderID"/>
<PropertyRef Name="ShipName"/>
</Key>
<Property Name="Freight" Type="Edm.Decimal" Nullable="true" Precision="3" Scale="3" Unicode="false"/>
...

Query the Data Source

Issue OData queries to get the list of customers in XML and JSON format:

http://localhost:8081/api/odata.svc/customers
http://localhost:8081/api/odata.svc/customers?$format=json

Issue an OData query to get the tenth customer in the customer list:

http://localhost:8081/api/odata.svc/customers?$format=json&$top=1&$skip=10&$inlinecount=allpages

The response is:

{
    "d": {
        "results": [
            {
                "__metadata": {
                    "uri": "http:/localhost:8081/api/odata.svc/customers('BOTTM')",
                    "type": "odata2.namespace.customers"
                },
                "CompanyName": "Bottom-Dollar Markets",
                "ContactName": "Elizabeth Lincoln",
                "ContactTitle": "Accounting Manager",
                "CustomerID": "BOTTM"
            }
        ],
        "__count": "98"
    }
}