Google Maps Geolocation API всегда возвращает сообщение «Получена недопустимая полезная нагрузка JSON».

Я могу выполнить описанную ниже операцию cURL, предоставленную документами Google Geolocation API.

пример.json

{
    "considerIp": "false",
    "wifiAccessPoints": [
      {
          "macAddress": "00:25:9c:cf:1c:ac",
          "signalStrength": -43,
          "signalToNoiseRatio": 0
      },
      {
          "macAddress": "00:25:9c:cf:1c:ad",
          "signalStrength": -55,
          "signalToNoiseRatio": 0
      }
    ]
  }

Затем я запускаю в терминале ниже и получаю координаты GPS.

$ curl -d @your_filename.json -H "Content-Type: application/json" -i "https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY"

Однако, когда я пытаюсь выполнить это как запрос POST с использованием выборки, я получаю следующую ошибку.

{
  error: {
    code: 400,
    message: 'Invalid JSON payload received. Unexpected token.\n[object Object]\n ^',
    errors: [ [Object] ],
    status: 'INVALID_ARGUMENT'
  }
}

Я пытался переписать свои параметры и тело запроса разными способами и не нашел решения. Я видел это ответ, но на самом деле он не предоставляет информацию о запросе на выборку. Этот вопрос относится к вышкам сотовой связи, тогда как я работаю с wifiAccessPoints, но я полагал, что структура запроса будет аналогичной. Ниже мое тело запроса, оно такое же, как и в example.json.

const body = {
        "considerIp": "false",
        "wifiAccessPoints": [
          {
              "macAddress": "00:25:9c:cf:1c:ac",
              "signalStrength": -43,
              "signalToNoiseRatio": 0
          },
          {
              "macAddress": "00:25:9c:cf:1c:ad",
              "signalStrength": -55,
              "signalToNoiseRatio": 0
          }
        ]
      }

И вот мой запрос на получение POST.

var url = "https://www.googleapis.com/geolocation/v1/geolocate?key=" + apiKey
    fetch(url, {method: 'POST', headers: {
        'Content-Type': 'application/json'
        // 'Content-Type': 'application/x-www-form-urlencoded',
      }, body: body})
    .then(res=>res.json())
    .then((json,err)=>{
        if (err){
            console.log(err)
        } else {
           console.log(json)
        }
    })

Мой ключ API действителен без ограничений (я также использую его для API мест), и когда я попробовал свой ключ в операции cURL, он вернул ответ с координатами.

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


person Matt Croak    schedule 15.03.2020    source источник


Ответы (1)


Вам нужно сериализовать значение вашего тела в строку JSON, используя JSON.stringify(body). Вот пример кода и пример скрипта (Примечание: замените строку YOUR_API_KEY своим собственным API ключ).

const body = {
        "considerIp": "false",
        "wifiAccessPoints": [
          {
              "macAddress": "00:25:9c:cf:1c:ac",
              "signalStrength": -43,
              "signalToNoiseRatio": 0
          },
          {
              "macAddress": "00:25:9c:cf:1c:ad",
              "signalStrength": -55,
              "signalToNoiseRatio": 0
          }
        ]
      }

fetch("https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY", {
  method: "post",
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },

  //make sure to serialize your JSON body
  body: JSON.stringify(body)
})
.then(res=>res.json())
    .then((json,err)=>{
        if (err){
            console.log(err)
        } else {
           console.log(json)
        }});

Надеюсь это поможет!

person Pagemag    schedule 19.03.2020