functions/get-d365odataentityurl.ps1
<# .SYNOPSIS Get url for an Data Entity using OData .DESCRIPTION Get url for an Data Entity to be used with the OData endpoint of the Dynamics 365 Finance & Operations .PARAMETER EntityName Name of the Data Entity you want to work against The parameter is Case Sensitive, because the OData endpoint in D365FO is Case Sensitive Remember that most Data Entities in a D365FO environment is named by its singular name, but most be retrieve using the plural name E.g. The version 3 of the customers Data Entity is named CustomerV3, but can only be retrieving using CustomersV3 Look at the Get-D365ODataPublicEntity cmdlet to help you obtain the correct name .PARAMETER EntitySetName Name of the Data Entity you want to work against The parameter is created specifically to be used when piping from Get-D365ODataPublicEntity .PARAMETER Url URL / URI for the D365FO environment you want to access through OData If you are working against a D365FO instance, it will be the URL / URI for the instance itself If you are working against a D365 Talent / HR instance, this will have to be "http://hr.talent.dynamics.com" .PARAMETER SystemUrl URL / URI for the D365FO instance where the OData endpoint is available If you are working against a D365FO instance, it will be the URL / URI for the instance itself, which is the same as the Url parameter value If you are working against a D365 Talent / HR instance, this will to be full instance URL / URI like "https://aos-rts-sf-b1b468164ee-prod-northeurope.hr.talent.dynamics.com/namespaces/0ab49d18-6325-4597-97b3-c7f2321aa80c" .EXAMPLE PS C:\> Get-D365ODataEntityUrl -EntityName CustomersV3 This will get the url for the CustomersV3 OData endpoint. It will use the CustomersV3 entity as the name of the entity. It will output a complete url for the CustomersV3 OData endpoint. .LINK Add-D365ODataConfig .LINK Get-D365ActiveODataConfig .LINK Set-D365ActiveODataConfig .NOTES Tags: OData, Data, Entity, Query, Url Author: Mötz Jensen (@Splaxi) #> function Get-D365ODataEntityUrl { [CmdletBinding(DefaultParameterSetName = "Default")] [OutputType()] param ( [Parameter(Mandatory = $true, ParameterSetName = "Specific")] [Alias('Name')] [string] $EntityName, [Parameter(Mandatory = $true, ParameterSetName = "Default", ValueFromPipelineByPropertyName = $true)] [Alias('CollectionName')] [string] $EntitySetName, [Alias('Uri')] [Alias('AuthenticationUrl')] [string] $Url = $Script:ODataUrl, [string] $SystemUrl = $Script:ODataSystemUrl ) begin { if ([System.String]::IsNullOrEmpty($SystemUrl)) { Write-PSFMessage -Level Verbose -Message "The SystemUrl parameter was empty, using the Url parameter as the OData endpoint base address." -Target $SystemUrl $SystemUrl = $Url } if ([System.String]::IsNullOrEmpty($Url) -or [System.String]::IsNullOrEmpty($SystemUrl)) { $messageString = "It seems that you didn't supply a valid value for the Url parameter. You need specify the Url parameter or add a configuration with the <c='em'>Add-D365ODataConfig</c> cmdlet." Write-PSFMessage -Level Host -Message $messageString -Exception $PSItem.Exception -Target $entityName Stop-PSFFunction -Message "Stopping because of errors." -Exception $([System.Exception]::new($($messageString -replace '<[^>]+>', ''))) -ErrorRecord $_ return } if ($Url.Substring($Url.Length - 1) -eq "/") { Write-PSFMessage -Level Verbose -Message "The Url parameter had a tailing slash, which shouldn't be there. Removing the tailling slash." -Target $Url $Url = $Url.Substring(0, $Url.Length - 1) } if ($SystemUrl.Substring($SystemUrl.Length - 1) -eq "/") { Write-PSFMessage -Level Verbose -Message "The SystemUrl parameter had a tailing slash, which shouldn't be there. Removing the tailling slash." -Target $Url $SystemUrl = $SystemUrl.Substring(0, $SystemUrl.Length - 1) } } process { if (Test-PSFFunctionInterrupt) { return } Write-PSFMessage -Level Verbose -Message "Building request url for the OData endpoint for entity: $entity." -Target $entity #A simple hack to select either names as the name going forward $entity = "$EntityName$EntitySetName" [System.UriBuilder] $odataEndpoint = $SystemUrl if ($odataEndpoint.Path -eq "/") { $odataEndpoint.Path = "data/$entity" } else { $odataEndpoint.Path += "/data/$entity" } $odataEndpoint.Uri.AbsoluteUri } } |