Skip to main content
Newcomer
December 20, 2021
Solved

REST API USE

  • December 20, 2021
  • 2 replies
  • 0 views

Hello OneStream Community,

I'm working on how to implement a REST API in OS, but i'm not sure to understand all the steps, i've already read the documentation and i've found it very hard to understand, can anyone please explain how can we implement it in OS what are the steps to follow, i started by downloading and installing POSTMAN for the tests but i don't know what should do i do after, please any help will be much appreciated.

I'm also woundering if there any data management that should be used for this

Thanks and merry christmas.

Best answer by pvanerp

Hi indu,

Thanks for your prompt reply. I'm afraid the problem occurs a bit sooner, on the deserialisation step. The error I'm getting is: 

Unable to execute Business Rule 'cnHiBob_v1'. Unexpected JSON token when reading DataTable: StartObject. Path 'employees[0].employee', line 1, position 59.

The JSON I'm accessing has a general structure as (anonymised and shortened):

{
  "employees": [
    {
      "displayName": "John Johnson",
      "employee": {
        "payrollManager": "1234567890",
        "hrbp": "1234567890",
        "itAdmin": "1234567890",
        "buddy": null
      },
      "work": {
        "shortStartDate": "01-01",
        "startDate": "2023-01-01",
        "manager": "1234567890",
        "tenureDuration": {
          "periodISO": "P1Y9M9D",
          "sortFactor": 000,
          "humanize": "1 year, 6 months and 15 days"
        },
        "custom": {
          "field_1698922567656": null,
          "field_1697701034939": "1234567890"
        },
        "durationOfEmployment": {
          "periodISO": "P1Y9M9D",
          "sortFactor": 00,
          "humanize": "1 year, 6 months and 15 days"
        },
        "reportsToIdInCompany": null,
        "employeeIdInCompany": 2,
        "reportsTo": {
          "displayName": "John Doe",
          "email": "johnd@mycompany.com",
          "surname": "Doe",
          "firstName": "John",
          "id": "1234567890"
        },
        "indirectReports": 3,
        "siteId": 0000887,
        "tenureDurationYears": 1.777,
        "department": "1234567890",
        "tenureYears": 1,
        "customColumns": {
          "column_1694007818663": "1234567890",
          "column_1694007758524": null,
          "column_1692966052634": "1234567890",
          "column_1695048623305": null,
          "column_1697624280234": null
        },
        "isManager": true,
        "title": "1234567890",
        "site": "mycompany
        "originalStartDate": "2023-01-01",
        "activeEffectiveDate": "2024-01-01",
        "directReports": 3,
        "secondLevelManager": "1234567890",
        "daysOfPreviousService": 0,
        "yearsOfService": 1
      },
      "companyId": 1234567890,
      "email": "johnj@mycompany.com",
      "surname": "Johnson",
      "id": "1234567890",
      "firstName": "John"
    },
  ]
} 

Thanks for any help or guidance!


Ahhh, thank you CoPilot. I got it to work with this code:

		Private Function GetSourceDataREST(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Transformer) As DataTable
			Try
				Dim strEntityWF As String = api.WorkflowProfile.Name.Split(".")(0)	
				
'				Use already encoded credentials (eg.,In Postman) key
				Dim wdCreds As String = "<CREDENTIALS>"
				'Call the REST API		
				Dim wc As New WebClient
				wc.Encoding = Encoding.UTF8
				wc.Headers("cache-control") = "no-cache"
				wc.Headers("ContentType") = "application/json"
				wc.Headers("Accept") = "application/json"
				wc.Headers("Authorization") = "Basic " & wdCreds
						
				Dim jsonURL As String = "<AURL>"
				Dim json As String = wc.DownloadString(jsonurl)
						
				Dim pullData As DataTable = ParseJsonToDataTable(json, strEntityWF)

				'Close Web connection
				wc.dispose
				'Return the dataset
				Return pullData
			Catch ex As Exception
			Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
			End Try				
				
			End Function		
			
			
 			Function ParseJsonToDataTable(json As String, EntityName As String) As DataTable
		        Dim dataTable As New DataTable()
		        dataTable.Columns.Add("entity", GetType(String))
		        dataTable.Columns.Add("displayName", GetType(String))
		        dataTable.Columns.Add("amount", GetType(Integer))

		        Dim jObject As JObject = JObject.Parse(json)
		        Dim dataArray As JArray = jObject("employees")

		        For Each item As JObject In dataArray
		            Dim row As DataRow = dataTable.NewRow()
		            row("entity") = EntityName
		            row("displayName") = item("displayName")
		            row("amount") = 1
		            dataTable.Rows.Add(row)
		        Next

        		Return dataTable
    		End Function		

 

