Nital
Nital

Reputation: 6114

How to get the raw content of a file through GitLab REST API?

The following REST Url of GitLab API gives me the repository tree of a project.

Get Repo Tree (WORKS)

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

Output:

[
    {
        "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"
    }
]

But I am not able to get the raw content of a file, pom.xml to be precise.

Get Raw Content of a file (DOES NOT WORK - Gives 404)

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

Output:

{
    "error": "404 Not Found"
}

As per the documentation here (https://docs.gitlab.com/ee/api/repository_files.html#get-raw-file-from-repository) I am specify the correct rest url. The only thing that's different however is the use of V4 instead of V3 in the rest api endpoint. I searched around but could not find the endpoint of v3 api.

Upvotes: 10

Views: 34784

Answers (3)

xianshenglu
xianshenglu

Reputation: 5369

You can execute this function at your browser devtools console panel.

function getGitlabFileContentUrl(gitlabOrigin="https://gitlab.com", projectId="123", filePath="src/index.ts", ref="master", privateToken="123") {
    return `${gitlabOrigin}/api/v4/projects/${projectId}/repository/files/${encodeURIComponent(filePath)}/raw?ref=${ref}&private_token=${privateToken}`
}
// in your example
getGitlabFileContentUrl('https://gitlab.gspt.net', '2931', 'pom.xml', 'master', 'xxxx') 
// https://gitlab.gspt.net/api/v4/projects/2931/repository/files/pom.xml/raw?ref=master&private_token=xxxx

For project id you can refer to Where do I find the project ID for the GitLab API?

Upvotes: 0

user12640668
user12640668

Reputation:

Attention dot(.) encode version: see wiki

  . == %2E

Upvotes: 0

VonC
VonC

Reputation: 1329122

First, just in case, don't percent encode the ".":

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

Second, you can check how the files endpoint was affected from v3 to v4 in the merge request 9637 and this comparison

v3:
GET /projects/:id/repository/raw_blobs/:sha
v4:
GET /projects/:id/repository/blobs/:sha/raw

You can see the examples (in v3) did not percent encode the dot.

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'

However, the v3 API only allows to get raw blobs, not a raw file.
See merge request 16834:

  • Modify /projects/:id/repository/files to /projects/:id/repository/files/:filepath (:filepath should be URL-encoded)
  • Move /projects/:id/repository/blobs/:sha to /projects/:id/repository/files/:filepath/raw

Only v4 API allows for a :filepath parameters.

See "Git objects SHA-1 are file contents or file names?" to decode the raw blob you get from API v3.

Upvotes: 9

Related Questions