Кодирование файла GPX таким образом, чтобы оно принималось конечной точкой /matchroute API Here
Я пытаюсь вызвать ресурс /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
1 ответ
Глядя на две строки base64, я могу сказать вам фундаментальное различие между ними: первая (которая не работает) не экранирована, а вторая (которая работает) есть.
Вы можете конвертировать между двумя форматами вручную, используя различные онлайн-инструменты, такие как этот. Экранированная версия нерабочей строки base64, на случай, если вы захотите ее протестировать:
PD94bWwgdmVyc2lvbj0iMS4wIj8+PGdweCB2ZXJzaW9uPSIxLjAieG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8y
%0AMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSJ4bWxucz0iaHR0cDovL3d3dy50b3BvZ3JhZml4LmNvbS9HUFgvMS8wInhza
Tpz%0AY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy50b3BvZ3JhZml4LmNvbS9HUFgvMS8wIGh0dHA6Ly93d3cudG9wb2
dyYWZp%0AeC5jb20vR1BYLzEvMC9ncHgueHNkIj48dHJrPjx0cmtzZWc+PHRya3B0IGxhdD0iNTEuMTAxNzciIGxvbj0
iMC4zOTM0%0AOSIvPjx0cmtwdCBsYXQ9IjUxLjEwMTgxIiBsb249IjAuMzkzMzUiLz48dHJrcHQgbGF0PSI1MS4xMDI1
NSIgbG9uPSIw%0ALjM5MzY2Ii8+PHRya3B0IGxhdD0iNTEuMTAzOTgiIGxvbj0iMC4zOTQ2NiIvPjx0cmtwdCBsYXQ9I
jUxLjEwNTAxIiBs%0Ab249IjAuMzk1MzMiLz48L3Rya3NlZz48L3Ryaz48L2dweD4%3D
Я не эксперт в этом, но, как я понимаю, вам нужно кодировать строки URL только тогда, когда вы хотите вставить их как есть в веб-путь вашего браузера (читайте о "Параметрах URL"). Если вы правильно строите свои HTTP-запросы ™ (под этим я подразумеваю правильное указание заголовков запроса и пар ключ-значение), вам не нужно беспокоиться об URL-кодировании вообще, так как инструмент, который вы ' Повторное использование (в данном случае MATLAB) должно позаботиться о преобразовании для вас.
К сожалению, я не могу проверить эту теорию, поскольку у меня нет доступа к обсуждаемому API - но я вполне уверен, что это решит вашу проблему.
У меня была точно такая же проблема.
Документация кажется неполной. Вы можете проверить здесь для получения дополнительной информации. Несколько способов я решил это:
- Используйте 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()
))