I’m working on multiple REST endpoints and it looks to me like behavior is different across all of them. Would it be possible to document these differences?
E.g. I have a put endpoint:
New-UDEndpoint -Url /dns/cname -Method PUT -Endpoint {
param (
[Parameter(Mandatory)]
[String]$Name,
[Parameter(Mandatory)]
[String]$Target,
[String]$Zone = 'optiver.com'
)
# Some code goes here
}
} -AuthorizationPolicy DnsAdmin
When I try to call it (both with -Body and with just uri encoded parameters) I get error:
A parameter cannot be found that matches parameter name 'body'.
With some more docs I should be able to understand what I’m missing here. ATM it’s more trial and erorr…
Looks like behavior changes when CmdletBinding is involved. For example that works:
$putWithUri = New-UDEndpoint -Url /uri -Endpoint {
param (
$Param
)
$PSBoundParameters | ConvertTo-JsonEx
} -Method PUT -AuthorizationPolicy Windows
$putwithColon = New-UDEndpoint -Url /colon/:param -Endpoint {
param (
$Param
)
$PSBoundParameters | ConvertTo-JsonEx
} -Method PUT -AuthorizationPolicy Windows
But that one will return info about body not being defined:
$putWithUri = New-UDEndpoint -Url /uri -Endpoint {
param (
[Parameter(Mandatory)]
$Param
)
$PSBoundParameters | ConvertTo-JsonEx
} -Method PUT -AuthorizationPolicy Windows
$putwithColon = New-UDEndpoint -Url /colon/:param -Endpoint {
param (
[Parameter(Mandatory)]
$Param
)
$PSBoundParameters | ConvertTo-JsonEx
} -Method PUT -AuthorizationPolicy Windows
I suspect the problem here is that you pass Body as a parameter always, thus CmdletBinding is choking on it. Adding it as a parameter to definition of the endpoint (even if I prefer more direct access to parameters) hides the problem:
irm -Method Put -Uri http://localhost:88/api/colon/foo -UseDefaultCredentials
Body Param
---- -----
foo
OK, looks like this might be a call-related, not method-related. Today I hit similar problem with POST.
If I call my post like this:
irm 'https://ud.my.domain/api/dns/cnameswap?name=foo&target=hostname.domain' -UseDefaultCredentials -Method Post
I get exactly same error:
error
-----
@{message=A parameter cannot be found that matches parameter name 'body'.; location=; type=error; id=; refreshInterval=0; autoRefresh=False; hasCallback=Fa...
However, if I call exactly same API with this approach:
irm 'https://ud.my.domain/api/dns/cnameswap' -Body @{ Name = 'foo'; target = 'hostname.domain' } -UseDefaultCredentials -Method Post
… it all works fine. So it looks like if parameters are in the Uri, $Body is always passed to Post/Put and fails if param block on the endpoint has any [Parameter()] making whole thing use CmdletBinding and has no $Body parameter defined…