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
linkde 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 '.'