如何在URLFetchApp中正确转义含双引号的请求负载?
解决Google Apps Script中URLFetchApp发送带双引号负载的问题
问题核心
你遇到的问题是:手动用JSON.stringify()处理含双引号的XML内容后,传入URLFetchApp会触发双重转义,导致CMS返回422错误;直接传未序列化的对象又因格式不符返回400错误。本质是URLFetchApp的请求配置与序列化逻辑不匹配。
正确实现方案
核心是跳过手动JSON.stringify(),直接传入JavaScript对象,并强制设置请求的contentType为application/json。URLFetchApp会自动完成正确的JSON序列化,避免双重转义问题。
示例代码:
// 假设finalContent是包含双引号的XML字符串 var finalContent = '<?xml version="1.0"?><section xmlns="http://docbook.org/ns/docbook" xmlns:xinfo="http://ns.expertinfo.se/cms/xmlns/1.0" xml:id="12345" version="5.0" xml:lang="en" xinfo:resource="12345" xinfo:resource-id="1234" xinfo:resource-type="component" xinfo:resource-title="Source 5" xinfo:resource-titlelabel="" xinfo:version-major="1" xinfo:version-minor="0"> <title xinfo:text="1234">Name</title> <para>Short overview</para></section>'; var data = { "content": finalContent }; var options = { method: "post", contentType: "application/json", // 必须配置该参数 payload: data, // 直接传入对象,无需提前序列化 muteHttpExceptions: true // 可选,便于查看完整错误响应 }; var response = URLFetchApp.fetch("你的CMS API地址", options); Logger.log(response.getContentText());
错误原因解析
- 手动执行
JSON.stringify(data)后传payload,若未设置contentType,URLFetchApp会默认将内容当作表单数据处理,对已序列化的字符串再次编码,造成双重转义。 - 直接传对象但未设置
contentType,URLFetchApp会用application/x-www-form-urlencoded格式发送,不符合CMS要求的JSON格式,因此返回400错误。
验证步骤
若仍有问题,可先验证序列化结果是否与Node.js成功发送的内容一致:
var serialized = JSON.stringify(data); Logger.log(serialized);
确认输出符合CMS要求后,再用上述options配置发送请求。
内容的提问来源于stack exchange,提问作者hcdocs
相关产品推荐
相关产品推荐

