Gitlab的API调用

2023-11-05

1.概述

Gitlab作为一个开源、强大的分布式版本控制系统,已经成为互联网公司、软件开发公司的主流版本管理工具。使用过Gitlab的都知道,想要提交一段代码,可以通过git push提交到远程仓库,也可以直接在Gitlab平台上修改提交。然而上述两种提交方式都是人工提交代码,需要手动登录Gitlab或者在第一次commit的时候提供Gitlab帐号和密码。

那么,假设有这么一个需求场景:我们开发了一个效率平台,可以自动拉分支、自动提交代码到远程仓库。这个需求该如何实现?其实很简单,Gitlab提供了一套完整的API,让第三方平台可以通过API自动创建帐号、自动提交代码、自动拉分支,等等。API涉及到的功能非常全面,覆盖了分支、tag、代码提交、用户、群组、项目等,基本上人工可以做的所有操作,都可以通过API自动实现。

Gitlab的Api的文档入口为http://{gitlab_host}/help/api/README.md

2.技术要点

Gitlab本质上也是一个web服务器,Gitlab官方提供了一个非常完整的restful API,我们可以使用apache开发的一个工具包HttpClient,HttpClient可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

当我们想要执行某种操作时,我们只需要在Gitlab的api文档上查找到对应的路径,然后在自己的后台利用HttpClient将对应的链接发送至Gitlab服务器即可,HttpClient功能非常强大,支持get,post,put,delete等七种请求方式。

附录一个讲解HttpClient非常完善的链接:http://www.yeetrack.com/?p=779;

3.使用HttpClient完成一次请求

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。

1.创建HttpClient对象。
2.创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3.如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4.调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
5.调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
6.释放连接。无论执行方法是否成功,都必须释放连接。

Get请求使用方法:

    public static String httpGet(String url) throws Exception {

        CloseableHttpClient httpclients = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        CloseableHttpResponse response = httpclients.execute(httpGet);
        HttpEntity httpEntity = response.getEntity();

        try{
            HttpEntity entity = response.getEntity();
            if(entity != null) {
                InputStream is = entity.getContent();
            }
        }finally{
            response.close();
    }

    return EntityUtils.toString(httpEntity,"UTF-8");

}

Post请求示例如下:

public static String httpPost(String url,List<NameValuePair> formparams) throws Exception {
    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 entity1 = response.getEntity();

    try{
        HttpEntity entity5 = response.getEntity();
        if(entity != null) {
            InputStream is = entity.getContent();
        }
    }finally{
        response.close();
    }

    return EntityUtils.toString(entity1);

}

4.身份认证

Gitlab的所有API都需要提供private_token参数进行用户身份认证(除了用来获得private_token的接口本身)。如果没有提供或者提供的private_token不合法,API将会返回401错误码。如下:

{"message":"401 Unauthorized"}

private_token是用来代表用户身份的字符串,和用户是一一对应的关系,http请求中包含这个可以免输入用户名和密码。

获得private_token的方式有两种:

方法一:查看帐号设置(Profile Settings->Account)。如下图:
这里写图片描述

方法二:通过Session API获得Gitlab提供了一个API获取某个用户对应的private_token,这样就能把操作的都完全自动化起来,也方便Gitlab与其它系统/平台打通。Session接口需要提供帐号密码来进行身份认证。
示例如下:
这里写图片描述

5.操作Gitlab的实例

@Test
    //新建项目
    public void post1() throws Exception {
        String url = "http://192.168.124.46/api/v3/projects";

    List<NameValuePair> formparams = new ArrayList <NameValuePair>();
    //新建项目大约有20个参数可以设置
    formparams.add(new BasicNameValuePair("private_token", "2W6HbdQc4NuVbgTaz1hW"));
    formparams.add(new BasicNameValuePair("private_token", "rTRdYCbqDpPNxttpE8ox"));
    formparams.add(new BasicNameValuePair("email", "643216160@qq.com"));
    formparams.add(new BasicNameValuePair("password", "aaaasasasas"));
    formparams.add(new BasicNameValuePair("reset_password", "true"));
    formparams.add(new BasicNameValuePair("username", "lishuwang"));
    formparams.add(new BasicNameValuePair("name", "wangzai"));
    formparams.add(new BasicNameValuePair("skype", "qwqw"));
    formparams.add(new BasicNameValuePair("linkedin", "qwwq"));


    System.out.println(Utils.httpPost(url, formparams));

}

