前言

最近公司做了一个"项目管理"的项目, 需要调用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通.

好了, 今天先到这. 有啥问题欢迎留言.