[TOC]
如何通过Gitlab的API接口获取远程仓库中的文件内容
在一些实际情况中,希望能够直接像读取本地文件一样读取远程仓库中的文件内容,避免git操作失败的情况下读取的本地缓存的文件内容。由于项目使用gitLab管理配置文件,查询了GitLabApi,其提供了诸多API接口,包括常见的git操作、项目管理以及我们需要的获取文件内容等接口。
GitLab获取仓库中文件内容的API文档(https://docs.gitlab.com/ee/api/repository_files.html#get-file-from-repository)
格式说明:1
2
3
4
5# 请求格式
GET /projects/:id/repository/files/:file_path
# 请求实例
curl --request GET --header 'PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK' 'https://gitlab.example.com/api/v4/projects/{项目ID}/repository/files/app%2Fmodels%2Fkey%2Erb?ref=master'
通过分析可以发现,如果想获取仓库中文件内容,需要以下几个要素:
仓库地址
项目id
用户的private token
经过url编码的文件全路径
文件所在的分支
private static String GITLAB_FILECONTENT_API = “http://#{REPO_IP}/api/v3/projects/#{PROJECT_ID}/repository/files?private_token=#{PRIVATE_TOKEN}&file_path=#{FILE_PATH}&ref=#{BRANCH_NAME}”;
1 | // 获取用户的private token |
需要特别注意,在方法中对配置好的project path进行url编码后,没有直接使用RestTemplate创建get请求获取项目信息,因为实践中发现会出现将本义编码好的如:src%2FHelloWorld.java变为:src%256FHelloWorld.java,具体没有深入RestTemplate源码,所以直接创建URI对象,避免这种情况出现。
5.1 替换参数工具类
对#{}包裹的参数进行替换,代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40public class PlaceholderUtil {
/** 默认替换形如#{param}的占位符 */
private static Pattern pattern = Pattern.compile("\\#\\{.*?\\}");
/**
* 替换字符串中形如#{}的占位符
* @param src
* @param parameters
* @return
*/
public static String replace(String src, Map<String, Object> parameters) {
Matcher paraMatcher = pattern.matcher(src);
// 存储参数名
String paraName = "";
String result = new String(src);
while (paraMatcher.find()) {
paraName = paraMatcher.group().replaceAll("\\#\\{", "").replaceAll("\\}", "");
Object objParam = parameters.get(paraName);
if(objParam!=null){
result = result.replace(paraMatcher.group(), objParam.toString());
}
}
return result;
}
/**
* 替换字符串中形如#{}的占位符
* @param src
* @param parameters
* @return
*/
public static String anotherReplace(String str, Map<String, String> params) {
Map<String, Object> newParams = new HashMap<>(params);
return replace(str, newParams);
}
}
5.2 测试类:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65public class GitLabAPIUtilsTest {
String repoIp;
String privateToken;
String projectPath1;
String projectPath2;
String userName;
String password;
String fileFullPath;
String branchName;
public void setUp() throws Exception {
repoIp = "gitlab仓库ip";
projectPath1 = "acountting/accounting-config-repo";
projectPath2 = "acountting/csv-filefront-cloud";
userName = "用户名";
password="密码";
fileFullPath = "/apps/cmup-clearing/0055-account.config";
branchName = "develop";
}
public void tearDown() throws Exception {
repoIp = null;
projectPath1 = null;
projectPath2 = null;
userName = null;
password = null;
fileFullPath = null;
branchName = null;
}
public void testGetProjectId() {
String privateToken = GitLabAPIUtils.getPrivateTokenByPassword(repoIp, userName, password);
String projectId = GitLabAPIUtils.getProjectId(repoIp, projectPath1, privateToken);
System.out.println("projectId = " + projectId);
}
public void testGetPrivateToken() {
String privateToken = GitLabAPIUtils.getPrivateTokenByPassword(repoIp, userName, password);
System.out.println("projectId = " + privateToken);
}
public void testGetFileContent() {
String fileContent;
try {
fileContent = GitLabAPIUtils.getCleanFileContentFromRepository(repoIp, projectPath1, userName, password, fileFullPath, branchName);
System.out.println("fileContent = " + fileContent);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}