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
相关产品推荐
相关产品推荐

