JSON: невозможно демаршалировать строку - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь использовать Rest API, но когда я запрашиваю, я получаю следующую ошибку, которую я не понимаю. Я попытался посмотреть здесь похожие вопросы, но это очень частные случаи. Это код, который я использую

$oAuth2TokenUrl = "https://api.cloudflare.com/client/v4/graphql"
$accessKey = '1234'

$Cloudflare_Oauth_Header = @{
    "X-AUTH-EMAIL" = "bryan";
    "X-AUTH-KEY" = "$accessKey";
    "Content-type" = "application/json"
}

$query = '\"query\": \"{
  viewer {
zones(filter: {zoneTag: \"1234\"}) {
  httpRequests1mGroups(orderBy: [datetimeMinute_ASC], limit: 1000, filter: {datetime_geq: \"2020-05-07T10:00:00Z\", datetime_lt: \"2020-05-07T10:10:00Z\"}) {
    dimensions {
      datetimeMinute
    }
    sum {
      browserMap {
        pageViews
        uaBrowserFamily
      }
    }
    uniq {
      uniques
    }
  }
}
  }
    } \"' | ConvertTo-Json    

$Cloudflare_zone = Invoke-RestMethod -Uri $oAuth2TokenUrl -Method POST -Headers $Cloudflare_Oauth_Header -Body $query -ContentType 'application/json'

Итак, как только я проверю содержимое $Cloudflare_zone, напечатано следующее:

{@{message=failed to recognize JSON request: 'json: cannot unmarshal string into Go value of type graphql.httpPostBody'; path=; extensions=}}

1 Ответ

1 голос
/ 08 мая 2020

Ошибка говорит: "json: невозможно размаршалировать строку в Go значение типа graphql.httpPostBody" .

Это сводится к следующему: «Невозможно проанализировать строку JSON. ты послал". И, конечно же, ваша строка JSON недействительна.

Становится намного проще обрабатывать, если вы разделите ее: строковая переменная с GraphQL и хеш-таблица PowerShell с телом вашего запроса. Таблица ha sh затем может быть преобразована в JSON для передачи.

$graphQL = '{
  # whatever (note the single quotes, so any double quotes in here can stay unescaped)
}'

$header = @{
  "X-AUTH-EMAIL": "bryan"
  "X-AUTH-KEY": "$accessKey"
}

$body = @{
   query: $graphQL
   # potentially other parameters that are not part of the GraphQL
}

$Cloudflare_zone = Invoke-RestMethod `
  -Uri "https://api.cloudflare.com/client/v4/graphql" `
  -Method POST `
  -Headers $Cloudflare_Oauth_Header `
  -Body ($body | ConvertTo-Json) `
  -ContentType 'application/json; charset=utf-8'

Примечания:

  • Я использовал продолжение строки (путем экранирования новой строки с помощью обратные кавычки), чтобы разбить строку для повышения читабельности.
  • Обычно рекомендуется указывать кодировку явно, а не позволять Invoke-RestMethod делать все, что захочет.
  • Вы должны преобразовать все этого в функцию PowerShell для упрощения повторного использования.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...