API Google Maps Geolocation всегда возвращает «Недопустимая JSON полезная нагрузка получена». - PullRequest
0 голосов
/ 15 марта 2020

Я могу выполнить приведенную ниже операцию 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 с использованием fetch, я получаю следующую ошибку:

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

Я попытался переписать свои варианты и запросить тело различными способами и не нашел решения. Я видел этот ответ, но на самом деле он не предоставляет информацию относительно запроса на получение. Этот вопрос относится к вышкам сотовой связи, тогда как я работаю с wifiAccessPoints, но я подумал, что структура запроса будет аналогичной. Ниже приведено мое тело запроса, оно аналогично примеру. 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 с помощью fetch? Я открыт для других альтернатив, но просто не могу, чтобы это был запрос командной строки.

1 Ответ

3 голосов
/ 19 марта 2020

Вам нужно сериализовать значение вашего тела в строку 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)
        }});

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...