如何使用 HERE 中的异步矩阵路由 API v8 来获取包括交通在内的行程时间响应

Posted

技术标签:

【中文标题】如何使用 HERE 中的异步矩阵路由 API v8 来获取包括交通在内的行程时间响应【英文标题】:How to use asynchronous Matrix Routing API v8 from HERE to get travel time response including traffic 【发布时间】:2021-01-28 00:01:39 【问题描述】:

我正在关注一组节点(双向)之间的行程时间,包括交通。在旧版本的 API (7.2) 中,我将在 Python 中使用以下代码来请求:

    payload = 
        "apiKey": "API_KEY_HERE",
        "start0": "-33.795602,151.185366",
        "start1": "-33.865103,151.205627",
        "destination0": "-33.795602,151.185366",
        "destination1": "-33.865103,151.205627",
        "mode": "fastest;car;traffic:enabled",
        "departure": "2020-10-27T08:00:00+11",
        "summaryattributes": "all"
    
    base_url = "https://matrix.route.ls.hereapi.com/routing/7.2/calculatematrix.json?"
    r = requests.get(base_url, params=payload)
    print(r.json())

新版本的例子更少,老实说我对 POST 和异步响应不是很熟悉。

为什么要换新版本?好吧,您似乎只能提供一组原始节点/位置,然后将计算一个矩阵(在后台),一旦准备好就可以使用 GET 请求拉取它。没有指定 start0, start1, ..etc

版本 8 的新尝试:

步骤:

    请求矩阵 (POST) 状态轮询 (GET) 准备就绪后下载结果 (GET)
# 1. Request matrix (POST)
    base_url = "https://matrix.router.hereapi.com/v8/matrix?"
    params = "apiKey": "MY_API_KEY_HERE",
              "async": "true",
              "departureTime": "2020-10-27T08:00:00+11"
    payload = "origins": ["lat": -33.759688, "lng": 151.156369, "lat": -33.865189, "lng": 151.208162,
                           "lat": -33.677066, "lng": 151.302117],
               "regionDefinition": "type": "autoCircle", "margin": 10000,
               "matrixAttributes": ["travelTimes", "distances"]
    headers = 'Content-Type': 'application/json'
    r = requests.post(base_url, params=params, json=payload, headers=headers)
    response = r.json()
    
    # pretty print
    print(json.dumps(response, indent=4))

这给出了“接受”状态:

    // Example response
    
        "matrixId": "eba6780c-0379-40f1-abaf-5c62d07dabb4",
        "status": "accepted",
        "statusUrl": "https://aws-eu-west-1.matrix.router.hereapi.com/v8/matrix/eba6780c-0379-40f1-abaf-5c62d07dabb4/status"
    

然后我使用 statusUrl 和我的 apiKey 来轮询状态。这就是我卡住的地方。我应该如何进行身份验证?我不确定身份验证应该如何工作。第 1 步中的身份验证有效。

# 2. Poll for status (GET)
    time.sleep(3)
    statusUrl = response['statusUrl']
    params = 'apiKey': 'MY_API_KEY_HERE'
    headers = 'Content-Type': 'application/json'
    r = requests.get(statusUrl, params=params, headers=headers)
    response = r.json()
    
    # pretty print
    print(json.dumps(response, indent=4))

写“MY_API_KEY_HERE”的地方我输入了我的 apiKey。回应:


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

显然,使用身份验证存在错误。应该如何使用身份验证?是否可以显示检查已提交矩阵计算状态的成功请求是什么样的下载此类矩阵的请求在 Python 中是什么样的(使用 gzip 轮询状态后的下一步标题)?

欢迎任何指点。

【问题讨论】:

您是否设法对异步请求进行身份验证?? 在第二步获取 statusUrl 时,使用 apiKey 进行异步授权时遇到了同样的问题。我能找到的唯一解决方案(此时)是完全切换到不记名令牌。 您能否分享正确的代码以使用 POST 执行请求?我在 Python 中使用这个 API 时也遇到了问题。 【参考方案1】:

看起来根据文档,当您提供出发时间时,他们不再考虑实时流量 - 不过我不确定历史。因此,如果您需要考虑实时流量,则必须删除出发时间。

这将计算行程时间,包括交通时间: 方法网址:https://matrix.router.hereapi.com/v8/matrix?apiKey=API_KEY&async=false

方法:POST

主体:


    "origins": [
        
            "lat": 47.673993,
            "lng": -122.356108
        ,
        
            "lat": 47.656910,
            "lng": -122.362823
        ,
        
            "lat": 47.648015,
            "lng": -122.335674
        ,
        
            "lat": 47.653022,
            "lng": -122.312461
        ,
        
            "lat":47.675796,
            "lng": -122.311520
        
    ],
    "destinations": [
        
            "lat": 47.661438,
            "lng": -122.336427
        
    ],
    "regionDefinition": 
        "type": "world"
    

【讨论】:

很好的答案,它有助于看到我不知道区分 URL 中的 parameters 和正文中的 JSON。但是,要获得包括交通在内的旅行时间,不能使用 regionDeftion "world"。根据定义,出发时间是“任何”,这使得它对交通不敏感。为了反映新问题,我将更新最初的问题。

以上是关于如何使用 HERE 中的异步矩阵路由 API v8 来获取包括交通在内的行程时间响应的主要内容,如果未能解决你的问题,请参考以下文章

图解 Google V8 # 18 :异步编程:V8是如何实现微任务的?

HERE Api - 使用 iOS/Android SDK 和 REST API 的不同路由结果

如何在V8中优化JavaScript异步编程?

Promise杂记

为Node.js编写组件的几种方式

Laravel v8.15.0 (PHP v7.3.23) 共享服务器上的移动应用程序 API POST 路由不起作用