我如何逃避' /'在GET请求的URI中?

时间:2017-09-06 23:04:40

标签: groovy httpbuilder-ng

我试图使用Groovy编写GET请求到我们的GitLab服务器来检索文件。 API URI格式为:

https://githost/api/v4/projects/<namespace>%2F<repo>/files/<path>?ref=<branch>

请注意,有一个编码的&#39; /&#39;在命名空间和repo之间。最终的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,这样它就不会在命名空间和repo之间编码%2F,但我无法正常工作。它要么重新编码&#39;%&#39;或将其解码为文字&#34; /&#34;。

如何使用Groovy + http-builder-ng来设置URI,以保留编码的&#34; /&#34;?我已经搜索过但无法找到任何有用的示例。

谢谢!

2 个答案:

答案 0 :(得分:1)

从1.0.0版本开始,您可以处理URI中带有编码字符的请求。一个例子是:

def result = HttpBuilder.configure {
    request.raw = "http://localhost:8080/projects/myteam%2Fmyrepo/myfile.json"
}.get()

注意,在示例中使用raw而不是uri。使用这种方法需要您自己对Uri进行任何其他编码/解码。

答案 1 :(得分:0)

可能的解决方法

Gitlab API允许您通过项目ID或项目名称进行查询。首先查找项目ID,然后查询项目。

  1. 首先查找项目ID。见https://docs.gitlab.com/ee/api/projects.html#list-all-projects

    def projects = // GET / projects

    def project = projects.find {it [&#39; path_with_namespace&#39;] ==&#39; diaspora / diaspora-client&#39; }

  2. 获取项目:id,请参阅https://docs.gitlab.com/ee/api/projects.html#get-single-project

    GET / projects / $ {project.id}