There are two authentication methods available to you for using HERE APIs: API key and OAuth token.
Because of the way credentials are being handled, when you make an asynchronous request, you'll need to disable automatic client redirects when using API key, as the client will not add the apiKey
parameter again to the URL it has been redirected to.
There are many solutions to this problem when using Python and requests
, and here's a complete example that might help:
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
Disclaimer: I work at HERE Technologies on Matrix Routing.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…