В данный момент я просто погружаюсь в воду с Crystal и в качестве упражнения пытаюсь перенести один из моих скриптов Python.
Рассматриваемый сценарий загружает «последний» PDF-файл с URL-адреса, который имеет форму: «http://somesite.com/download/latest/». При посещении этот URL-адрес автоматически перенаправляется на страницу для последней загрузки, например. «http://somesite.com/download/4563/»
Мне трудно понять, как реализовать это в Crystal, чтобы я мог получить фактический URL-адрес, на котором заканчивается перенаправление.
В Python я делаю:
currenturl = urllib.request.urlopen(latesturl)
#above will redirect to URL of format http://somesite.com/download/XXXXX/
#where XXXXX is the current d/load
endurl = currenturl.geturl()
... что дает мне конечный URL-адрес в переменной "endurl".
Но, чтение документов для «http / client» Crystal, я не вижу способа вернуть фактический URL-адрес, на котором заканчивается перенаправление. Является ли это возможным?
HTTP::Client
Crystal в настоящее время не может автоматически следовать перенаправлениям.
Обратите внимание, что вы читаете устаревшую версию документации API, текущая - https://crystal-lang.org/api/latest/HTTP/Client.html (хотя я не думаю, что произошли соответствующие изменения между 0.24.1 и 0.26.1).
Но вы можете легко получить доступ к URL-адресу перенаправления, прочитав заголовок Location
ответа HTTP:
response = HTTP::Client.get latesturl
endurl = response.headers["Location"]
Нет. Это просто получение простого значения из HTTP API. Как уже упоминалось, HTTP::Client
еще не понимает концепции перенаправления и поэтому не предоставит вам полностью квалифицированный URL-адрес.
Большой. Спасибо! Тем не менее, одна небольшая загадка:
response.headers["Location"]
возвращает относительный путь к endURL, а не полный URL. т.е. У меня/download/4563/
вместоhttp://somesite.com/download/4563/
. Ничего особенного, так как я могу сохранить домен в var и снова присоединиться к нему, но есть ли встроенный способ получить полный URL-адрес?