无法验证 Matrix Routing v8 HereMaps 上的异步请求 API
Unable to authenticate asynchronous requests on Matrix Routing v8 HereMaps API
我有一个有效的 HereMaps API 密钥,我正在使用 python requests
库执行对异步调用后返回的 link 的 GET 请求制成。我正在尝试像这样执行它:
即使我之前提供了正确的密钥来生成上面的 link,上面这个请求的结果 returns:
{
"error": "Unauthorized",
"error_description": "No credentials found"
}
我们应该如何验证以检查 Matrix Routing v8 上异步请求的状态结果API?
请检查documentation for the domain name to use for HERE services。对于矩阵路由,您应该使用 matrix.route.ls.hereapi.com
.
披露:我是 HERE Technologies 的产品经理
有两种身份验证方法available to you for using HERE APIs:API 密钥和 OAuth 令牌。
由于凭据的处理方式,当您发出异步请求时,您需要在使用 API 键时禁用自动客户端重定向,因为客户端不会添加 apiKey
参数再次传递给它已重定向到的 URL。
当使用 Python 和 requests
时,这个问题有很多解决方案,这里有一个可能有用的完整示例:
import requests, time
api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# "Profile mode (car fastest)" example request
request = {
"origins": [{"lat": 52.5309, "lng": 13.3849}, {"lat": 54.0924, "lng": 12.0991}],
"destinations": [
{"lat": 51.3397, "lng": 12.3731},
{"lat": 51.0504, "lng": 13.7373},
],
"regionDefinition": {"type": "world"},
"profile": "carFast",
}
# Using a Session object allows you to persist certain parameters accross requests
# see: https://requests.readthedocs.io/en/master/user/advanced/
session = requests.Session()
# Add `?apiKey=xxxxxx` to all requests
session.params = {"apiKey": api_key}
# Raise an exception for any non 2xx or 3xx HTTP return codes
session.hooks = {"response": lambda r, *args, **kwargs: r.raise_for_status()}
# Send an asynchronous request, see: https://developer.here.com/documentation/matrix-routing-api/8.3.0/dev_guide/topics/get-started/asynchronous-request.html
status_response = session.post(
"https://matrix.router.hereapi.com/v8/matrix", json=request
).json()
# Polling for the job status for 100 times
# You might want to use exponential back-off instead of time.sleep
for _ in range(0, 100):
# do not follow the redirect here
status_response = session.get(
status_response["statusUrl"], allow_redirects=False
).json()
if status_response["status"] == "completed":
# download the result
matrix_response = session.get(status_response["resultUrl"]).json()
print(matrix_response)
break
elif status_response["accepted"] or status_response["inProgress"]:
continue
else:
print(f"An error occured: {status_response}")
break
time.sleep(0.5) # sleep for 500 ms
免责声明:我在 HERE Technologies 从事矩阵路由方面的工作。
我有一个有效的 HereMaps API 密钥,我正在使用 python requests
库执行对异步调用后返回的 link 的 GET 请求制成。我正在尝试像这样执行它:
即使我之前提供了正确的密钥来生成上面的 link,上面这个请求的结果 returns:
{
"error": "Unauthorized",
"error_description": "No credentials found"
}
我们应该如何验证以检查 Matrix Routing v8 上异步请求的状态结果API?
请检查documentation for the domain name to use for HERE services。对于矩阵路由,您应该使用 matrix.route.ls.hereapi.com
.
披露:我是 HERE Technologies 的产品经理
有两种身份验证方法available to you for using HERE APIs:API 密钥和 OAuth 令牌。
由于凭据的处理方式,当您发出异步请求时,您需要在使用 API 键时禁用自动客户端重定向,因为客户端不会添加 apiKey
参数再次传递给它已重定向到的 URL。
当使用 Python 和 requests
时,这个问题有很多解决方案,这里有一个可能有用的完整示例:
import requests, time
api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# "Profile mode (car fastest)" example request
request = {
"origins": [{"lat": 52.5309, "lng": 13.3849}, {"lat": 54.0924, "lng": 12.0991}],
"destinations": [
{"lat": 51.3397, "lng": 12.3731},
{"lat": 51.0504, "lng": 13.7373},
],
"regionDefinition": {"type": "world"},
"profile": "carFast",
}
# Using a Session object allows you to persist certain parameters accross requests
# see: https://requests.readthedocs.io/en/master/user/advanced/
session = requests.Session()
# Add `?apiKey=xxxxxx` to all requests
session.params = {"apiKey": api_key}
# Raise an exception for any non 2xx or 3xx HTTP return codes
session.hooks = {"response": lambda r, *args, **kwargs: r.raise_for_status()}
# Send an asynchronous request, see: https://developer.here.com/documentation/matrix-routing-api/8.3.0/dev_guide/topics/get-started/asynchronous-request.html
status_response = session.post(
"https://matrix.router.hereapi.com/v8/matrix", json=request
).json()
# Polling for the job status for 100 times
# You might want to use exponential back-off instead of time.sleep
for _ in range(0, 100):
# do not follow the redirect here
status_response = session.get(
status_response["statusUrl"], allow_redirects=False
).json()
if status_response["status"] == "completed":
# download the result
matrix_response = session.get(status_response["resultUrl"]).json()
print(matrix_response)
break
elif status_response["accepted"] or status_response["inProgress"]:
continue
else:
print(f"An error occured: {status_response}")
break
time.sleep(0.5) # sleep for 500 ms
免责声明:我在 HERE Technologies 从事矩阵路由方面的工作。