前言
最近公司做了一个"项目管理"的项目, 需要调用githab的API接口, 下面记录一下调用过程中踩的一些坑.
思路:
Gitlab官方提供了一个非常完整的restful API,我们可以使用apache开发的一个工具包HttpClient,当我们的项目想要执行某种操作时,我们只需要在Gitlab的api文档上查找到对应的路径,然后在自己的后台利用HttpClient将对应的链接发送至Gitlab服务器即可,HttpClient功能非常强大,支持get,post,put,delete等七种请求方式。像"项目"这块的操作,实质就是发送get、post、put的请求数据、查找数据 .
Gitlab的项目API路径地址: https://docs.gitlab.com/ee/api/projects.html
#操作有很多,但基本原理差不多,就拿添加项目到gitlab服务器来说,大概分为以下几个步骤:
1.添加配置文件和实体类
首先添加配置文件config.properties:
#gitlab服务器IP,必须配置
ip=xxx
#gitlab服务器PORT,必须配置,如果不填,就会默认是80
port=80
#管理员的private_token,如未配置,需要管理员权限的操作无法执行
root_private_token= xxx
#用户的private_token
regular_private_token= xxx
项目的实体类就不公布了, 根据项目需求来, 需要什么属性就加什么,大概有以下几个: 项目id/项目名称/项目备注/权限状态/GitLab链接/附件等等
从配置文件获取配置信息, 我也封装了一个类, 代码:
public class Global {
public static String gitIP;
public static String gitPort;
public static String root_private_token;
public static String regular_private_token;
private static Properties pro;
static {
InputStream inputStream = Global.class.getResourceAsStream("/config.properties");
BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream));
try {
pro = new Properties();
pro.load(bf);
gitIP = pro.getProperty("ip");
gitPort = pro.getProperty("port");
root_private_token = pro.getProperty("root_private_token");
regular_private_token = pro.getProperty("regular_private_token");
} catch (IOException e) {
e.printStackTrace();
}
}
public static String getPorpties(String key) throws UnsupportedEncodingException {
return (String) pro.get(key);
}
}
2.发送post请求
注释: 因为是前后端分离的项目, 我把请求方法直接封装到了util类里, 方便其它的接口调用,代码如下:
public static String httpPost(String url, List<NameValuePair> formparams) throws Exception {
// 构建POST请求
CloseableHttpClient httpclients = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
// 构建消息实体
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);
httpPost.setEntity(entity);
// 发送请求
CloseableHttpResponse response = httpclients.execute(httpPost);
HttpEntity entity = response.getEntity();
return EntityUtils.toString(entity);
}
3.接口调用
@PostMapping("/createProject")
@ApiOperation(value = "创建项目")
public String createProject(@RequestBody Project project) throws Exception {
String url = "https://" + Global.gitIP + "/api/v4/projects";
Integer status = project.getStatus();
String vl = String.valueOf(status);
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
// 新建项目参数设置
//注: 新建项目可设置的参数有二十多个, 但以下三个参数是必须要要设置的, 不然会报错.
formparams.add(new BasicNameValuePair("private_token", "xxxxxxx"));
formparams.add(new BasicNameValuePair("path", project.getProjectName()));
formparams.add(new BasicNameValuePair("description", project.getRemark()));
formparams.add(new BasicNameValuePair("visibility_level", vl));
return HttpUtils.httpPost(url, formparams);
}
采坑总结:
1.接口调用这里的路径 String url = “https://” + Global.gitIP + “/api/v4/projects”; 需要注意的是发送请求得用"https", 用http会报: 301 moved permanently, 并且加了https后, 不能再加port,也会报错.
2. 新建项目可设置的参数有二十多个, 但代码中三个参数是必须要要设置的, 不然会报:连接超时的错误, 具体可去gitlab创建一个项目,然后到"network"里面看post请求发送了哪些参数.’’
3. 配置文件中的ip需cmd先ping一下,看是否能ping通.
好了, 今天先到这. 有啥问题欢迎留言.