Unable to authenticate asynchronous requests on Matrix Routing v8 HereMaps API

戏子无情 提交于 2021-01-27 21:39:59

问题


I have a valid HereMaps API Key and I am using python requests lib to execute a GET request to a link that is returned after an async call is made. I am trying to execute it like this:

https://aws-ap-southeast-1.matrix.router.hereapi.com/v8/matrix/01187ff8-7888-4ed6-af88-c8f9be9242d7/status?apiKey={my-api-key}

Even though I have provided the proper key before to generate this link above, the result of this request above returns:

{
  "error": "Unauthorized",
  "error_description": "No credentials found"
}

How should we authenticate to check the status result for an async request on the Matrix Routing v8 API?


回答1:


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.




回答2:


Please check the documentation for the domain name to use for HERE services. For Matrix Routing you should be using matrix.route.ls.hereapi.com.

Disclosure: I'm a product manager at HERE Technologies



来源:https://stackoverflow.com/questions/65602683/unable-to-authenticate-asynchronous-requests-on-matrix-routing-v8-heremaps-api

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!