#json #powershell #type-conversion
Вопрос:
При отправке запроса GET на сервер, который использует самозаверяющий сертификат:
add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
$RESPONSE=Invoke-WebRequest -Uri https://yadayada:8080/bla -Method GET
echo $RESPONSE
Я получаю следующий ответ:
StatusCode : 200
StatusDescription : OK
Content : {123, 10, 108, 111...}
RawContent : HTTP/1.1 200 OK
Content-Length: 21
Date: Sat, 11 Jun 2016 10:11:03 GMT
{
flag:false
}
Headers : {[Content-Length, 21], [Date, Sat, 11 Jun 2016 10:11:03 GMT]}
RawContentLength : 21
Содержимое содержит несколько проводных номеров, поэтому я пошел за RawContent, как бы я проанализировал JSON внутри, игнорируя заголовки? или есть ли чистый способ получить контент с этих номеров?
Комментарии:
1. Вам вообще нужен JSON или только значения? Вы можете заменить
Invoke-WebRequest
, сInvoke-RestMethod
помощью которого автоматически преобразуется ответ json в apsobject
, чтобы вы могли использовать$response = Intoke-RestMethod -Uri "https://yadayada:8080/bla"; $response.flag
2. Спасибо Фроде Ф., это решает мою загадку. Для меня значения JSON достаточно хороши, если вы опубликуете это как ответ, я приму его
Ответ №1:
Вы можете заменить Invoke-WebRequest
, с Invoke-RestMethod
помощью которого автоматически преобразуется ответ json в a psobject
, чтобы вы могли использовать:
$response = Invoke-RestMethod -Uri "https://yadayada:8080/bla"
$response.flag
Ответ №2:
Если у вас есть необходимость использовать Invoke-WebRequest
Invoke-RestMethod
его, вы можете преобразовать его в объект, сначала превратив его в строку
$response = Invoke-WebRequest -Uri "https://yadayada:8080/bla"
$jsonObj = ConvertFrom-Json $([String]::new($response.Content))
Комментарии:
1. Предупреждаю, если это поможет кому — то еще — синтаксис в строке 2 в этом ответе не работает для Powershell v4, но метод вызова-RestMethod сработал. Метод Invoke-RestMethod также имеет преимущество (по крайней мере, в Powershell v4) в том, что он не зависит от IE — чтобы заставить Invoke-WebRequest работать в среде без IE, я должен был предоставить-UseBasicParsing.
Ответ №3:
Таким образом:
$response = Invoke-WebRequest -Uri <your_uri>
if ($response.statuscode -eq '200') {
$keyValue= ConvertFrom-Json $response.Content | Select-Object -expand "<your_key_name>"
}
Комментарии:
1. Спасибо, это правильный ответ для вложенного json
Ответ №4:
Если у вас есть оболочка, чем включать имя в путь.
$response=Invoke-RestMethod -Method GET -ContentType "application/json" -Headers $headers -Uri $Url
foreach($element in $response.baskets.fixed_asset_rents)
{
Write-Host $element
}