In this tutorial we will run through the process of service enabling an RDBMS as a data service. Also, see the samples in Data Integration Samples.
Prerequisites
Follow the steps given below to set up a MySQL database for this tutorial.
- Install the MySQL server.
Download the JDBC driver for MySQL from here and copy it to your
<EI_HOME>/lib
directory.If the driver class does not exist in the relevant folders when you create the datasource, you will get an exception such as 'Cannot load JDBC driver class com.mysql.jdbc.Driver'.- Create the following database:
Employees
Create the Employee table inside the Employees database:
CREATE TABLE Employees (EmployeeNumber int(11) NOT NULL, FirstName varchar(255) NOT NULL, LastName varchar(255) DEFAULT NULL, Email varchar(255) DEFAULT NULL, Salary varchar(255));
Creating the data service
Follow the steps given below.
- Log in to the product's management console.
- Click Data Service → Create, to start creating a data service.
Enter the following name for the data service.
Data Service Name RDBMSDataService - Click Next to enter the datasource connection details.
Connecting to the datasource
Follow the steps given below.
Click Add New Datasource and enter the following details:
Datasource ID Datasource Datasource Type RDBMS Datasource Type (Default/External) Leave Default selected. Database Engine MySQL Driver Class com.mysql.jdbc.Driver URL jdbc:mysql://localhost:3306/Employees User Name root If you enter External instead of the Default datasource type, your datasource should be supported by an external provider class, such as
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource.
You can select the External option and enter the name and value of connection properties by clicking Add Property. For example,
After an external datasource is created, it can be used as a usual datasource in queries. See the tutorial on handling distributed transactions for more information on using external datasources.- Save the datasource.
- Click Next, to start creating queries.
Creating a query to GET data
Let's create a query that can retrieve employee data, based on the employee number. That is, when the employee number is provided as an input, the data service should get the relevant employee details and present the result.
Click Add New Query to start creating a new query.
Enter the following details:
Query Name GetEmployeeDetails Datasource Datasource SQL select EmployeeNumber, FirstName, LastName, Email from Employees where EmployeeNumber=:EmployeeNumber
Click Generate Input Mapping to create the input mapping. The employee number is the input as shown below.
Click Generate Response to create the output mapping. This defines how the employee details retrieved from the datasource will be presented in the result. Note that, by default, the output type is XML.
If required, you can choose RDF, or JSON as the output type. See Using JSON with Data Services for more information on exposing data in JSON format.
Save the query.
Creating a query to Post data
Let's create another query to post new employee data to the datasource.
Click Add New Query to start creating a new query.
Enter the following details:
Query Name AddEmployeeDetails Datasource Datasource SQL insert into Employees (EmployeeNumber, FirstName, LastName, Email, Salary) values(:EmployeeNumber,:FirstName,:LastName,:Email,:Salary)
Click Generate Input Mapping to create the input mapping. You need to specify values for the following elements when posting new employee data.
Save the query.
Creating a query to Update data
Now, let's create a query that can update an existing employee record in the datasource.
Click Add New Query to start creating a new query.
Enter the following details:
Query Name UpdateEmployeeDetails Datasource Datasource SQL update Employees set LastName=:LastName, FirstName=:FirstName, Email=:Email, Salary=:Salary where EmployeeNumber=:EmployeeNumber
Click Generate Input Mapping to create the input mapping. You need to specify values for the following elements when posting new employee data.
Save the query.
Create SOAP operations to invoke queries
Now, let's create SOAP operations to invoke the queries created above. Alternatively, you can create REST resources to invoke the queries. See the next section for instructions.
Click Add New Operation and enter the details as shown below.
Operation Name GetEmployeeOp Query ID GetEmployeeDetails - Save the operation.
Click Add New Operation and enter the details as shown below.
Operation Name AddEmployeeOp Query ID AddEmployeeDetails - Save the operation.
Click Add New Operation and enter the details as shown below.
Operation Name UpdateEmployeeOp Query ID UpdateEmployeeDetails - Save the operation.
You can now invoke the data service query using SOAP.
Create REST resources to invoke queries
Now, let's create REST resources to invoke the queries created above. Alternatively, you can create SOAP operations to invoke the queries. See the previous section, for instructions.
Click Add New Resource and enter the details as shown below.
Resource Path Employee/{EmployeeNumber} Resource Method Get Query ID GetEmployeeDetails - Save the resource.
Click Add New Resource and enter the details as shown below.
Resource Path Employee Resource Method POST Query ID AddEmployeeDetails - Save the resource.
Click Add New Resource and enter the details as shown below.
Resource Path Employee Resource Method PUT Query ID UpdateEmployeeDetails - Save the resource.
- Click Finish to complete creating the data service.
You can now invoke the data service query using REST.
Finish creating the data service
Once you have defined the operation, click Finish to complete the data service creation process. You will now be taken to the Deployed Services screen, which shows all the data services deployed on the server.
Invoking your data service using SOAP
You can try the data service you created by using the TryIt tool that is in your product by default.
- Go to the Deployed Services screen.
- Click the Try this service link for the RDBMS data service. The TryIt Tool will open with the data service.
Post new data
- Select the AddEmployeeOp operation you created earlier.
You need to provide the employee details.
<p:AddEmployeeOp xmlns:p="http://ws.wso2.org/dataservice"> <!--Exactly 1 occurrence--> <xs:EmployeeNumber xmlns:xs="http://ws.wso2.org/dataservice">1</xs:EmployeeNumber> <!--Exactly 1 occurrence--> <xs:FirstName xmlns:xs="http://ws.wso2.org/dataservice">John</xs:FirstName> <!--Exactly 1 occurrence--> <xs:LastName xmlns:xs="http://ws.wso2.org/dataservice">Doe</xs:LastName> <!--Exactly 1 occurrence--> <xs:Email xmlns:xs="http://ws.wso2.org/dataservice">JohnDoe@gmail.com</xs:Email> <!--Exactly 1 occurrence--> <xs:Salary xmlns:xs="http://ws.wso2.org/dataservice">10000</xs:Salary> </p:AddEmployeeOp>
Click Send.
Get data
- Select the GetEmployeeOp operation you created earlier. You need to provide the employee number as an input. Enter '1'.
Click Send to see the details of the employee you added previously:
<Entries xmlns="http://ws.wso2.org/dataservice"> <Entry> <EmployeeNumber>1</EmployeeNumber> <FirstName>John</FirstName> <LastName>Doe</LastName> <Email>JohnDoe@gmail.com</Email> </Entry> </Entries>
Update data
- Select the UpdateEmployeeOp operation you created earlier.
You need to provide the employee details. Note that the salary value is changed to 20000.
<p:UpdateEmployeeOp xmlns:p="http://ws.wso2.org/dataservice"> <!--Exactly 1 occurrence--> <xs:LastName xmlns:xs="http://ws.wso2.org/dataservice">Doe</xs:LastName> <!--Exactly 1 occurrence--> <xs:FirstName xmlns:xs="http://ws.wso2.org/dataservice">John</xs:FirstName> <!--Exactly 1 occurrence--> <xs:Email xmlns:xs="http://ws.wso2.org/dataservice">JohnDoe@gmail.com</xs:Email> <!--Exactly 1 occurrence--> <xs:Salary xmlns:xs="http://ws.wso2.org/dataservice">20000</xs:Salary> <!--Exactly 1 occurrence--> <xs:EmployeeNumber xmlns:xs="http://ws.wso2.org/dataservice">1</xs:EmployeeNumber> </p:UpdateEmployeeOp>
Click Send.
Invoking your data service using REST
The HTTP requests sent for each of the resources using cURL would be as follows:
Post new data
Create a file called employee-payload.xml file, and define the XML payload for posting new data as shown below.
<_postemployee> <EmployeeNumber>3</EmployeeNumber> <FirstName>Will</FirstName> <LastName>Smith</LastName> <Email>will@google.com</Email> <Salary>15500.0</Salary> </_postemployee>
Send the following HTTP request from the location where the employee-payload.xml file is stored:
curl -X POST -H 'Accept: application/xml' -H 'Content-Type: application/xml' --data "@employee-payload.xml" http://localhost:8280/services/RDBMSDataService/employee
Get data
The service can be invoked in REST-style via curl (http://curl.haxx.se). Shown below is the curl command to invoke the GET resource:
curl -X GET http://localhost:8280/services/RDBMSDataService.HTTPEndpoint/Employee/3
Update data
Create a file called employee-update-payload.xml file, and define the XML payload for updating an existing employee record as shown below.
<_putemployee> <EmployeeNumber>3</EmployeeNumber> <LastName>Smith</LastName> <FirstName>Will</FirstName> <Email>will@google.com</Email> <Salary>30000.0</Salary> </_putemployee>
Send the following HTTP request from the location where the employee-update-payload.xml file is stored:
curl -X PUT -H 'Accept: application/xml' -H 'Content-Type: application/xml' --data "@employee-update-payload.xml" http://localhost:8280/services/RDBMSDataService/employee