请帮忙解决以下问题。
当我尝试使用 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/