2

I'm trying to send to an Azure WebHook a Body who contain both headers+Body with a WebRequest :

$Body = @"
{
    "headers":
    {
        "ocp-apim-subscription-key":"xxxxxx",
        "ocp-apim-trace":"true"
    },
    "Body":
    {
        "toto": "xxxxxx-1505-xxxxx-8113-xxxxxxxxxx",
        "status": "Enable",
    }
}"@

I'm using:

Invoke-RestMethod -Uri $webhook_url -Headers $webhook_headers -Method $webhook_method -Body $Body

Everything is working, after that in Azure, I receive the Params Input with this:

workflow TestAPI
{
Param ([object]$WebHookData)
    if ($WebHookData)
    {
           # Get Webhook data
        $WebhookName = $WebHookData.WebhookName
        $WebhookHeaders = $WebHookData.RequestHeader
        $WebhookBody = $WebHookData.RequestBody

           # Body converting
        $body = (ConvertFrom-Json -InputObject $WebhookBody)

In the end of my script, I convert it again to Json and use the Invoke-Webrequest:

    $body_json = (Convertto-Json -InputObject $body.body -Depth 10)
    $header_json = (Convertto-Json -InputObject $body.headers -Depth 10 )
$response = Invoke-RestMethod -Uri $URI_key -Method $Method -Body $body_json -Headers $header_json -ContentType "application/json" -UseBasicParsing

But I get this error:

Invoke-RestMethod : Cannot bind parameter 'Headers'. Cannot convert the "{ "ocp-apim-subscription-key": "xxxxxxxxxxx", "ocp-apim-trace": "true" }" value of type "System.String" to type "System.Collections.IDictionary".

This is the output of the value $body.headers in PsObject after ConvertFrom-Json:

@{ocp-apim-subscription-key=xxxxxxxxx; ocp-apim-trace=true}

Output of $header_json after ConvertTo-Json:

{
    "ocp-apim-subscription-key":  "xxxxxxxxxxxxx",
    "ocp-apim-trace":  "true"
}

2 Answers 2

2

To add on to Persistent13's commen, you can use something as simple as this, with PowerShell:

$headers = @{
    "Accept-Encoding" = 'gzip'
    "User-Agent"      = 'Outlook-Android'      
}
Invoke-WebRequest http://fq.dn -Headers $headers
Sign up to request clarification or add additional context in comments.

Comments

0

The -Headers parameter requires a IDictionary object, a json string will not work.

You'll have to create a IDictionary object yourself since ConvertFrom-Json will de-serialize the json into a PSCutomObject.

You can do that like so:

$headers = @{}
($body | ConvertFrom-Json).Headers.PSObject.Properties | ForEach-Object { $headers[$_.Name] = $_.Value }

Now you can use the $headers variable with Invoke-RestMethod. That will fix the error you are receiving.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.