我正在为 Google 跟踪代码管理器开发一个简单的自定义标记模板。它应该绑定到一些事件,并将事件数据作为 POST 请求正文中的 JSON 发送到我们的服务器。
沙盒 GTM Javascript 运行时提供 sendPixel() API。但是,这仅提供 GET 请求。
如何从这个沙盒运行时发送 POST 请求?
您可以使用此处找到的injectScript 和copyFromWindow API 的组合自定义模板API。
基本上,工作流程是这样的。
我上面包含的脚本还包括 JSON 编码和 Base64 编码函数,您可以通过 copyWindow api 以相同的方式使用它们。
希望有帮助。如果您需要一些特定的代码示例,我可以提供帮助。
根据@Ian Mitchell 的回答 - 我已经提出了类似的解决方案。
这是可以在 GTM 模板代码部分中使用的基本代码模式,例如场景:
const injectScript = require('injectScript');
const callInWindow = require('callInWindow');
const log = require('logToConsole');
const queryPermission = require('queryPermission');
const postScriptUrl = 'https://myPostScriptUrl'; //provide your script url
const endpoint = 'https://myEndpoint'; //provide your endpoint url
//provide your data; data object contains all properties from fields tab of the GTM template
const data = {
sessionId: data.sessionId,
name: data.name,
description: data.description
};
//add appropriate permission to inject script from 'https://myPostScriptUrl' url in GTM template's privileges tab
if (queryPermission('inject_script', postScriptUrl)) {
injectScript(postScriptUrl, onSuccess, data.gtmOnFailure, postScriptUrl);
} else {
log('postScriptUrl: Script load failed due to permissions mismatch.');
data.gtmOnFailure();
}
function onSuccess() {
//add appropriate permission to call `sendData` variable in GTM template's privileges tab
callInWindow('sendData', gtmData, endpoint);
data.gtmOnSuccess();
}
请务必记住在 GTM 模板中添加所有必要的权限。在代码部分中使用相关选项后,适当的权限将自动显示在特权选项卡中。
“https://myPostScriptUrl”处的脚本可能如下所示:
function sendData(data, endpoint) {
var xhr = new XMLHttpRequest();
var stringifiedData = JSON.stringify(data);
xhr.open('POST', endpoint);
xhr.setRequestHeader('Content-type', 'application/json');
xhr.send(stringifiedData);
xhr.onload = function () {
if (xhr.status.toString()[0] !== '2') {
console.error(xhr.status + '> ' + xhr.statusText);
}
};
}
加载外部脚本并不是绝对必要的。虽然这仍然是一种解决方法,但您还可以通过“JavaScript Variable”类型变量将获取引用传递到标记中:
我用屏幕截图记下了这一点:https://hume.dev/articles/post-request-custom-template/
我通过自定义模板和自定义 HTML 标签(按顺序在关联标签之前触发)的组合来解决此 GTM 模板限制。如果它可能有帮助,我将写一篇文章或在某个地方发布相关内容。 干杯