Кодирование файла GPX таким образом, чтобы оно принималось конечной точкой / matchroute API Here - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь вызвать ресурс /matchroute через запрос GET.Однако я не могу понять, как кодировать файл GPX, чтобы ресурс принимал мой запрос: я всегда получаю HTTP-ошибку 400 в качестве ответа от сервера Here.

В качестве примерных данных я использовал следующий файл:

<?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-ошибкой 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.Однако я сам не мог понять, как воспроизвести эту кодировку, чтобы я мог соответствующим образом кодировать свои собственные данные.

Ссылка на определение API Here: https://developer.here.com/documentation/route-match/topics/resource-matchroute-request.html

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

У меня была точно такая же проблема.

Документация кажется неполной. Вы можете проверить здесь для получения дополнительной информации. Несколько способов я решил это:

  • Используйте 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()
))
0 голосов
/ 15 ноября 2018

Глядя на две строки base64, я могу сказать вам фундаментальное различие между ними - первая (которая не работает) - без экранирования , тогда как вторая (которая работает) - .

Вы можете выполнить конвертацию между двумя форматами вручную с помощью различных онлайн-инструментов, таких как this .Экранированная версия нерабочей строки base64, на случай, если вы хотите ее протестировать, выглядит так:

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

Я не эксперт в этом, но, как я понимаю, вам нужно кодировать URLСтроки, только если вы хотите вставить их как есть в веб-путь вашего браузера (читайте о «Параметрах URL»).Если вы правильно строите свои HTTP-запросы ™ (под этим я подразумеваю правильное указание заголовков запроса и пар ключ-значение), вам вообще не нужно беспокоиться о кодировке URL,поскольку используемый вами инструмент (в данном случае MATLAB) должен позаботиться о преобразовании за вас.

К сожалению, я не могу проверить эту теорию, поскольку у меня нет доступа к обсуждаемому API - но яЯ вполне уверен, что это решит вашу проблему.

...