//查询当前用户的某个项目
@Test
public void httpGet2() throws Exception {
    //变量为项目id
    String url = "http://192.168.121.215/api/v3/projects/49?private_token=L9C8yBBwYxvRBxLxF2ge";
    String entity = Utils.httpGet(url);
    System.out.println(entity);
}

6.总结

对Gitlab进行二次开发实际上就是通过HttpClient工具类来代替我们发送请求给Gitlab服务器,而不需要我们自己再手动访问Gitlab网页来进行操作。原理和思路并不难理解。其中要注意的就是使用HttpClient发送请求时需要携带一个private_token的参数过去,每个用户都有一个唯一的私人令牌,此令牌作为用户的唯一标识,Gitlab给我们提供了一个通过用户名和密码来专门获取此private_token的api,当然身份验证的方式不仅仅有这一种,还有OAuth2令牌和个人访问令牌的方式都可以。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gitlab的API调用 的相关文章

  • RabbitMQ HTTP API 请求 401 未经授权

    我正在尝试访问 RabbitMQ Rest 但收到 401 未经授权的错误 我想访问队列信息并获取消息编号 我发现这是一个解决方案 DefaultHttpClient httpClient new DefaultHttpClient Htt
  • 用于高级搜索/过滤的.Net Web API URL 约定

    我对 Microsoft 的 REST 和 WebAPI 比较陌生 我们正在实现一个中心 REST 服务 它将容纳多种类型的对象获取和设置 作为该项目的领导者 我的任务是提出我们正在使用的正确的 Uri 设计 我想知道关于战争什么想法更好
  • 访问应用程序,带有表单任务栏图标的隐藏应用程序窗口

    我有一个带有一个主表单的访问应用程序 当您打开应用程序时 AutoExec 宏会通过 Windows API apiShowWindow 隐藏应用程序 然后 AutoExec 打开设置为 Popup 的主窗体 这一切都很顺利 我的数据库内容
  • 如何在 PHP 中使用 Amazon 的 API 来搜索书籍? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一款用于图书共享 评论和推荐的 Facebook 应用程序 我搜索了网络 使用我能想到的每个
  • net.Socket.writable、net.Socket.readable 属性不是官方 Node.js API 的一部分

    我想知道为什么 net Socket writable 和 net Socket read 属性不是官方 Node js API 的一部分 这是否意味着最好不要使用这些属性 因为它是将来可能会改变的内部内容 它们是 但不是你正在寻找的地方
  • Magento SOAP V2 API - 附加属性设置为空

    几个小时以来 我一直在尝试通过 SOAP V2 API 创建具有附加属性的产品 每当我打电话时就会添加该产品目录产品创建但我随请求发送的附加属性被设置为空 每当我不添加附加属性时 这两个属性都会设置为其默认值 因此我认为这些属性正在发送和接
  • org.apache.http 软件包在 API 级别 23 中被删除。替代方案是什么?

    在更新到最新的 android API 级别 23 Marshmallow 后 通过 build gradle 添加以下更改后 所有 org apache http 类都不起作用 android compileSdkVersion 23 b
  • GitLab CI - 添加标签时避免构建

    添加 git 标签时如何防止触发 gitlab ci 管道 我在本地运行此命令 而不是在 gitlab ci 作业中运行 git tag a xyz 然后推送标签 这会触发各种管道 我想排除其中一些管道的运行 我正在尝试对诸如以下问题的想法
  • 从 iTunes ID 查找播客源的 URL。 (iTMS API)

    我正在研究一种将 iTunes 播客 ID 转换为播客制作人提供的 RSS 提要的方法 我知道RSS 生成器 http ax itunes apple com rss 可用于生成播客链接的提要 但这些链接指向 HTML 页面 如果您打开 i
  • PHP:在 CURL GET 调用中使用 API 密钥

    我看过关于使用 api 密钥在curl 中验证 post 调用的帖子 我有一个 GET 调用 需要 apikey 进行授权 即请求必须具有包含 apiKey 的授权标头 我已经获得了 api 密钥并尝试将其用于 GET 调用
  • IB Java API:提取多个合约的股票数据(实时柱)

    我正在对算法交易和 IB API 进行一些自学和实验 我决定使用 Java 但我愿意切换到 C 我浏览了一个在线教程 该教程将引导您完成下面所示的代码 但我想知道是否可以将其扩展到一只股票之外 我想浏览所有 SP500 股票并检查股票数据
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • SoftLayer_Account::getOperatingSystemReloadImages

    我想在 OSReload 期间使用 API 获取可用操作系统列表 我发现提到了 SoftLayer Account getOperatingSystemReloadImages 方法 但找不到该方法的用法 谁能帮我解决这个问题 谢谢 我找不
  • 从自己的 gitlab 服务器安装节点模块

    我想从我们的 gitlab 服务器安装节点模块 这是存储库的链接 http ABCD GITLAB myGroup myNodeModule git http ABCD GITLAB myGroup myNodeModule git 根据n
  • R 的 ggplot2 有 Python API 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我的问题就像标题一样简单 我想使用R s ggplot2但我所有的数据处理都是在Python 有没有Py
  • 如何让 Gitlab 运行程序在成功构建时将代码合并到分支中

    嗯 标题几乎是不言自明的 总之 如果构建成功 我希望将一个分支 即开发 合并到另一个分支 即生产 我尝试了 jakub kania 解决方案 但我总是得到id rsa invalid format 我认为 gitlab 秘密变量以某种方式被
  • 使用 VB/ASP classic 可以向 API 发出 HTTP 请求吗?

    是否可以使用 ASP classic 向 Web API 发出请求 例如 像 Flickr API 这样简单的东西 或者这种东西很久以前就不支持了 这是很有可能的 Dim req Set req Server CreateObject MS
  • 如何修复 facebook Fatal error: Uncaught CurlException 问题

    我不时从 Facebook 收到此错误 Fatal error Uncaught CurlException 28 connect timed out thrown in var www html xxx facebook src face
  • Ruby 的 Faraday - 多次包含相同的参数

    我正在使用一个 API 该 API 迫使我多次发送相同的参数名称以级联不同的过滤条件 因此 示例 api GET 调用如下所示 GET http api site com search a b1 a b2 a b3 a c2 我使用 Far
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填

