Виджет Google Places AutoComplete генерирует новый сеансовый ключ для каждого запроса

Недавно Google обновил некоторые политики выставления счетов, в рамках которых они представили SessionTokens для запросов автозаполнения.

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

Но я вижу, что для каждого запроса в одном сеансе создается другой токен. Я что-то упускаю, пожалуйста, помогите мне. Вот pluker для примера, там я наблюдал разные токены, генерируемые для каждого нажатия клавиши.

var options = {
  types: ['(cities)']
};
  var searchBox = new google.maps.places.Autocomplete(input, options);

person Mahesh Bongani    schedule 07.08.2018    source источник


Ответы (3)


Мой код для страницы

    <div class="searchField">
        <input id="searchLocation" name="searchLocation" type="text" placeholder="Enter an Address">
    </div>
    <!-- more code.... -->

    <!-- footer -->
    <script>
    // initiate search area for autocomplete of places from Google Maps Street Addresses
    function initAutocomplete() {
        // define the search location box
        var searchBox = $("#searchLocation")[0];

        // initiate the autocomplete with the options on the search box
        var autocomplete = new google.maps.places.Autocomplete(searchBox, options);



    };
    </script>
    
    <script src="https://maps.googleapis.com/maps/api/js?libraries=places&region=ca&language=en&key= [YOUR_API_KEY]&callback=initAutocomplete" async defer> 
   </script>

Разъяснение токена сеанса

Согласно Документам Google (внизу страницы в тексте предупреждения)... https://developers.google.com/maps/documentation/javascript/places-autocomplete

Предупреждение: Обязательно передавайте уникальный токен сеанса для каждого нового сеанса. Использование одного и того же токена для нескольких сеансов приведет к тому, что каждый запрос будет оплачиваться отдельно. Обратите внимание, что виджет автозаполнения обрабатывает сеансы автоматически (вам не нужно делать ничего дополнительно). Теперь давайте погрузимся в базовый пример Javascript.

Это может быть немного запутанным, только потому, что вы пытаетесь разобраться в номенклатуре документов Google и что это за вещи, и, возможно, потому, что вы делали это одним способом, и вдруг ваш босс или клиент или кто-то еще просит вас использовать Sessions/Session Вместо них жетоны. Если вы делаете new google.maps.places.Autocomplete() вместо AutocompleteServices или что-то в этом роде, вы используете виджет автозаполнения. Виджет автозаполнения сам будет обрабатывать токены сеанса/сеанса.

Докажите это!

