使用Google REST API批量删文件遇400错误及500内部错误排查
Google Drive API批量删除文件问题排查与修复
问题一:自定义fetch实现批量删除返回400 Bad Request
你参考相关方案用fetch实现的代码存在多个格式错误,导致请求被拒绝:
错误点分析
Boundary格式错误
代码中给boundary添加了多余的单引号:const separation = `\n--'${boundary}'\n`; const ending = `\n--'${boundary}'--`;标准multipart请求的boundary不需要包裹单引号,正确格式应为
--${boundary}。子请求格式与冗余头部
- 子请求的DELETE行末尾存在多余换行和空格,HTTP请求行需要严格格式;
- 主请求已经携带了
Authorization头部,子请求无需重复添加,重复头部会导致格式混乱。
fetch不支持
multipart参数
fetch API的请求配置中没有multipart这个属性,你定义的_multiPart数组完全无效,反而可能让请求体处理出错。API版本不统一
批量请求的端点用了Drive v3(https://www.googleapis.com/batch/drive/v3),但子请求用的是v2的删除接口(/drive/v2/files/${current.id}),版本不匹配会导致解析错误。
修复后的代码
const boundary = 'END_OF_PART'; const separation = `\n--${boundary}\n`; const ending = `\n--${boundary}--`; // 统一使用v3 API const requestBody = files.reduce((accum, current) => { accum += separation + 'Content-Type: application/http\n\n' + `DELETE https://www.googleapis.com/drive/v3/files/${current.id}\n`; return accum; }, '') + ending; const url = new URL('https://www.googleapis.com/batch/drive/v3'); const requestOptions = { method: 'POST', headers: { "Content-Type": `multipart/mixed; boundary=${boundary}`, // 必须在Content-Type里指定boundary 'Authorization': `Bearer ${this.getToken()}` }, body: requestBody }; try { const response = await fetch(url, requestOptions); if (!response.ok) { const errorText = await response.text(); console.error('批量删除失败:', errorText); } else { console.log('批量删除请求已提交'); } } catch (err) { console.error('请求异常:', err); }
注意:必须在Content-Type头部明确指定boundary,这是之前代码遗漏的关键项。
问题二:参考XMLHttpRequest方案删除100个文件后返回500内部错误
这个问题的核心原因是Google Drive Batch API的子请求数量限制:
- Drive API规定单个batch请求中包含的子请求不能超过100个,超过这个数量会触发服务器内部错误(500);
- 你成功删除100个文件是因为前100个子请求被正常处理,后续请求触发了限制导致报错。
解决方法
将待删除文件列表拆分为每100个一组,分批发送batch请求,每组之间可以添加短暂延迟(比如1-2秒),避免触发频率限制。
内容的提问来源于stack exchange,提问作者DRW
相关产品推荐
相关产品推荐

