如何通过GitLab REST API获取文件的原始内容?

时间:2017-06-30 02:33:42

标签: git rest gitlab

GitLab API的以下REST Url为我提供了项目的存储库树。

获取回购树(WORKS)

https://gitlab.gspt.net/api/v3/projects/2931/repository/tree?private_token=XXXX

输出:

[
    {
        "id": "a49d11794ed56db7f935abfd61002aef67159d10",
        "name": "src",
        "type": "tree",
        "path": "src",
        "mode": "040000"
    },
    {
        "id": "0fbd98527d4b36e3d22c164293d8fd8eee4d18cd",
        "name": ".gitignore",
        "type": "blob",
        "path": ".gitignore",
        "mode": "100644"
    },
    {
        "id": "0ef0da472176f2e6a24843ac9d4bb738c8310d23",
        "name": "pom.xml",
        "type": "blob",
        "path": "pom.xml",
        "mode": "100644"
    }
]

但是我无法获得文件的原始内容,确切地说是pom.xml。

获取文件的原始内容(不工作 - 给404)

https://gitlab.gspt.net/api/v3/projects/2931/repository/files/pom%2Exml/raw?private_token=xxxx&ref_name=master

输出:

{
    "error": "404 Not Found"
}

根据此处的文档(https://docs.gitlab.com/ee/api/repository_files.html#get-raw-file-from-repository),我指定了正确的rest url。然而,唯一不同的是在其余的api端点中使用V4而不是V3。我四处搜索但找不到v3 api的终点。

2 个答案:

答案 0 :(得分:3)

首先,为了以防万一,不要对“。”进行百分比编码:

.../files/pom.xml/raw?...
            ^^

其次,您可以在merge request 9637this comparison

中查看文件端点从v3到v4的影响方式
v3:
GET /projects/:id/repository/raw_blobs/:sha
v4:
GET /projects/:id/repository/blobs/:sha/raw

您可以看到示例(在第3版中)没有对点进行百分比编码。

curl --request GET --header 'PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK' \
  'https://gitlab.example.com/api/v3/projects/13083/repository/files?file_path=app/models/key.rb&ref=master'

但是,v3 API只允许获取原始blob,而不是原始文件 见merge request 16834

  
      
  • /projects/:id/repository/files修改为/projects/:id/repository/files/:filepath:filepath应为网址编码)
  •   
  • /projects/:id/repository/blobs/:sha移至/projects/:id/repository/files/:filepath/raw
  •   

只有v4 API允许:filepath个参数。

请参阅“Git objects SHA-1 are file contents or file names?”以解码从API v3获得的原始blob。

答案 1 :(得分:0)

注意 dot(.) 编码版本: 看 wiki

  . == %2E