1

我正在尝试/matchroute通过 GET 请求调用资源。但是,我不知道如何对 GPX 文件进行编码,以便资源接受我的请求:我总是收到来自 Here 服务器的 HTTP 错误 400 作为响应。

作为示例数据,我使用了以下文件:

<?xml version="1.0"?>
<gpx version="1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.topografix.com/GPX/1/0"
xsi:schemaLocation="http://www.topografix.com/GPX/1/0 
http://www.topografix.com/GPX/1/0/gpx.xsd">
  <trk>
    <trkseg>
      <trkpt lat="51.10177" lon="0.39349"/>
      <trkpt lat="51.10181" lon="0.39335"/>
      <trkpt lat="51.10255" lon="0.39366"/>
      <trkpt lat="51.10398" lon="0.39466"/>
      <trkpt lat="51.10501" lon="0.39533"/>
    </trkseg>
  </trk>
</gpx>

我从这个例子中得到的。

我使用 MATLAB 的函数对该文件进行了编码,该函数matlab.net.base64encode产生了以下 base64 编码的字符串:

PD94bWwgdmVyc2lvbj0iMS4wIj8+PGdweCB2ZXJzaW9uPSIxLjAieG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8y
MDAxL1hNTFNjaGVtYS1pbnN0YW5jZSJ4bWxucz0iaHR0cDovL3d3dy50b3BvZ3JhZml4LmNvbS9HUFgvMS8wInhzaTpz
Y2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy50b3BvZ3JhZml4LmNvbS9HUFgvMS8wIGh0dHA6Ly93d3cudG9wb2dyYWZp
eC5jb20vR1BYLzEvMC9ncHgueHNkIj48dHJrPjx0cmtzZWc+PHRya3B0IGxhdD0iNTEuMTAxNzciIGxvbj0iMC4zOTM0
OSIvPjx0cmtwdCBsYXQ9IjUxLjEwMTgxIiBsb249IjAuMzkzMzUiLz48dHJrcHQgbGF0PSI1MS4xMDI1NSIgbG9uPSIw
LjM5MzY2Ii8+PHRya3B0IGxhdD0iNTEuMTAzOTgiIGxvbj0iMC4zOTQ2NiIvPjx0cmtwdCBsYXQ9IjUxLjEwNTAxIiBs
b249IjAuMzk1MzMiLz48L3Rya3NlZz48L3Ryaz48L2dweD4=

但是,如前所述,HERE 服务器始终以 HTTP-error 400 响应我的请求

https://rme.api.here.com/2/matchroute.json?app_id={app_id}&app_code={app_code}&routemode=car&file=...

其中 "..." 等于上面提到的 base64 编码字符串。

问题:谁能提供一个代码示例,展示如何正确编码上述 GPX 文件(最好是 MATLAB 语言),以便/matchroute资源能够响应?


评论:

如果我使用 base64 字符串

UEsDBBQAAAAIANmztEQSwaeZzwAAAM8BAAAQAAAAc2FtcGxlLXRyYWNlLmdweIXPTQuCMBwG8HufQnZv%2F605S0k9dj
EIungdZjpSJ27kPn6%2BRBgYXcYYv2cPzzG2deU8805L1YSIYoLiaHMsWvv9uBlYowOrZYhKY9oAoO973DOsugJ2hFBI
z8k1K%2FNabGWjjWiy%2FJ36ShjVqqITd2lxpmo4XVKgMP6vZaCneKIyYabivzHnr4BhCbb6hoZRpnvMp86L%2BdIapx
ImRJxiSuh%2Bj5xq7CWY%2Bcz1EaypA10qxlfVjvOl8rxVxfzDQrk%2FFCfLRs7YpOCzA%2BZd49LoBVBLAQIUABQAAA
AIANmztEQSwaeZzwAAAM8BAAAQAAAAAAAAAAEAIAAAAAAAAABzYW1wbGUtdHJhY2UuZ3B4UEsFBgAAAAABAAEAPgAAAP
0AAAAAAA%3D%3D

此示例中,GET 请求有效。但是,我无法弄清楚如何自己重现这种编码,以便能够相应地对自己的数据进行编码。

链接到 Here API 定义:https ://developer.here.com/documentation/route-match/topics/resource-matchroute-request.html

4

2 回答 2

0

看看这两个 base64 字符串,我可以告诉你它们之间的根本区别——第一个(不起作用)是未转义的,而第二个(起作用).

您可以使用诸如此类的各种在线工具手动在两种格式之间进行转换。如果您想测试它,非工作 base64 字符串的转义版本是:

PD94bWwgdmVyc2lvbj0iMS4wIj8+PGdweCB2ZXJzaW9uPSIxLjAieG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8y
%0AMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSJ4bWxucz0iaHR0cDovL3d3dy50b3BvZ3JhZml4LmNvbS9HUFgvMS8wInhza
Tpz%0AY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy50b3BvZ3JhZml4LmNvbS9HUFgvMS8wIGh0dHA6Ly93d3cudG9wb2
dyYWZp%0AeC5jb20vR1BYLzEvMC9ncHgueHNkIj48dHJrPjx0cmtzZWc+PHRya3B0IGxhdD0iNTEuMTAxNzciIGxvbj0
iMC4zOTM0%0AOSIvPjx0cmtwdCBsYXQ9IjUxLjEwMTgxIiBsb249IjAuMzkzMzUiLz48dHJrcHQgbGF0PSI1MS4xMDI1
NSIgbG9uPSIw%0ALjM5MzY2Ii8+PHRya3B0IGxhdD0iNTEuMTAzOTgiIGxvbj0iMC4zOTQ2NiIvPjx0cmtwdCBsYXQ9I
jUxLjEwNTAxIiBs%0Ab249IjAuMzk1MzMiLz48L3Rya3NlZz48L3Ryaz48L2dweD4%3D

我不是这方面的专家,但据我所知,只有当您想将字符串按原样粘贴到浏览器的 Web 路径中时,您才需要对字符串进行 URL 编码(请阅读“URL 参数”)。如果您以正确的方式构建 HTTP 请求™(我的意思是正确指定请求的标头和键值对),您根本不必担心 URL 编码,因为您使用的工具重新使用(在这种情况下,MATLAB)应该为您处理转换。

不幸的是,我无法测试这个理论,因为我无法访问所讨论的 API - 但我相当肯定这会解决您的问题。

于 2018-11-15T19:50:02.997 回答
0

我有同样的问题。

文档似乎不完整。您可以在此处查看更多信息。我解决了这个问题的几种方法:

  • 在参数中使用 filetype='CSV' 或 filtetype='GPX'。它说如果通过则猜测文件类型,这实际上是不正确的。传递 XML 文件后,API 告诉我我的文件看起来不像“CSV”
  • 压缩是可选的,我建议完全避免它我也找不到合适的压缩。它适用于普通的 base64 编码。
  • 我建议实际使用 CSV,因为 XML 实际上会返回解析错误。

在蟒蛇

data='''latitude,longitude
51.10177,0.39349
'''

r = requests.get('https://rme.api.here.com/2/matchroute.json?app_id={APP_ID}&app_code={APP_CODE}&routemode=car&file={file}&filetype={filetype}'.format(
      APP_ID=os.getenv('HERE_APP_ID'),
      APP_CODE=os.getenv('HERE_APP_CODE'),
      filetype='CSV',
      file=base64.b64encode(data.encode()).decode()
))
于 2019-06-14T07:34:53.263 回答