2 replies

Newcomer
December 20, 2021

Are you trying to import data into OneStream using an api call? or export data out of OneStream?

hoaphanAuthor
Newcomer
December 20, 2021

Hello Sai_Maganti,

i'm trying to import data into OS using an API call,

Thanks for your help

Newcomer
December 20, 2021

Here is a connector BR we used to import from workday. You can use this as a starting point/reference and build your BR and use this connector BR in a DataSource. Original code provided by OneStream (courtesy Joakim Kulan)

Imports System
Imports System.Data
Imports System.Data.Common
Imports System.IO
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Linq
Imports Microsoft.VisualBasic
Imports System.Windows.Forms
Imports OneStream.Shared.Common
Imports OneStream.Shared.Wcf
Imports OneStream.Shared.Engine
Imports OneStream.Shared.Database
Imports OneStream.Stage.Engine
Imports OneStream.Stage.Database
Imports OneStream.Finance.Engine
Imports OneStream.Finance.Database
Imports System.Net
Imports System.Web.Script.Serialization
Imports newtonsoft.json
Imports newtonsoft.json.linq
Imports System.Xml

Namespace OneStream.BusinessRule.Connector.FTE_Workday
	Public Class MainClass
		Public Function Main(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Transformer, ByVal args As ConnectorArgs) As Object
			Try
				'Get the Field name list or load the data 
				Select Case args.ActionType
					Case Is = ConnectorActionTypes.GetFieldList
						'Return Field Name List if using Field List Method to get field list in GetFieldList
						'-----------------------------------------------------------
						Dim fieldList As List(Of String) = GetFieldList(si, globals, api)
						Return fieldList
					Case Is = ConnectorActionTypes.GetData
						Dim sourceDataREST As DataTable = GetSourceDataREST(si, globals, api)
						api.Parser.ProcessDataTable(si, sourceDataREST, False, api.ProcessInfo)
						Return Nothing
				End Select
				Return Nothing
			Catch ex As Exception
				Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
			End Try
		End Function
		
		'Create the field list items to get field list (Recommended)
		'-----------------------------------------------------------
		Private Function GetFieldList(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Transformer) As List(Of String)
			Try
				Dim fields As New List(Of String)
								      
				fields.add("Field1")
				fields.add("Field2")
				..
				fields.add("FieldN")

				Return fields
			Catch ex As Exception
				Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
			End Try
		End Function

		'Create the data load Statement
		Private Function GetSourceDataREST(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Transformer) As DataTable
			Try
'				Dim wdUser As String = ""
'				Dim wdPass As String = ""
'				Dim wdCreds As String = encodebase64(wdUser & ":" & wdPass)
'				Use already encoded credentials (eg.,In Postman) key
				Dim wdCreds As String = "<encodedkey>"
				'Call the REST API		
				Dim wc As New WebClient
				wc.Encoding = Encoding.UTF8
				wc.Headers("cache-control") = "no-cache"
				wc.Headers("ContentType") = "application/json"
				wc.Headers("Accept") = "application/json"
				wc.Headers("Authorization") = "Basic " & wdCreds
												
				Dim jsonURL As String = "<webapiurl>?Format=json&<paramname>=" & <paramvalue>
				Dim json As String = wc.DownloadString(jsonurl)

				'Convert result in API to table format
'				Dim pulldata As DataTable = jsonConvert.DeserializeObject(Of DataTable)(json)
				Dim dataSet As DataSet = jsonConvert.DeserializeObject(Of DataSet)(json)
				Dim pullData As DataTable = dataSet.Tables(0)
				
				'Close Web connection
				wc.dispose
				'Return the dataset
				Return pullData
			Catch ex As Exception
			Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
			End Try
		End Function
	End Class
End Namespace

 

hoaphanAuthor
Newcomer
December 20, 2021

Ok thanks for the BR, for now what im trying to test is to connect Onestrem to POSTMAN via the URL of my application and i have already a data management sequence created  and i want to execute this sequence from POSTMAN, but i can't  the URL is invalid in Postman i don't know why
Thanks for your help 🙂

Newcomer
December 20, 2021

I think the key to this is setting up the one of the Authentication providers OneStream supports. The design and reference guide explains how you set this up. I hope you've already done this.

If you can provide more information like what error message you're getting 400, 404 etc from postman, someone might be able to help you.