Comment faire une requête POST en utilisant Powershell si le corps a un paramètre @type

je veux faire une requête POST dans PowerShell. Voici les détails du corps dans Postman.

{"@type":"login",
 "username":"xxx@gmail.com",
 "password":"yyy"
}

Comment puis-je transmettre ceci à PowerShell?

23
demandé sur live2learn 2016-03-01 15:23:53

3 réponses

Vous devriez être en mesure de faire ce qui suit:

$params = @{"@type"="login";
 "username"="xxx@gmail.com";
 "password"="yyy";
}

Invoke-WebRequest -Uri http://foobar.com/endpoint -Method POST -Body $params

ceci enverra le post comme le corps. Cependant - si vous souhaitez poste comme un Json que vous pourriez être explicite. Pour poster ceci en tant que JSON, vous pouvez spécifier le ContentType et convertir le corps en Json en utilisant

Invoke-WebRequest -Uri http://foobar.com/endpoint -Method POST -Body ($params|ConvertTo-Json) -ContentType "application/json"

Bonus: vous pouvez également utiliser la méthode Invoke-RestMethod pour traiter avec JSON et REST apis (ce qui vous sauvera quelques lignes supplémentaires pour la désisérialisation)

26
répondu CmdrTchort 2018-04-14 19:13:02

Utiliser Invoke-RestMethod pour consommer repos-APIs. Enregistrer au format JSON à une chaîne et l'utiliser comme le corps, ex:

$JSON = @'
{"@type":"login",
 "username":"xxx@gmail.com",
 "password":"yyy"
}
'@

$response = Invoke-RestMethod -Uri "http://somesite.com/oneendpoint" -Method Post -Body $JSON -ContentType "application/json"

si vous utilisez Powershell 3, je sais qu'il y a eu des problèmes avec Invoke-RestMethod, mais vous devriez pouvoir utiliser Invoke-WebRequest en remplacement:

$response = Invoke-WebRequest -Uri "http://somesite.com/oneendpoint" -Method Post -Body $JSON -ContentType "application/json"

si vous ne voulez pas écrire votre propre JSON à chaque fois, vous pouvez utiliser un hashtable et utiliser PowerShell pour le convertir en JSON avant de le poster. Ex.

$JSON = @{
    "@type" = "login"
    "username" = "xxx@gmail.com"
    "password" = "yyy"
} | ConvertTo-Json
31
répondu Frode F. 2016-03-01 20:31:25

@Frode F. a donné la bonne réponse.

Par le Invoke-WebRequest Vous imprime aussi le 200 OK et beaucoup de bla, bla, bla... ce qui pourrait être utile, mais je préfère encore le Invoke-RestMethod qui est plus léger.

Aussi, gardez à l'esprit que vous devez utiliser | ConvertTo-Json pour le corps uniquement, pas d'en-tête:

$body = @{
 "UserSessionId"="12345678"
 "OptionalEmail"="MyEmail@gmail.com"
} | ConvertTo-Json

$header = @{
 "Accept"="application/json"
 "connectapitoken"="97fe6ab5b1a640909551e36a071ce9ed"
 "Content-Type"="application/json"
} 

Invoke-RestMethod -Uri "http://MyServer/WSVistaWebClient/RESTService.svc/member/search" -Method 'Post' -Body $body -Headers $header | ConvertTo-HTML

et vous pouvez ensuite ajouter un | ConvertTo-HTML à la fin de la requête pour une meilleure lisibilité

-1
répondu Francesco Mantovani 2018-09-27 22:36:09