Pardot的帮助文档提供了以下解决方案:
我不太确定这是什么意思或如何处理它。我在stackoverflow和google上查找了一些资料,但似乎无法理解如何实现它。能否有人帮助澄清这个概念或指导我正确的方向?可以通过将表单处理程序的成功和错误URL设置为执行成功和错误回调的JavaScript URL来模拟JSONP响应。
谢谢!
我不太确定这是什么意思或如何处理它。我在stackoverflow和google上查找了一些资料,但似乎无法理解如何实现它。能否有人帮助澄清这个概念或指导我正确的方向?可以通过将表单处理程序的成功和错误URL设置为执行成功和错误回调的JavaScript URL来模拟JSONP响应。
要将表单数据发送到表单处理程序,您需要对字段名称和值进行URI编码。
(使用JQuery的示例。当指定dataType: 'jsonp'时,ajax()会添加“?callback=”):
var data = { 'field1' = 'value1', 'field' = 'value2' };
var uriEncodedParams = $.param(data);
var targetUrl = <Pardot Form Handler URL> + '?' + uriEncodedParams;
$.ajax({
url: targetUrl,
dataType: 'jsonp',
jsonpCallback: 'callback'
});
window.callback = function (data) {...}
请参见@nickjag的答案:
将成功位置和错误位置设置为后端上的终点。
由于pardot不会转发您传递的任何GET参数,因此您必须在回调函数名称上使用一些默认值(因此在我的请求中指定jsonpCallback而没有成功)。
当我使用return "{ 'result' : 'success' }"
时,我遇到了控制台错误(Uncaught SyntaxError: Unexpected token :
),因为它是一个JSON对象,而JSONP需要一个JavaScript文件。因此,返回的格式应该是:return "callback({ 'result' : 'success' })"
由于Pardot不会转发GET参数,因此JQuery生成的回调函数名称没有传播,因此我无法返回正确的JavaScript代码。如果未提供,则默认使用函数名“callback”。
var data = { 'username': username };
var uriEncodedParams = $.param(data);
var targetUrl = 'https://my.pardot.url' + '?' + uriEncodedParams;
$.ajax({
url: targetUrl,
type: 'GET',
dataType: 'jsonp',
crossDomain: true
});
window.callback = function(data) {
performMoreActions(data);
}
我的服务器是用Apex(Salesforce的编程语言)构建的,它看起来像这样:
@RestResource(urlMapping='/pardot/success/*')
global without sharing class Pardot_SuccessProxy {
@HttpGet
global static void Pardot_SuccessProxy() {
RestContext.response.addHeader('Content-Type', 'application/json');
RestContext.response.responseBody = (Blob.valueOf('callback({ "result" : "success" })'));
}
}
然后我通过Salesforce SITE将这个REST webservice公开,URL类似于:
在Pardot表单处理程序UI中,将成功位置和错误位置字段分别设置为这些URL。https://my-domain.server-domain.force.com/services/apexrest/pardot/success
https://my-domain.server-domain.force.com/services/apexrest/pardot/error
感谢这里所有的答案,在一天的头痛之后,我终于想出了如何使用原生JS(使用Vue)使其工作。我想在这里发布帖子,以帮助避免任何可怜的灵魂经历同样的挫折。
成功/错误的JS文件应该在同一个域上
success.js:
logResult({ result: 'success' });
error.js:
logResult({ result: 'error' });
将这些URL添加到Pardot表单处理程序中的“成功位置”和“错误位置”字段中
Jsonp函数
我使用vue构建了这个网站,所以我将下面的函数添加到/asses/js/util.js中
// Copyright (c) 2017 Ziqiang Li - copied and edited from https://github.com/liziqiang/simple-jsonp-promise/blob/master/src/index.js
// Callback index.
let count = 0;
function jsonp(url, options) {
options = options || {};
const prefix = options.prefix || 'logResult';
const callback = options.callback || 'callback';
const callbackName = options.callbackName;
const params = options.data || {};
const target = document.getElementsByTagName('script')[0] || document.head;
let script;
let timer;
// Generate a unique id for the request.
const id = callbackName || prefix + count++;
function noop() {}
function cleanup() {
// Remove the script tag.
if (script && script.parentNode) {
script.parentNode.removeChild(script);
}
window[id] = noop;
if (timer) {
clearTimeout(timer);
}
}
function serialize(params) {
let param = '';
for (const key in params) {
if (params.hasOwnProperty(key)) {
param += `&${key}=${encodeURIComponent(params[key])}`;
}
}
return param;
}
function handleUrl(url, params) {
if (!~url.indexOf('?')) { url += '?'; }
url += serialize(params);
url = url.replace('?&', '?');
return url;
}
return new Promise((resolve, reject) => {
window[id] = function(data) {
cleanup();
resolve(data);
};
if (!callbackName) {
params[callback] = id;
}
url = handleUrl(url, params);
// Create script.
script = document.createElement('script');
script.src = url;
window.logResult = function(json) {
if (json.result === 'success') {
resolve();
} else if (json.result === 'error') {
reject(new Error('Error'));
}
};
script.onerror = function() {
cleanup();
reject(new Error('Network Error'));
};
target.parentNode.insertBefore(script, target);
});
}
export default jsonp;
<script>
import jsonp from '@/assets/js/util';
export default {
name: 'FormTest',
data() {
return {
firstname: '',
lastname: '',
email: '',
};
},
methods: {
submit() {
const options = {
data: {
firstname: this.firstname,
lastname: this.lastname,
email: this.email,
},
};
jsonp('PARDOT_FORM_HANDLER_URL', options).then(() => {
console.log('success');
}).catch(err => {
console.error(err);
});
},
},
};
</script>