Как я могу избежать "/" в 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 позволяет выполнять запросы через идентификатор проекта или имя проекта. Сначала найдите идентификатор проекта, затем запросите проект.

  1. Сначала найдите идентификатор проекта. См. https://docs.gitlab.com/ee/api/projects.html.

    def projects = // GET / projects

    def project = projects.find {it ['path_with_namespace'] == 'диаспора / диаспора-клиент' }

  2. Получить проект по:id, см. https://docs.gitlab.com/ee/api/projects.html

    GET /projects/$‹project.id}

Другие вопросы по тегам