So far we have worked with local JSON data, but now we will access a real OData service to visualize remote data.
In the real world, data often resides on remote servers and is accessed via an OData service. We will add a data source configuration to the manifest and replace the JSONModel type for our invoice
model with the publicly available Northwind OData service to visualize remote data. You will be surprised how little needs to be changed in order to make this work!
>Products from the OData invoices test service are now shown within our app
A real-time preview utilizing data from the OData remote service is currently unavailable in this setup. However, we assure you that it will work on your local machine as long as you avoid making any mistakes. So, give it a try and see the results for yourself!
To download the solution for this step as a zip file, just choose the link here: 📥 Download Solution for Step 25.
In this step, we want to use the publicly available Northwind OData service located at https://services.odata.org/V2/Northwind/Northwind.svc/
. Therefore, our URI points to the official Northwind OData service. In order to avoid cross-origin resource sharing, the typical procedure is to use a proxy in UI5 Tooling and maintain only a path in the URI
property of the data source of our app.
A bunch of proxy solutions are available from the UI5 community as UI5 Tooling custom middleware extensions.
In this tutorial we'll use ui5-middleware-simpleproxy.
Open a new terminal window in your app root folder and execute npm i -D ui5-middleware-simpleproxy
to install this package as a new development dependency in your package.json
.
We now configure the ui5-middleware-simpleproxy
in the ui5.yaml
file, so the proxy is used with the UI5 Tooling when serving the app.
We schedule the simpleproxy middleware after the compression
middleware, right after the livereload middleware. The mountPath
property configures which URLs will be caught by the proxy. The configuration/baseUri
property stores the real server address.
specVersion: '3.0'
metadata:
name: "ui5.walkthrough"
type: application
framework:
name: OpenUI5
version: "1.129.0"
libraries:
- name: sap.m
- name: sap.ui.core
- name: themelib_sap_horizon
builder:
customTasks:
- name: ui5-tooling-transpile-task
afterTask: replaceVersion
configuration:
transformAsyncToPromise: true
server:
customMiddleware:
- name: ui5-tooling-transpile-middleware
afterMiddleware: compression
configuration:
transformAsyncToPromise: true
- name: ui5-middleware-simpleproxy
afterMiddleware: compression
mountPath: /V2
configuration:
baseUri: "https://services.odata.org"
As a next step we need to update our manifest.json
file, so the remote OData service can be instantiated by the component.
In the sap.app
section of the descriptor file, we add a data source configuration. With the invoiceRemote
key, we specify a configuration object that allows automatic model instantiation. We specify the type of the service (OData
) and the model version (2.0
).
In the models
section, we replace the content of the invoice
model. This key is still used as model name when the model is automatically instantiated during the component initialization. However, the invoiceRemote
value of the dataSource
key is a reference to the data source section that we specified above. This configuration allows the component to retrieve the technical information for this model during the start-up of the app.
{
...
"sap.app": {
...
"applicationVersion": {
"version": "1.0.0"
},
"dataSources": {
"invoiceRemote": {
"uri": "V2/Northwind/Northwind.svc/",
"type": "OData",
"settings": {
"odataVersion": "2.0"
}
}
}
},
...
"sap.ui5": {
...
"models": {
"i18n": {
...
},
"invoice": {
"dataSource": "invoiceRemote"
}
},
"resources": {
"css": [
{
"uri": "css/style.css"
}
]
}
}
}
Our component now automatically creates an instance of sap.ui.model.odata.v2.ODataModel
according to the settings we specified above, and makes it available as a model named invoice
. When you use the invoiceRemote
data source, the ODataModel
fetches the data from the real Northwind OData service. The invoices we receive from the Northwind OData service have identical properties as the JSON data we used previously (except for the status
property, which is not available in the Northwind OData service).
📝 Note:
If you want to have a default model on the component, you can change the name of the model to an empty string in the descriptor file.Automatically instantiated models can be retrieved by calling
this.getModel
in the component. In the controllers of component-based apps you can callthis.getView().getModel()
to get the automatically instantiated model. For retrieving a named model you have to pass on the model name defined in the descriptor file togetModel
, that is, in the component you would callthis.getModel("invoice")
to get our automatically generatedinvoice
model that we defined in the descriptor.
As our app is now bound to a remote OData service, we do not need the invoices.json
file anymore, so you can delete it.
Next: Step 26: Mock Server Configuration
Previous: Step 24: Sorting and Grouping
Related Information