java - Gitlab API下载文件+RestTemplate

标签 java spring-boot gitlab resttemplate

请帮忙解决以下问题。

当我尝试使用 Postman 或curl 向 gitlab 发出请求时一切正常,我得到了文件的答案

curl --header "PRIVATE-TOKEN: xxxxxxxx" "https://gitlabXXXX/api/v4/projects/13/repository/files/src%2Fcom%2Fgre%2Fjenkins%2FConstants.groovy?ref=foo"

但是当我尝试在代码中执行相同操作时,我收到错误消息 =“404 文件未找到”

    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.set("PRIVATE-TOKEN", "xxxxxxx");
    System.out.println(restTemplate.exchange("https://gitlabXXXX/api/v4/projects/13/repository/files/src%2Fcom%2Fgre%2Fjenkins%2FConstants.groovy?ref=foo", HttpMethod.GET, new HttpEntity<>(httpHeaders), String.class).getBody());

为什么不起作用?也许 RestTempate 中的某些内容更改了 URL,或者我不知道...

最佳答案

RestTemplate 再次对您的 URL 进行编码,因此您的请求 URL 为:

https://gitlabXXXX/api/v4/projects/13/repository/files/src%252Fcom%252Fgre%252Fjenkins%252FConstants.groovy?ref=foo

所以你的 % 变成了 %25 而这不是 gitlab API 正在等待的。

解决方案

您可以使用 UriComponentsBuilder.build(true) 方法来告诉您的 URI 已经编码:

String gitlabUriString = "https://gitlabXXXX/api/v4/projects/13/repository/files/src%2Fcom%2Fgre%2Fjenkins%2FConstants.groovy?ref=foo";

// true in build(true) tells parameters are already encoded
URI gitlabUri = UriComponentsBuilder.fromHttpUrl(gitlabUriString)
    .build(true).toUri();

System.out.println(restTemplate.exchange(gitlabUri, HttpMethod.GET, new HttpEntity<>(httpHeaders), String.class).getBody());

关于java - Gitlab API下载文件+RestTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64846578/

相关文章:

git - 在 Gitlab 中设置最小问题号

Java:列出开始日期和结束日期之间的日期

java - 无法使用 jsoup 找到 div 元素

Java 正则表达式拆分具有未知数量空格的数字

java - 如何使用Spring Boot + Mybatis连接池

c# - 从蛋糕脚本中将警告消息记录在文本文件中

javascript - Java Android - 从 WebView 获取图像

java - 使用 PCF 用户提供的服务创建数据源失败

Spring Boot 2 公共(public)客户端授权服务器 (PKCE)

ubuntu - 禁用 nginx 后 GitLab 403 错误