Я доверяю Google и документации Google Developer относительно их собственных продуктов и того, как/что они делают, но в сети было много путаницы по этому поводу. Поэтому мне нужны были доказательства, помимо получения счета через месяц. К сведению: выставление счетов в консоли Google Cloud Platform (https://console.cloud.google.com/google/maps-apis?pli=1) покажет вам это почти сразу и подтвердит то, что ниже и выше.

Глядя на сетевую активность в Dev Tools, мы видим, что есть несколько вызовов службы автозаполнения.
Я не использовал здесь функцию AutocompleteService, это базовый пример настройки, такой же, как я перечислил выше для Обратный вызов с помощью виджета автозаполнения через new google.maps.places.Autocomplete().

Когда вы переходите на страницу, вы можете сначала увидеть вызов библиотеки, первый скриншот Dev Tools ниже.
Затем я выполнил поиск, который сработал. Я начал вводить базовый адрес 1990, после этого вы можете увидеть 4 запроса к API. 1 запрос/вызов для каждого введенного символа. Каждое из этих имен запросов начинается с AutocompleteServices.GetPredictions..., хотя я НЕ ИСПОЛЬЗОВАЛ AutocompleteServices в своем коде. На серверной части виджет автозаполнения использует AutocompeleteServices и выполняет за вас всю работу по пользовательскому интерфейсу/UX, а также функциональность, сеанс и токены. Они показаны на снимках экрана № 1–3 инструментов разработчика ниже.

Затем вы видите 5-й вызов запроса PlaceServces.GetPlaceDetails, который я выбрал из раскрывающегося списка. Это скриншот инструментов разработчика № 4 ниже. Глядя на заголовки, для каждого из этих запросов я вижу несколько вещей. Первое, что обведено внизу, — это токен. Я знаю, что только что сказал, и в документации Google только что сказано, что виджет автозаполнения обрабатывает токен сеанса, и внимательный глаз увидит, что значение этого токена отличается для каждого запроса. Он также не в формате «UUID версии 4», который рекомендуется Google, но это другая тема. Этот токен в заголовке НЕ ЯВЛЯЕТСЯ токеном сеанса. Это похоронено в документации, которой 5 лет для предыдущей версии этого в Документах Google, но это больше не используется, и автоматически устанавливается для каждого запроса и не является токеном сеанса. Итак, где тогда токен сеанса? Вы можете спросить.

Другие элементы в заголовке, начинающиеся с 1, 2 и т. д., представляют собой разные передаваемые переменные сеанса. В этом случае токен сеанса — «20s», за которым следует UUID версии 4, автоматически созданный виджетом автозаполнения. Внимательный глаз также заметит, что на 3 скриншотах ниже они одинаковы. У меня есть пятый снимок экрана после обновления страницы, который показывает, что токен сеанса изменился. Вы можете видеть в моем коде, что я не указал эти вещи, но поскольку я использую виджет автозаполнения, они сделаны за меня.

Инструменты разработчика1

DevTools_Call1

DevTools_Call2

DevTools_Call3

DevTools_Call4 DevTools_Call5

person Keith E. Truesdell    schedule 06.12.2018
comment
Спасибо за этот исчерпывающий ответ. Немного успокой меня. - person Stephan-v; 16.04.2019
comment
Без проблем. Это меня успокоило, поскольку в документации об этом ничего не сказано. Душевный покой - вот почему я копался в этом и опубликовал это. Так что я рад, что это дает кому-то душевное спокойствие. Как и во всем, проведите собственное тестирование и сами поиграйте с переменными. Если кто-то видит что-то другое, дайте мне знать и поправьте меня. Мне нравится учиться, даже на ошибках и ошибках. - person Keith E. Truesdell; 16.04.2019
comment
Спасибо! Это было так полезно. Это означает, что мне не нужно заново изобретать эту функциональность. - person Jonathan; 28.08.2019
comment
Ницца! Я тоже был озадачен этим. Только один вопрос: согласно странице выставления счетов (cloud.google.com/maps-platform /pricing/sheet) автозаполнение должно быть включено в сведения о местах за сеанс. Разве токен не должен быть одинаковым в запросах автозаполнения и в getplacedetails? - person juanignaciosl; 23.01.2020
comment
Я считаю, что должен. Для этого мне пришлось бы повторить некоторые эксперименты и сделать несколько скриншотов. Насколько я помню, этот пример и эти скриншоты были сделаны из нескольких сеансов и окон, чтобы получить как можно больше примеров и тому подобного. Я попробую это и поищу это. - person Keith E. Truesdell; 06.02.2020

Боюсь, параметр токена, который вы видите в запросе, не является токеном сеанса автозаполнения мест. Этот параметр существовал еще до изменения платформы Google Maps. Я не знаю, как Google управляет токенами сеанса автозаполнения, возможно, они обрабатывают их на стороне сервера.

В документации указано, что в виджете автозаполнения реализованы автоматические токены сеанса.

Автозаполнение (веб-служба и JavaScript) и виджет автозаполнения JavaScript были обновлены для использования биллинга на основе сеанса.

Примечание. Для виджета автозаполнения JavaScript не требуется никаких изменений кода, так как виджет автоматически управляет сеансами для вас.

источник: https://cloud.google.com/maps-platform/user-guide/pricing-changes/

Чтобы быть уверенным, я бы посоветовал вам проверить отчеты о выставлении счетов в консоли разработчика.

https://console.cloud.google.com/billing/unbilledinvoice?project=YOUR_PROJECT_ID&authuser=1

В этом отчете вы увидите, какой метод использовался для тарификации запросов автозаполнения мест. Посмотрите на строки, в которых столбец «Продукт» имеет значение Places API, а в столбце «Ресурс» показано, какой метод использовался для выставления счетов Autocomplete - Per Request или Autocomplete - Per Session.

введите здесь описание изображения

Если вы используете виджет автозаполнения мест с автоматическими сеансами, но в этом отчете показано только использование Autocomplete - Per Request, обратитесь в службу технической поддержки карт Google через https://console.cloud.google.com/google/maps-apis/support.

person xomena    schedule 23.08.2018

Если вы используете google.maps.places.Autocomplete(input, options); он автоматически добавит токен сеанса.

В вашем примере pluker нет автозаполнения, но есть новый google.maps.places.SearchBox

person Dega Bartosz    schedule 14.08.2018
comment
Я могу подтвердить, что использование map.places.Autocomplete(input, options) также создает новый токен в URL-адресе для каждого запроса. maps.googleapis.com/maps/api/place/js/AutocompletionService.GetPredictions?1sh...&token=31735, maps.googleapis.com/maps/api/place/js/AutocompletionService.GetPredictions?1shu...&token=42012, maps.googleapis.com/maps/api/place/js/AutocompletionService.GetPredictions?1shum...&token=123232 - person jmorganmartin; 23.08.2018
comment
Даже с «map.places.Autocomplete» для каждого запроса генерируется другой токен. Может ли кто-нибудь помочь в этом? - person Mahesh Bongani; 23.08.2018
comment
Привет, я знаю, что это выглядит странно, но это не токен сеанса. Пожалуйста, откройте инструменты разработки вашего браузера и проверьте свой запрос. значение, которое вы передаете автозаполнению, отправляется не как пара ключ/значение, а только как ключ, поэтому, если вы наберете «Syd», будет ключ, начинающийся с 1, поэтому будет 1sSyd. В случае sessionToken это ключ, начинающийся с « 20 сек., пожалуйста, обратите внимание, что он не меняется во время автозаполнения. - person Dega Bartosz; 24.08.2018