Google Places AutoComplete 小部件正在为每个请求生成一个新的会话密钥
Posted
技术标签:
【中文标题】Google Places AutoComplete 小部件正在为每个请求生成一个新的会话密钥【英文标题】:Google places AutoComplete widget is generating a new Session Key per every request 【发布时间】:2019-01-14 15:16:02 【问题描述】:最近,Google 更新了一些计费政策,作为他们为自动完成请求引入 SessionTokens 的一部分。
作为其中的一部分,同一会话中的每个请求都将在请求中发送相同的令牌,如果我们使用 Google API 提供的自动完成小部件,它是自动的。
但是,我看到在同一会话中为每个请求生成了不同的令牌。我错过了什么,请指导我。这是示例的pluker,我观察到每次击键都会生成不同的令牌。
var options =
types: ['(cities)']
;
var searchBox = new google.maps.places.Autocomplete(input, options);
【问题讨论】:
【参考方案1】:我的页面代码
<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®ion=ca&language=en&key= [YOUR_API_KEY]&callback=initAutocomplete" async defer>
</script>
会话令牌说明
根据谷歌文档(一直在页面底部的“警告文本”中)...... https://developers.google.com/maps/documentation/javascript/places-autocomplete
警告:确保为每个新会话传递一个唯一的会话令牌。 对多个会话使用相同的令牌将导致每个会话 请求单独计费。请注意,自动完成小部件 自动处理会话(你不需要做任何事情 额外的)。现在,让我们深入了解基本的 Javascript 示例。
这可能有点令人困惑,只是因为您正试图了解 google 文档的命名法以及这些内容的含义,并且可能是因为您以一种方式进行操作,突然您的老板或客户或其他人要求您使用会话/会话令牌代替。
如果您使用new google.maps.places.Autocomplete()
而不是AutocompleteServices
或类似的东西,那么您正在使用“自动完成小部件”。
自动完成小部件将自己处理会话/会话令牌。
证明它!
我信任 Google 和 Google 开发者文档,了解他们自己的产品以及他们如何/做什么,但网络上对此有很多困惑。所以我想要证明,除了一个月后收到账单。仅供参考 - Google Cloud Platform Console (https://console.cloud.google.com/google/maps-apis?pli=1) 中的帐单将立即向您显示这一点,并将证实以下和以上的内容。
查看开发工具中的网络活动,我们看到有一些对自动完成服务的调用。
我在这里没有使用“AutocompleteService”功能,这是一个基本示例设置,与我上面列出的回调相同,通过new google.maps.places.Autocomplete()
使用“Autocomplete Widget”。
进入页面后,首先可以看到对库的调用,下面是开发工具的第一张截图。 接下来我做了一个搜索,它有效。我开始输入 1990 年的基本地址,之后您可以看到向 API 发出的 4 个请求。我输入的每个字符都有 1 个请求/调用。这些请求名称中的每一个都以“AutocompleteServices.GetPredictions...”开头,即使我没有在我的代码中使用 AutocompleteServices。在后端,“自动完成小部件”使用“自动完成服务”并为您完成所有 UI/UX 工作以及功能、会话和令牌。这些在下面的开发工具屏幕截图 #1-#3 中。
然后您会看到对“PlaceServces.GetPlaceDetails”的第 5 个请求调用,这是我从下拉列表中选择的时候。这是下面的开发工具屏幕截图#4。 查看标题,对于每个请求,我看到了一些东西。 在底部圈出的第一件事是“令牌”。我知道我刚刚说过,Google 文档刚刚说过“自动完成小部件”处理会话令牌,敏锐的眼睛会看到这个“令牌”值对于每个请求都是不同的。它也不是谷歌推荐的“版本 4 UUID”格式,但这是一个不同的主题。标头中的这个“令牌”,不是会话令牌。这隐藏在 Google Docs 上此版本的先前版本的 5 年前的文档中,但这不再使用,并且为每个请求自动设置,并且不是会话令牌。 所以,“那么会话令牌在哪里?”你可能会问。
header中其他以1s、2s等开头的项是不同的传递的会话变量。在这种情况下,会话令牌是“20s”,后跟“自动完成小部件”自动创建的版本 4 UUID。敏锐的眼睛还会注意到,对于下面的 3 个屏幕截图,它们是相同的。页面刷新后,我有第五个屏幕截图,显示会话令牌已更改。您可以在我的代码中看到我没有指定这些内容,但是因为我使用的是“自动完成小部件”,所以它们是为我完成的。
【讨论】:
感谢您的全面回答。让我放心一点。 没问题。这让我放心,因为文档没有明确说明这一点。我自己的内心平静是我挖掘这个并发布这个的原因。所以我很高兴它让人们安心。与任何事情一样,也请自己进行测试并自己使用变量。如果有人看到不同的东西,请告诉我并纠正我。我喜欢学习,即使是从错误和错误中学习。 谢谢!这很有帮助。这意味着我不必重新发明此功能。 不错!我也对此感到困惑。只有一个问题:根据结算页面 (cloud.google.com/maps-platform/pricing/sheet),每次会话的地点详细信息中都应包含自动填充功能。自动完成请求和 getplacedetails 中的令牌不应该相同吗? 我相信它应该。我将不得不为此重新运行一些实验并获取一些屏幕截图。据我所知,这个示例和这些屏幕截图来自多个“会话”和窗口,只是为了获得尽可能多的示例等。我会试试这个并寻找这个。【参考方案2】:恐怕您在请求中看到的令牌参数不是地点自动完成会话令牌。这个参数甚至在谷歌地图平台改变之前就已经存在了。我不知道 Google 如何管理处理自动完成会话令牌,可能他们在服务器端处理它们。
文档指出自动完成小部件已实现自动会话令牌。
自动完成(Web 服务和 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
在此报告中,您将看到用于对地点自动填充请求进行计费的方法。查看 Product 列为 Places API
的行,Resource 列将显示用于计费 Autocomplete - Per Request
或 Autocomplete - Per Session
的方法。
如果您将“地点”自动完成小部件与自动会话一起使用,但此报告仅显示 Autocomplete - Per Request
的使用情况,请通过 https://console.cloud.google.com/google/maps-apis/support 联系 Google 地图技术支持
【讨论】:
【参考方案3】:如果您使用 google.maps.places.Autocomplete(input, options);它会自动添加会话令牌。
在您的 pluker 示例中,没有自动完成功能,而是新的 google.maps.places.SearchBox
【讨论】:
我可以确认,使用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
即使使用“map.places.Autocomplete”,它也会为每个请求生成不同的令牌。有人可以帮忙吗?
您好,我知道这看起来很奇怪,但这不是会话令牌,请打开您浏览器的开发工具并检查您的请求。您传递给自动完成的值,不作为键/值对发送,而是仅作为键发送,因此如果您键入“Syd”,则会有一个以 1s 开头的键,因此会有 1sSyd 在 sessionToken 的情况下,它是以 ' 开头的键20 多岁,请注意在自动完成期间它不会改变以上是关于Google Places AutoComplete 小部件正在为每个请求生成一个新的会话密钥的主要内容,如果未能解决你的问题,请参考以下文章
google.maps.places.Autocomplete 语言输出
反应:Google Places API/ Places 详细信息
如何从 google.maps.places.Autocomplete 获得超过 5 个结果?
使用 GooglePlacesAutocompleteWidget 时强制 flutter_google_places 仅显示城市
Android Google Places API,getAutocompletePredictions 返回状态“PLACES_API_ACCESS_NOT_CONFIGURED”