You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Apps Script POST请求异常:Curl返回HTML而非JSON

问题描述
  • 开发了基于Google Apps Script的Web应用,通过POST请求创建Google日历事件,代码逻辑正常。
  • Postman发起请求时,能正确返回JSON格式的事件ID;
  • 用curl发起完全相同的请求时,日历事件虽成功创建,但响应内容为HTML而非预期的JSON格式事件ID。
代码片段
function doPost(e) {
    const accessKey = 'l056SH7REYsuli**************************************************DIX0e08XvsBAtzA2eSJg';
    let result;
    let params = JSON.parse(e.postData.contents);
    let event = params.event;
    let calendarId = params.calendarId;
    let token = params.token;
    let method = params.method;
    if(token === accessKey) {
        try {
            eventResult = Calendar.Events.insert(event, calendarId);
            result = { 'Event ID: ' : eventResult.id }
            } catch (err) {
            result = { 
                'Failed with error %s': err.message,
                'Event contents': event
                    }
            }
    } else {
        result = {
            'status': 'Forbidden',
            'statusCode': 403,
            'message': 'You do not have access to this resource.'
        }
    }
    return ContentService.createTextOutput(JSON.stringify(result))
}
Curl请求命令
curl --location --request POST 'https://script.google.com/macros/s/AKfycbyh7n3YeE-HiNAIA8wi9HAVsaLBUv5ceJu-k7yxL4D8mSm9EXQ4wQc_ctqipFlAR4SqfA/exec' \
--header 'Content-Type: application/json' \
--data-raw '{"token": "l056SH7REYs****************************************3IYXeiECDIX0e08XvsBAtzA2eSJg","calendarId": "c_9bae2a34a108dd90*************************5ee00d@group.calendar.google.com","event": {"summary":"TEst from postman","description":"Abyrvalg","start": {"date": "2022-11-28"},"end": {"date": "2022-11-28"},"colorID": 9}}'
解决思路

1. 明确设置响应的MIME类型

当前代码返回响应时,未指定Content-Type为application/json。Postman会自动识别JSON内容,但curl对响应类型更严格,GAS默认可能返回text/html,导致curl将内容解析为HTML。

修改返回语句,添加MIME类型设置:

return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON);

2. 补充curl请求的Accept头部

在curl命令中添加Accept: application/json,明确告知服务器期望JSON格式的响应:

curl --location --request POST 'https://script.google.com/macros/s/AKfycbyh7n3YeE-HiNAIA8wi9HAVsaLBUv5ceJu-k7yxL4D8mSm9EXQ4wQc_ctqipFlAR4SqfA/exec' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data-raw '{"token": "l056SH7REYs****************************************3IYXeiECDIX0e08XvsBAtzA2eSJg","calendarId": "c_9bae2a34a108dd90*************************5ee00d@group.calendar.google.com","event": {"summary":"TEst from postman","description":"Abyrvalg","start": {"date": "2022-11-28"},"end": {"date": "2022-11-28"},"colorID": 9}}'

3. 验证Web应用部署设置

确认GAS Web应用的部署配置:

  • 执行方式选择“我”(部署者账号),确保调用Calendar API的权限正常;
  • 访问权限选择对应范围(如“任何人,甚至匿名”),避免curl请求被拦截;
  • 修改代码后需重新部署并保存新版本,确保变更生效。

4. 排查隐性错误

尽管事件创建成功,可能存在未捕获的隐性错误导致返回HTML。在代码中添加日志记录关键信息:

Logger.log('Post内容: ' + e.postData.contents);
Logger.log('Token验证结果: ' + (token === accessKey));
Logger.log('事件创建结果: ' + JSON.stringify(eventResult));

通过GAS编辑器的“查看-日志”功能,检查是否有异常信息。

内容的提问来源于stack exchange,提问作者Sergei Lavrov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:20:47