在一些实际情况中,希望能够直接像读取本地文件一样读取远程仓库中的文件内容,避免git操作失败的情况下读取的本地缓存的文件内容。由于项目使用gitLab管理配置文件,查询了GitLabApi,其提供了诸多API接口,包括常见的git操作、项目管理以及我们需要的获取文件内容等接口。
1.接口分析
查询GitLab api,可以容易找到获取文件内容的API文档:GitLab获取仓库中文件内容,可以发现,其格式要求为:
GET /projects/:id/repository/files/:file_path
curl --request GET --header 'PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK' 'https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb?ref=master'
通过分析可以发现,如果想获取仓库中文件内容,需要以下几个要素:
仓库地址
项目id
用户的private token
经过url编码的文件全路径
文件所在的分支
由此,我在实现时将API接口整理为一个常量:
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}";
2.获取用户的private token
GitLabApi关于获取个人口令的API可以整理为常量类:
private static String GITLAB_SESSION_API = "http://#{REPO_IP}/api/v3/session?login=#{USER_NAME}&password=#{PASSWORD}";
提供如下3个变量即可获取指定用户的token:
仓库地址
用户名
密码
经过简单的json解析就能获取到结果,代码如下:
/**
* 根据用户名称和密码获取gitlab的private token,为Post请求
*
* @param ip gitlab仓库的ip
* @param userName 登陆gitlab的用户名
* @param password 登陆gitlab的密码
* @return 返回该用户的private token
*/
public static String getPrivateTokenByPassword(String ip, String userName, String password) {
/** 1.参数替换,生成获取指定用户privateToken地址 */
// 校验参数
Objects.requireNonNull(ip, "参数ip不能为空!");
Objects.requireNonNull(userName, "参数userName不能为空!");
Objects.requireNonNull(password, "参数password不能为空!");
// 参数准备,存入map
Map params = new HashMap(4);
params.put("REPO_IP", ip);
params.put("USER_NAME", userName);
params.put("PASSWORD", password);
// 调用工具类替换,得到具体的调用地址
String reqUserTokenUrl = PlaceholderUtil.anotherReplace(GITLAB_SESSION_API, params);
sysLogger.debug(String.format("获取用户:%s的private token地址为:%s", userName,reqUserTokenUrl));
/** 2.访问url,获取指定用户的信息 */
RestTemplate restTemplate = new RestTemplate();
ResponseEntity response = restTemplate.postForEntity(reqUserTokenUrl, null,String.class);
sysLogger.debug(String.format("响应头为:%s,响应体为:%s", response.getHeaders(), response.getBody()));
/** 3.解析结果 */
String body = response.getBody();
JSONObject jsonBody = JsonUtil.parseObjectToJSONObject(body);
String privateToken =jsonBody.getString("private_token");
sysLogger.debug(String.format("获取到用户:%s的privateToken为:%s", userName, privateToken));
/** 4.返回privateToken */
return privateToken;
}
注意,这个接口时POST请求,正确的HTTP响应码是201