web-dev-qa-db-fra.com

Invoke-WebRequest: impossible de lier le paramètre 'En-têtes'

J'essaie d'exécuter une commande curl dans powershell:

curl --user bitcoinipvision --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "move", "params": ["acc-1", "acc-2", 6, 5, "happy birthday!"] }' -H 'content-type: application/json;' http://localhost:18332/

Mais je reçois cette erreur, quel est le problème?

 Invoke-WebRequest: impossible de lier le paramètre 'Headers'. Impossible de convertir le 
 "Content-type: application/json;" valeur de type "System.String" à la valeur .__ 'content-type: application/json;' http: // ...
 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~. + CategoryInfo: InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException 
 + FullyQualifiedErrorId: CannotConvertArgumentNoMessage, Microsoft.PowerShell.Commands.InvokeWebRequestCommand.
7
Zenith

Comme cela a déjà été mentionné par certains commentateurs, vous verrez que curl est en fait juste un alias de Invoke-WebRequest :

PS> Get-Command curl

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           curl -> Invoke-WebRequest

Remarque: je suggère d'utiliser Get-Command , et non Get-Alias , car vous ne savez peut-être pas si la commande que vous utilisez est un alias, une applet de commande ou un exécutable.

A partir de là, il y a deux manières possibles de résoudre votre problème:

  1. Utilisez Invoke-RestMethod de PowerShell (ou, si vous utilisez PowerShell <3, Invoke-WebRequest ):

    Invoke-RestMethod -Uri http://localhost:18332/ -Credential bitcoinipvision -body $thisCanBeAPowerShellObject 
    

    Comme vous pouvez le constater, aucun type de contenu n'est nécessaire, car JSON est le type de contenu par défaut d'IRM. bien que vous puissiez le changer en utilisant -ContentType.

  2. Si disponible dans votre environnement actuel, utilisez le cUrl d'origine. Vous devez le taper de cette façon:

    curl.exe --user bitcoinipvision --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "move", "params": ["acc-1", "acc-2", 6, 5, "happy birthday!"] }' -H 'content-type: application/json;' http://localhost:18332/
    

Je préférerais définitivement le premier au deuxième, car PowerShell supporte nativement les réponses JSON, ce qui vous permet de les utiliser facilement, par exemple en le canalisant vers Where-Object, Format-Table, Select-Object, Measure-Object et tant de choses. Si vous préférez utiliser cUrl, vous devez analyser vous-même la chaîne renvoyée par le processus curl.exe. Cela pourrait également être problématique avec le contenu binaire.

3
Clijsters