Как я могу избежать "/" в URI для запроса GET?
Я пытаюсь использовать Groovy для написания GET-запроса на наш сервер GitLab для получения файла. Формат API URI:
https://githost/api/v4/projects/<namespace>%2F<repo>/files/<path>?ref=<branch>
Обратите внимание, что между пространством имен и репо существует закодированный символ '/'. Конечный URI должен выглядеть следующим образом для правильной работы:
https://githost/api/v4/projects/mynamespace%2Fmyrepo/files/myfile.json?ref=master
У меня есть следующий код:
File f = HttpBuilder.configure {
request.uri.scheme = scheme
request.uri.host = host
request.uri.path = "/api/v4/projects/${apiNamespace}%2F${apiRepoName}/repository/files/${path}/myfile.json"
request.uri.query.put("ref", "master")
request.contentType = 'application/json'
request.accept = 'application/json'
request.headers['PRIVATE-TOKEN'] = apiToken
ignoreSslIssues execution
}.get {
Download.toFile(delegate as HttpConfig, new File("${dest}/myfile.json"))
}
Тем не менее,% 2F перекодируется как%252F. Я пробовал несколько способов создать URI, чтобы он не кодировал% 2F между пространством имен и репо, но у меня ничего не получается. Он либо перекодирует '%', либо декодирует его в литерал "/".
Как мне сделать это с помощью Groovy + http-builder-ng, чтобы установить URI таким образом, чтобы сохранить закодированный символ "/"? Я искал, но не могу найти примеры, которые сработали.
Спасибо!
2 ответа
Начиная с версии 1.0.0 вы можете обрабатывать запросы с закодированными символами в URI. Примером может быть:
def result = HttpBuilder.configure {
request.raw = "http://localhost:8080/projects/myteam%2Fmyrepo/myfile.json"
}.get()
Обратите внимание, использование raw
скорее, чем uri
в примере. Использование этого подхода требует от вас любого другого кодирования / декодирования Uri самостоятельно.
Возможное решение
Gitlab API позволяет выполнять запросы через идентификатор проекта или имя проекта. Сначала найдите идентификатор проекта, затем запросите проект.
Сначала найдите идентификатор проекта. См. https://docs.gitlab.com/ee/api/projects.html.
def projects = // GET / projects
def project = projects.find {it ['path_with_namespace'] == 'диаспора / диаспора-клиент' }
Получить проект по:id, см. https://docs.gitlab.com/ee/api/projects.html
GET /projects/$‹project.id}