Aller au contenu principal

Pagination

La pagination par curseur est la méthode utilisée pour parcourir les grands jeux de données proposés par l'API GitGuardian. Elle permet de récupérer les éléments par lots (pages) à l'aide de curseurs, qui sont des pointeurs vers un élément spécifique dans le jeu de données. Le curseur indique la position dans le jeu de données, ce qui facilite la navigation entre les pages.

Fonctionnement de la pagination par curseur

  • Requête initiale : lorsque vous effectuez la première requête vers un endpoint, vous recevez le premier ensemble de résultats.
  • Requêtes suivantes : utilisez l'en-tête link de la réponse pour demander l'ensemble suivant de résultats. link: <https://api.staging.gitguardian.tech/v1/members?cursor=cD03Mjc%3D>; rel="next"
  • Plus de données : s'il n'y a plus de données à récupérer, la réponse n'aura pas d'en-tête link.

Exemples

Python

import os
import requests

BASE_URL = "https://api.gitguardian.com/v1"
API_KEY = os.environ['GITGUARDIAN_API_TOKEN']
HEADERS = {"Authorization": f"Token {API_KEY}"}
endpoint_url = f"{BASE_URL}/members?per_page=10"
all_members = []

while True:
response = requests.get(endpoint_url, headers=HEADERS)
assert response.status_code == 200, response.json()
all_members += response.json()

if "next" not in response.links:
# final page was reached
break

endpoint_url = response.links["next"]["url"]

Bash/cURL

#!/bin/bash

URL="https://api.gitguardian.com/v1/members?per_page=10"

# Check if jq is installed
if ! command -v jq &> /dev/null; then
echo "jq could not be found, please install it to parse JSON."
exit 1
fi

MEMBERS="[]"

while [ "${URL}" ]; do
RESP=$(curl -i -Ss -H "Authorization: Token $API_KEY" "${URL}")
# Check for curl error
if [ $? -ne 0 ]; then
echo "Error: Failed to retrieve data from ${URL}"
exit 1
fi

# Extract HTTP status code
HTTP_STATUS=$(echo "$RESP" | grep HTTP | awk '{print $2}')
if [ "$HTTP_STATUS" != "200" ]; then
echo "Error: Received HTTP status $HTTP_STATUS"
exit 1
fi

# Retrieve the body of the response and parse it with jq
BODY=$(echo "$RESP" | sed -n '/^\r$/,$p' | sed '1d' | jq '.')
# Append to members list
MEMBERS=$(echo "${MEMBERS}" | jq ". + ${BODY}")

# Retrieve the next url from the response's headers
URL=$(echo "$RESP" | grep -i '^link:' | sed -n -E 's/^link:.*<(.*)>; rel="next".*/\1/p')
done

# Output the members list formatted with jq
echo "${MEMBERS}" | jq '.'