使用 JavaScript 个 URL 模拟 JSONP 响应
Simulate a JSONP response with JavaScript URLs
我在 WP 网站上使用 Gravity Forms。我的表格 POST 通过 ajax 到 Pardot using Pardot form handlers。我 运行 遇到 Pardot 处理表单 6x 的问题,没有其他错误。研究表明,这是因为 Pardot 不支持 CORS 或 JSONP,因此在使用 ajax 提交时会陷入循环。当表单处理程序的成功 URL 被设置为引用 URL 时,它正在处理提交但从不处理 "finishing"。它在放弃之前尝试了 6 次,每次都处理提交的数据并发送新的潜在客户通知电子邮件。
Pardot help docs 建议以下解决方案:
It is possible to simulate a JSONP response by setting the Success and Error URLs for the form handler to be JavaScript URLs that execute Success and Error callbacks, respectively.
我不完全确定这意味着什么或如何处理它。我已经完成了一些 Whosebuging 和谷歌搜索,但我似乎无法全神贯注于如何去做。有人可以帮助澄清这个概念或指出正确的方向吗?
谢谢!
Pardot 建议在您自己的服务器上创建 2 个静态 URL,return 一个简单的 JSON 响应。
例如:
mysite.com/pardot-success
Returns: {"result":"success"}
mysite.com/pardot-error
Returns: {"result":"error"}
然后,您将使用这两个 URL 作为 Pardot 表单处理程序设置的成功和错误重定向 URL。
然后可以使用 JSONP 向您的 Pardot 表单处理程序发出 AJAX 请求,这将包装和 return 来自这些 URL 之一的 JSON 响应(取决于结果)。
您的 AJAX 响应数据将包括您的 JSON 结果(成功或错误)。
编辑:因此,在与此抗争几天后,我将 post 我的最终解决方案可能会帮助其他人尝试使用 JSONP 与 Pardot 进行通信。
这是一个三部分问题:
- 向 Pardot 表单处理程序发送 JSONP 请求
- 将 Pardot 表单处理程序 success/error 重定向到您自己的服务器
- Return JSON来自你服务器的P
从处理程序向 Pardot 发送 JSONP 请求
要将表单数据发送到表单处理程序,您需要对字段名称和值进行 URI 编码。
(示例使用 JQuery。'?callback=' 在指定数据类型时由 ajax() 添加:'jsonp'):
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) {...}
将 Pardot 从处理程序 success/error 重定向到您自己的服务器
查看@nickjag 的回答:
将成功位置和错误位置设置为后端端点。
由于 pardot 不会转发您传入的任何 GET 参数,因此您必须使用一些默认值,即回调函数名称(因此指定 jsonpCallback 而我的请求没有成功)。
Return JSON来自你服务器的P
我在使用时遇到了控制台错误 (Uncaught SyntaxError: Unexpected token :
) 的问题:
return "{ 'result' : 'success' }"
因为它是一个 JSON-object 而 JSONP 需要一个带有 JavaScript 的文件。所以return的格式应该是:return "callback({ 'result' : 'success' })"
同样,Pardot 不转发 GET 参数,JQuery 生成的回调函数名称没有传播,我无法 return 正确的 JavaScript 代码.如果提供了 none,则默认使用函数名称 "callback"。
这里的所有答案确实帮助我开始了这个解决方案,但我的要求是让一切都只能通过 Salesforce 工作。因此,对于仅使用 Salesforce 后端架构寻找答案的任何人,我希望这会有所帮助。我不得不以不同的方式构建我的 Ajax 调用以使其正常工作:
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 站点公开此 REST web 服务,URL 例如:
https://my-domain.server-domain.force.com/services/apexrest/pardot/success
https://my-domain.server-domain.force.com/services/apexrest/pardot/error
并且在 Pardot 表单处理程序 UI 中,将成功位置和错误位置字段分别设置为这些 URL。
这与此问题的其他答案非常相似,但完全采用 Salesforce 方法。它可能与 OPs 技术堆栈有些无关,但它应该对人们在未来寻找答案有所帮助。
我在 WP 网站上使用 Gravity Forms。我的表格 POST 通过 ajax 到 Pardot using Pardot form handlers。我 运行 遇到 Pardot 处理表单 6x 的问题,没有其他错误。研究表明,这是因为 Pardot 不支持 CORS 或 JSONP,因此在使用 ajax 提交时会陷入循环。当表单处理程序的成功 URL 被设置为引用 URL 时,它正在处理提交但从不处理 "finishing"。它在放弃之前尝试了 6 次,每次都处理提交的数据并发送新的潜在客户通知电子邮件。
Pardot help docs 建议以下解决方案:
It is possible to simulate a JSONP response by setting the Success and Error URLs for the form handler to be JavaScript URLs that execute Success and Error callbacks, respectively.
我不完全确定这意味着什么或如何处理它。我已经完成了一些 Whosebuging 和谷歌搜索,但我似乎无法全神贯注于如何去做。有人可以帮助澄清这个概念或指出正确的方向吗?
谢谢!
Pardot 建议在您自己的服务器上创建 2 个静态 URL,return 一个简单的 JSON 响应。
例如:
mysite.com/pardot-success
Returns: {"result":"success"}
mysite.com/pardot-error
Returns: {"result":"error"}
然后,您将使用这两个 URL 作为 Pardot 表单处理程序设置的成功和错误重定向 URL。
然后可以使用 JSONP 向您的 Pardot 表单处理程序发出 AJAX 请求,这将包装和 return 来自这些 URL 之一的 JSON 响应(取决于结果)。
您的 AJAX 响应数据将包括您的 JSON 结果(成功或错误)。
编辑:因此,在与此抗争几天后,我将 post 我的最终解决方案可能会帮助其他人尝试使用 JSONP 与 Pardot 进行通信。 这是一个三部分问题:
- 向 Pardot 表单处理程序发送 JSONP 请求
- 将 Pardot 表单处理程序 success/error 重定向到您自己的服务器
- Return JSON来自你服务器的P
从处理程序向 Pardot 发送 JSONP 请求
要将表单数据发送到表单处理程序,您需要对字段名称和值进行 URI 编码。
(示例使用 JQuery。'?callback=' 在指定数据类型时由 ajax() 添加:'jsonp'):
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) {...}
将 Pardot 从处理程序 success/error 重定向到您自己的服务器
查看@nickjag 的回答:
将成功位置和错误位置设置为后端端点。
由于 pardot 不会转发您传入的任何 GET 参数,因此您必须使用一些默认值,即回调函数名称(因此指定 jsonpCallback 而我的请求没有成功)。
Return JSON来自你服务器的P
我在使用时遇到了控制台错误 (Uncaught SyntaxError: Unexpected token :
) 的问题:
return "{ 'result' : 'success' }"
因为它是一个 JSON-object 而 JSONP 需要一个带有 JavaScript 的文件。所以return的格式应该是:return "callback({ 'result' : 'success' })"
同样,Pardot 不转发 GET 参数,JQuery 生成的回调函数名称没有传播,我无法 return 正确的 JavaScript 代码.如果提供了 none,则默认使用函数名称 "callback"。
这里的所有答案确实帮助我开始了这个解决方案,但我的要求是让一切都只能通过 Salesforce 工作。因此,对于仅使用 Salesforce 后端架构寻找答案的任何人,我希望这会有所帮助。我不得不以不同的方式构建我的 Ajax 调用以使其正常工作:
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 站点公开此 REST web 服务,URL 例如:
https://my-domain.server-domain.force.com/services/apexrest/pardot/success
https://my-domain.server-domain.force.com/services/apexrest/pardot/error
并且在 Pardot 表单处理程序 UI 中,将成功位置和错误位置字段分别设置为这些 URL。
这与此问题的其他答案非常相似,但完全采用 Salesforce 方法。它可能与 OPs 技术堆栈有些无关,但它应该对人们在未来寻找答案有所帮助。