如何正确使用会话令牌?
How to use session tokens correctly?
我正在为 Google 个地点使用 Java 客户端 API:
<dependency>
<groupId>com.google.maps</groupId>
<artifactId>google-maps-services</artifactId>
<version>0.9.1</version>
</dependency>
以下是我在我的服务器上使用自动完成 API 的方式:
public List<AutocompletePrediction> searchAddress(String query) {
List<AutocompletePrediction> predictions = new ArrayList<>();
try {
AutocompletePrediction[] autocompletePredictions = PlacesApi
.placeAutocomplete(geoApiContext, query, null)
predictions.addAll(Arrays.asList(autocompletePredictions));
} catch (ApiException | InterruptedException | IOException e) {
e.printStackTrace();
}
return predictions;
}
现在,我将 null
作为 sessionToken
:
.placeAutocomplete(geoApiContext, query, null)
主要是因为我不完全确定这些应该如何工作。
我可以每 2 分钟创建一个 一个 令牌并使用该令牌,无论哪个用户当前正在输入。
所以这意味着如果两个用户搜索 "location" 和 "place",传入的查询可能如下所示:
[User 1] 1. lo
[User 2] 2. p
[User 1] 3. loca
[User 2] 4. plac
[User 1] 5. locat
[User 1] 6. location
[User 2] 7. place
现在,我可以对所有这些请求使用相同的令牌 X
并每隔一两分钟创建一个新令牌,但我不知道这是否被允许以及这是否会影响计费。
另一种方法是为每个用户创建一个缓存,它分别为用户 1
和 2
存储令牌 X1
和 X2
。这个解决方案会稍微复杂一些,这就是为什么我想知道第一个解决方案是否已经起作用,因为我不会为每个请求都付费。
文档
您应该使用 session 令牌,因为它们确实会影响计费。根据Google's documentation:
If the sessiontoken
parameter is omitted, or if you reuse a session
token, the session is charged as if no session token was provided.
使用 session 令牌的请求示例:
https://maps.googleapis.com/maps/api/place/autocomplete/json?input=1600+Amphitheatre&key=<API_KEY>&sessiontoken=1234567890
请按照链接文档中的建议为每个自动完成 session 创建一个新的且唯一的 session 标记。
进一步澄清 sessions:
A session token is good for one user session and should not be used
for more than one user session.
A session 在用户开始输入查询时开始,并在他们 select 一个地方时结束(即当 Place Details call is made). This is billed on the Autocomplete (included with Places Details) – Per Session SKU.
如果这个用户没有进行select离子,session将在短暂的超时后结束(即几分钟内) session 的开头)。这是在 Autocomplete without Places Details – Per Session SKU.
上计费的
如果您不使用 session 令牌或它被视为无效,您将在 Autocomplete – Per Request SKU 上付费。
希望对您有所帮助。
我正在为 Google 个地点使用 Java 客户端 API:
<dependency>
<groupId>com.google.maps</groupId>
<artifactId>google-maps-services</artifactId>
<version>0.9.1</version>
</dependency>
以下是我在我的服务器上使用自动完成 API 的方式:
public List<AutocompletePrediction> searchAddress(String query) {
List<AutocompletePrediction> predictions = new ArrayList<>();
try {
AutocompletePrediction[] autocompletePredictions = PlacesApi
.placeAutocomplete(geoApiContext, query, null)
predictions.addAll(Arrays.asList(autocompletePredictions));
} catch (ApiException | InterruptedException | IOException e) {
e.printStackTrace();
}
return predictions;
}
现在,我将 null
作为 sessionToken
:
.placeAutocomplete(geoApiContext, query, null)
主要是因为我不完全确定这些应该如何工作。
我可以每 2 分钟创建一个 一个 令牌并使用该令牌,无论哪个用户当前正在输入。
所以这意味着如果两个用户搜索 "location" 和 "place",传入的查询可能如下所示:
[User 1] 1. lo
[User 2] 2. p
[User 1] 3. loca
[User 2] 4. plac
[User 1] 5. locat
[User 1] 6. location
[User 2] 7. place
现在,我可以对所有这些请求使用相同的令牌 X
并每隔一两分钟创建一个新令牌,但我不知道这是否被允许以及这是否会影响计费。
另一种方法是为每个用户创建一个缓存,它分别为用户 1
和 2
存储令牌 X1
和 X2
。这个解决方案会稍微复杂一些,这就是为什么我想知道第一个解决方案是否已经起作用,因为我不会为每个请求都付费。
文档
您应该使用 session 令牌,因为它们确实会影响计费。根据Google's documentation:
If the
sessiontoken
parameter is omitted, or if you reuse a session token, the session is charged as if no session token was provided.
使用 session 令牌的请求示例:
https://maps.googleapis.com/maps/api/place/autocomplete/json?input=1600+Amphitheatre&key=<API_KEY>&sessiontoken=1234567890
请按照链接文档中的建议为每个自动完成 session 创建一个新的且唯一的 session 标记。
进一步澄清 sessions:
A session token is good for one user session and should not be used for more than one user session.
A session 在用户开始输入查询时开始,并在他们 select 一个地方时结束(即当 Place Details call is made). This is billed on the Autocomplete (included with Places Details) – Per Session SKU.
如果这个用户没有进行select离子,session将在短暂的超时后结束(即几分钟内) session 的开头)。这是在 Autocomplete without Places Details – Per Session SKU.
上计费的如果您不使用 session 令牌或它被视为无效,您将在 Autocomplete – Per Request SKU 上付费。
希望对您有所帮助。