使用Google App Script调用Draftable API POST接口遇400错误求助
解决Draftable API POST请求返回400错误的问题
首先看你收到的错误响应:
{"left":["This field is required."],"right":["This field is required."]}
虽然你在代码里定义了left和right参数,但服务器根本没接收到这些数据,问题出在UrlFetchApp的请求参数结构上,具体原因和修复方法如下:
核心问题
在Google Apps Script中,POST请求的表单数据必须放在options的payload属性里,而不是直接作为顶级属性和method、headers同级。你现在把left和right直接写在options根节点,服务器完全读取不到这些参数,所以返回了“字段必填”的错误。
另外,当使用multipart/form-data格式传递嵌套结构(比如left包含source_url等子属性)时,需要按照Draftable API的要求,用类似left[source_url]的键名来构造表单字段,而不是直接传嵌套对象(UrlFetchApp不会自动把嵌套对象转换成正确的表单格式)。
修正后的代码
function POST() { // 构造符合要求的表单 payload var payload = { "left[source_url]": "https://api.draftable.com/static/test-documents/paper/left.pdf", "left[display_name]": "old-example.docx", "left[file_type]": "pdf", "right[source_url]": "https://api.draftable.com/static/test-documents/paper/right.pdf", "right[display_name]": "newer-example.docx", "right[file_type]": "pdf" }; var options = { "method": "POST", "headers": { "Accept": "application/json", "Authorization": "Token 你的实际Token", // 替换成真实的API Token }, "payload": payload, "muteHttpExceptions": true // 可选,方便调试时查看完整响应 }; try { var result = UrlFetchApp.fetch("https://api.draftable.com/v1/comparisons", options); var params = JSON.parse(result.getContentText()); Logger.log("Comparison identifier: " + params.identifier); } catch (e) { Logger.log("请求错误: " + e.toString()); Logger.log("响应内容: " + result.getContentText()); } }
关键调整说明
- 把所有请求参数移到
payload对象中,并且用left[xxx]、right[xxx]的格式来定义嵌套字段,这样服务器才能正确解析。 - 移除了手动设置的
Content-Type: multipart/form-data,因为当payload是普通对象时,UrlFetchApp会自动生成正确的multipart请求头(包括boundary),手动设置反而可能导致格式错误。 - 添加了
muteHttpExceptions: true和try-catch块,方便调试时查看完整的错误响应内容,避免只看到截断的信息。 - 确保
Authorization里的Token是你实际的API密钥,替换掉占位符。
这样调整后,服务器就能正确接收到left和right的参数,应该就能成功创建对比任务了。
内容的提问来源于stack exchange,提问作者Aakash Tripathi
相关产品推荐
相关产品推荐

