
许多开发者在尝试使用客户端javascript(如axios)向托管在github pages上的json文件发送post请求以更新其内容时,会遇到一个常见的错误:access to xmlhttprequest at '...' from origin '...' has been blocked by cors policy: response to preflight request doesn't pass access control check: no 'access-control-allow-origin' header is present on the requested resource.
这个错误并非偶然,而是由以下几个核心原因共同导致:
简而言之,你不能将托管在GitHub上的静态JSON文件视为一个可写入的数据库端点。
要程序化地修改GitHub仓库中的文件内容,你需要使用GitHub提供的REST API。GitHub API设计用于管理仓库、文件、提交等各种资源,并且提供了相应的认证和授权机制。
GitHub API提供了一个名为“Repos Content”的接口,允许你创建、读取、更新和删除仓库中的文件。更新文件内容的具体接口是PUT /repos/{owner}/{repo}/contents/{path}。
API文档链接: GitHub REST API - Repos Contents
更新文件需要发送一个PUT请求到指定的API端点,请求体中需要包含以下信息:
示例(概念性伪代码,使用JavaScript和Axios):
import axios from 'axios';
async function updateGitHubJsonFile(owner, repo, path, newData, token) {
const apiUrl = `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;
try {
// 1. 获取文件的当前内容和SHA值
const getResponse = await axios.get(apiUrl, {
headers: {
'Authorization': `token ${token}`,
'Accept': 'application/vnd.github.v3+json'
}
});
const currentContentBase64 = getResponse.data.content;
const currentSha = getResponse.data.sha;
const decodedContent = atob(currentContentBase64); // Base64解码
const existingData = JSON.parse(decodedContent);
// 2. 合并新数据
existingData.push(newData); // 假设是数组,根据实际JSON结构调整
// 3. 编码更新后的内容
const updatedContentBase64 = btoa(JSON.stringify(existingData, null, 2)); // Base64编码
// 4. 发送PUT请求更新文件
const putResponse = await axios.put(apiUrl, {
message: `Update ${path} with new data`,
content: updatedContentBase64,
sha: currentSha,
branch: 'main' // 或你的目标分支
}, {
headers: {
'Authorization': `token ${token}`,
'Content-Type': 'application/json',
'Accept': 'application/vnd.github.v3+json'
}
});
console.log('文件更新成功:', putResponse.data);
return true;
} catch (error) {
console.error('更新GitHub文件失败:', error.response ? error.response.data : error.message);
return false;
}
}
// 示例调用 (请替换为你的实际信息)
// const owner = 'your-github-username';
// const repo = 'your-repository-name';
// const path = 'path/to/your/tiles.json';
// const newData = { id: 3, name: 'New Tile' };
// const personalAccessToken = 'ghp_YOUR_PERSONAL_ACCESS_TOKEN'; // **重要:绝不能在客户端代码中直接暴露!**
// updateGitHubJsonFile(owner, repo, path, newData, personalAccessToken);对于需要频繁更新、用户交互修改,或者需要更复杂数据管理(如查询、过滤、排序)的应用场景,将JSON文件作为数据存储介质并非最佳选择。一个更健壮和安全的方案是引入一个后端服务和数据库。
如果你的数据需要:
在这种情况下,你可以将数据存储在如PostgreSQL、MySQL、MongoDB等数据库中,并通过后端API提供数据服务。当需要“更新GitHub上的JSON文件”时,这通常意味着你可能正在尝试用静态文件模拟数据库行为,这通常不是一个好主意。
最终,选择哪种方案取决于你的具体需求、应用规模以及对安全性和可维护性的要求。对于大多数需要数据修改的应用,后端服务与数据库是更为专业和可靠的选择。
以上就是在GitHub上安全更新JSON文件:理解CORS限制与API应用实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号