Выполнение запроса GET к API Карт Google возвращает неверный запрос 400, ошибка - javascript

Привет :) Просто хочу предисловие к этому посту, сказав, что я ОЧЕНЬ младший разработчик и все еще пытаюсь разобраться в использовании API-интерфейсов ОС!

Итак, я пытаюсь создать страницу, которая позволяет пользователям ставить маркеры на карту, а затем использовать широту и долготу маркера, чтобы сделать запрос на получение в API карт Google для названия города, в котором был сброшен маркер, а затем для поместите название города на панель рядом с картой. НО, у меня проблемы с моим запросом GET, и он возвращает ошибку 400 неверного запроса в консоли.

Я хочу отобразить список всех городов, в которых были сброшены маркеры, и поэтому я пытаюсь использовать интерполяцию в URL-адресе, чтобы ее можно было использовать снова и снова для всех широт и долгот, возвращаемых сброшенными булавками. Итак, я использовал следующий URL https://maps.googleapis.com/maps/api/geocode/json?latlng=${findCityLng},${findCityLng}&sensor=true&key=MY_API_KEY; (В моем коде я ввел свой фактический ключ API, но вынул его для этого поста).

Я хочу знать, как исправить URL-адрес, чтобы его можно было использовать на любой широте и долготе без необходимости жестко кодировать их значения, и чтобы он затем возвращал JSON, я могу копаться в получении имени города вместо того, чтобы возвращать 400 ошибка. У меня есть googled и googled, но нет ничего об использовании интерполяции для создания URL-адреса для выполнения запросов API или почему запрос на получение к api карт Google возвращает ошибку 400 при выполнении запроса на получение. Я уже несколько часов гуглил и читал документы Google Maps API, но не смог найти / понять, что мне нужно.

Любая помощь будет принята с благодарностью.

Вот весь мой код (обратите внимание, что мне пришлось удалить свой ключ API, и я не думаю, что фрагмент кода будет работать без него, но я не уверен, как еще его опубликовать! Извините, если это не то, что нужно делать):

console.log('hello world');


let myPlaces = [];
let map;
let findCityLat;
let findCityLng;



  initMap = function() {
    map = new google.maps.Map(document.getElementById('map'), {
      center: {lat: 36.2048, lng: 138.2529},
      zoom: 6.8
    });



    map.markerList = [];
    map.addListener('click', addPlace);

    const placesFromLocalStorage = JSON.parse(localStorage.getItem('myPlaces'));
    if (Array.isArray(placesFromLocalStorage)) {
      myPlaces = placesFromLocalStorage;
      renderMarkers();                  
    }
                                 



    function addPlace(event) {
    

      myPlaces.push({
        position: event.latLng
      });

      console.log(myPlaces);


      localStorage.setItem('myPlaces', JSON.stringify(myPlaces)); 
      renderMarkers();                                            
    }

    function getCity() {
      for (var i = 0; i < myPlaces.length; i++) {
        findCityLat = myPlaces[i].position.lat;
        findCityLng = myPlaces[i].position.lng;
        console.log(`Lat: ${findCityLat}`);
        console.log(`Lng: ${findCityLng}`);


        const fetchCity = function () {
          const xhr = new XMLHttpRequest();
          xhr.onreadystatechange = function () {
            console.log('readyState', xhr.readyState);
            
            if (xhr.readyState !== 4) {
              return;
            }

            const info = JSON.parse( xhr.response ); 

            const p = document.createElement('p');
            p.innerHTML = `<strong>${ info.result }`; 
            document.body.appendChild( p );
          }
          xhr.open('GET', `https://maps.googleapis.com/maps/api/geocode/json?latlng=${findCityLng},${findCityLng}&sensor=true&key=MY_API_KEY`);
          xhr.send(); // Asynchronous

        };

        window.onload = function() {
          setTimeout(fetchCity,1500)

      }

    }

  }
    getCity();

    function renderMarkers() {
      map.markerList.forEach(m => m.setMap(null)); 
      map.markerList = [];

      myPlaces.forEach((place) => {                     
        const marker = new google.maps.Marker({         
          position: place.position,                     
          map: map
        });

        map.markerList.push(marker);
      });
    }

  }



     initMap();
@import url('https://fonts.googleapis.com/css?family=Quicksand');


* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
}

.main-container {
  margin: 15px;
  display: flex;
}

.sidebar {
  border: rgba(101, 171, 236, 0.56) solid 3px;
  font-size: 0.75em;
  height: 50vh;
  width: 37vw;
  margin: auto;
  text-align: center;
  font-family: 'Quicksand', sans-serif;
  padding: 2px;
}

#map {
  height: 50vh;
  width: 60vw;
  margin: auto;
}

.earthIcon {
  width: 1em;
}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>My Favourite Places</title>
  <link rel="stylesheet" href="style/master.css">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.2.0/css/all.css" integrity="sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ" crossorigin="anonymous">
<link rel="shortcut icon" href="images/earth.ico" type="image/x-icon">

</head>
<body>
  <div class="main-container">
    <div class="sidebar">
      <h1>My favourite places in the <img class="earthIcon" src="images/earth.ico"</h1>
      <div id="favPlacesList">

      </div>
    </div>

    <div class="main-content-area">
      <div id="map"></div>
    </div>
  </div>

    <script src="https://maps.googleapis.com/maps/api/js?key=MY_API_KEY&libraries=places"></script>


  <script src="js/main.js"></script>

</body>

</html>


person Elli-Jayne Willard    schedule 09.10.2018    source источник


Ответы (2)


Вы отправляете запрос по следующему URL-адресу:

`https://maps.googleapis.com/maps/api/geocode/json?latlng=${findCityLng},${findCityLng}&sensor=true&key=MY_API_KEY`

Однако этот URL-адрес содержит удвоенную долготу вместо широты и долготы.

Он должен работать лучше с:

`https://maps.googleapis.com/maps/api/geocode/json?latlng=${findCityLat},${findCityLng}&key=MY_API_KEY`

Пожалуйста, обрати внимание:

  • Хотя это не является причиной ошибки, я удалил параметр sensor, поскольку он больше не требуется (источник: документация)
  • Вы можете (но не обязаны) использовать обратный геокодирование из Javascript API. Под капотом он делает то, что вы делаете, вызывая URL-адрес геокода http, но, поскольку вы работаете в среде javascript, код для вас может быть проще.
person Michael P. Bazos    schedule 10.10.2018
comment
Спасибо! Я чувствую себя таким идиотом! Я целую вечность начинал с URL-адреса и не видел этого! - person Elli-Jayne Willard; 15.10.2018

В запросе карт гугл у вас такая ошибка:

Ошибка Google Maps JavaScript API: InvalidKeyMapError https://developers.google.com/maps/documentation/javascript/error-messages#invalid-key-map-error

Здесь вы можете прочитать информацию об этой ошибке

https://developers.google.com/maps/documentation/javascript/error-messages#invalid-key-map-error.

Информация по приведенной выше ссылке предполагает, что вам необходимо создать новый ключ api здесь

И добавьте свой недавно сгенерированный api на свою страницу следующим образом

  <script async defer src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
  type="text/javascript"></script>
person Marat Badykov    schedule 09.10.2018
comment
Спасибо за ответ - просто чтобы подтвердить, у меня есть ключ API, и я его использую (я просто взял его из кода, который я опубликовал выше, поскольку Google теперь взимает с вас плату, если вы перейдете на определенное количество запросов), но вы Вы говорите, что мне нужен еще один новый ключ API в дополнение к моему оригинальному, чтобы это работало? - person Elli-Jayne Willard; 10.10.2018