GitHub提供了一个REST API,允许开发者通过HTTP请求获取用户存储库信息。使用JavaScript可以通过fetch
API或XMLHttpRequest
来调用GitHub API获取数据。
GitHub API的端点:https://api.github.com/users/{username}/repos
async function getGitHubRepos(username) {
try {
const response = await fetch(`https://api.github.com/users/${username}/repos`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const repos = await response.json();
return repos;
} catch (error) {
console.error('Error fetching GitHub repositories:', error);
return null;
}
}
// 使用示例
getGitHubRepos('your-username')
.then(repos => {
if (repos) {
console.log('Repositories:', repos);
// 处理存储库数据
repos.forEach(repo => {
console.log(`Name: ${repo.name}, URL: ${repo.html_url}`);
});
}
});
GitHub API对未认证的请求有速率限制(60次/小时),使用认证令牌可提高到5000次/小时。
async function getGitHubReposWithAuth(username, token) {
try {
const response = await fetch(`https://api.github.com/users/${username}/repos`, {
headers: {
'Authorization': `token ${token}`
}
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const repos = await response.json();
return repos;
} catch (error) {
console.error('Error fetching GitHub repositories:', error);
return null;
}
}
API返回的每个存储库对象包含以下常用属性:
id
: 存储库唯一IDname
: 存储库名称full_name
: 完整名称(包含用户名)html_url
: GitHub页面URLdescription
: 描述fork
: 是否为fork的存储库created_at
: 创建时间updated_at
: 更新时间pushed_at
: 最后推送时间stargazers_count
: star数量watchers_count
: watcher数量forks_count
: fork数量language
: 主要编程语言问题: 在浏览器中直接调用API可能会遇到跨域问题。
解决方案:
问题: 未认证请求限制为60次/小时。
解决方案:
问题: 默认只返回30个存储库。
解决方案:
async function getAllGitHubRepos(username, token = null) {
let allRepos = [];
let page = 1;
let hasMore = true;
const headers = token ? { 'Authorization': `token ${token}` } : {};
while (hasMore) {
try {
const response = await fetch(
`https://api.github.com/users/${username}/repos?page=${page}&per_page=100`,
{ headers }
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const repos = await response.json();
allRepos = allRepos.concat(repos);
// 检查是否有更多存储库
const linkHeader = response.headers.get('Link');
hasMore = linkHeader && linkHeader.includes('rel="next"');
page++;
// 如果没有返回存储库,也停止
if (repos.length === 0) {
hasMore = false;
}
} catch (error) {
console.error('Error fetching GitHub repositories:', error);
hasMore = false;
}
}
return allRepos;
}
没有搜到相关的文章