随机推荐

  • jpa方法名命名规则

    一 常用规则速查 1 And 并且2 Or 或3 Is Equals 等于4 Between 两者之间5 LessThan 小于6 LessThanEqual 小于等于7 GreaterThan 大于8 GreaterThanEqual 大
  • Auto.js实现i茅台自动化申购

    i茅台自动化申购 文章目录 i茅台自动化申购 前言 一 前提条件 二 代码示例 总结 前言 现在茅台行情十分火热 茅台集团推出了i茅台APP供大家申购 下面介绍使用Auto js实现自动化申购 一 前提条件 需要下载Auto js的apk
  • 40.1自定义组建el-cascader

    1 子组件
  • 51单片机模拟救护车的警报声

    include
  • React Hooks --useEffect

    再用class写组件时 经常会用到生命周期函数 来处理一些额外的事情 副作用 和函数业务主逻辑关联不大 特定时间或事件中执行的动作 比如请求后端数据 修改Dom等 在React HookS中也需要类似的生命周期函数 useEffect由此诞
  • t检验与方差分析的区别和联系

    一 t检验和方差分析的应用 1 t检验的应用 t检验主要用于比较两组数据之间的均值是否存在显著差异 例如比较两种手术方式对患者的术后疼痛程度是否有显著差异 在医学研究中 t检验可以用于比较不同手术方式或药物对患者的疗效差异 例如 我们可以采
  • kettle的下载安装以及问题点

    1 kettle下载以安装 1 kettle的官网下载地址 Pentaho from Hitachi Vantara Browse Files at SourceForge net 2 如果需要下载其他版本 直接点击对应的版本Name 8
  • 闪回数据归档+闪回数据归档区+创建闪回数据归档区+创建闪回数据归档区案例+为数据归档区添加表空间+为数据归档区删除表空间+数据归档区修改数据保留时间+删除数据归档区

    闪回数据归档 1 它将改变的数据另外存储到特定的闪回数据归档区中 从而让闪回不再受撤销数据的限制 提高数据的保留时间 2 闪回数据归档中的数据行可以保留几年甚至几一年 3 闪回数据归档并不针对所有的数据改变 它只记录update和delet
  • 小程序搭建mqtt服务器,微信小程序连接MQTT服务器实现控制Esp8266LED灯

    上一篇文章已实现Esp8266开发板与MQTT服务器连接实现控制LED灯 这篇文章记录继上篇的功能接入微信小程序实现LED灯的控制 先理解一个概念 微信小程序订阅MQTT服务器一个主题 Esp8266订阅相同的主题时 微信小程序发送给MQT
  • python raise

    当程序出现错误 python会自动引发异常 也可以通过raise显示地引发异常 一旦执行了raise语句 raise后面的语句将不能执行 演示raise用法 try s None if s is None print s 是空对象 rais
  • 各类数据类型sizeof的大小

    前言 之前总是误认为指针变量的大小和指针所指向的对象有关系 搞网络驱动时 使用kmalloc做内存申请时发现了一些端倪 先简单介绍下sizeof sizeof 是一个关键字 它是一个编译时的运算符 用于判断变量或数据类型的字节大小 size
  • UE4智慧城市开发流程梳理

    智慧城市开发流程梳理 摸索UE智慧城市相关做的总结梳理 并不是很专业 如有差错欢迎指正 1 GIS数据获取 谷歌地图 地理数据网站等中获取 或者使用第三方软件下载 水经注GIS ESRI有的ArcGIS online Cesium的ION
  • Redis连接池的介绍与使用

    一 介绍 说明 通过golang对redis操作 还可以通过redis连接池 流程如下 事先初始化一定数量的连接 放入到连接池 当go需要操作redis时 直接从redis连接池取出连接即可 这样可以节省临时获取redis连接的时间 从而提
  • Redis 分布式锁实现

    Redis 分布式锁 分布式锁 满足分布式系统或集群模式下多进程可见并且互斥的锁 特点 多线程可见 互斥 高可用 高性能 高并发 安全性 可重入性 重试机制 锁超时自动续期等 加锁之后 对整个分布式集群都有效 基于数据库 redis缓存 使
  • JAVA与C++通信之字节序

    1 BIG ENDIAN LITTLE ENDIAN跟多字节类型的数据有关的比如int short long型 而对单字节数据byte却没有影响 BIG ENDIAN就是低位字节排放在内存的低端 高位字节排放在内存的高端 而LITTLE E
  • 如何设置vscode默认谷歌浏览器打开

    突然发现自己写完的网页都是电脑默认浏览器打开 而看到一些视频博主都是默认谷歌浏览器打开 然后就找到了设置的办法 记录一下 设置的步骤 1 在extensions 扩展商店 中安装open in browser 插件 2 左下角中找到sett
  • 数据库服务器的监听系统在哪,数据库监控,数据库监控工具--运维监控系统PIGOSS BSM...

    数据就是一切 各类数据在企业生产经营中都起着至关重要的作用 是所有的经营活动所依赖的 不可或缺的信息 数据就犹如企业经营者的眼睛一样 通过数据可以反映出所有的问题 就犹如舵手依赖导航一样 现在每个企业和组织发展都需要依赖大量的数据 数据也成
  • java new list 对象_Java中List集合对象去重及按属性去重的8种方法

    最近在写一些关于java基础的文章 但是我又不想按照教科书的方式去写知识点的文章 因为意义不大 基础知识太多了 如何将这些知识归纳总结 总结出优缺点或者是使用场景才是对知识的升华 所以我更想把java相关的基础知识进行穿针引线 进行整体上的
  • 微信小游戏的电量监听

    在说小游戏的电量监听事件之前 我想先提一下小程序的电量监听事件 在微信小程序中 是没有电量监听事件的 因为小程序没有全屏 手机端的电量和wifi等信息一直可以看得到 所以小程序里就没有这样的api了 说回小游戏的电量监听 在微信小游戏的ap
  • Gitlab的API调用

    1 概述 Gitlab作为一个开源 强大的分布式版本控制系统 已经成为互联网公司 软件开发公司的主流版本管理工具 使用过Gitlab的都知道 想要提交一段代码 可以通过git push提交到远程仓库 也可以直接在Gitlab平台上修改提交