使用JavaScript URL模拟JSONP响应

时间:2017-11-01 02:48:41

标签: javascript ajax cors jsonp pardot

我在WP网站上使用Gravity Forms。我的表单使用Pardot Pardot通过ajax发送到form handlers。我遇到了Pardot处理表单6x的问题,没有其他错误。研究表明,这是因为Pardot不支持CORS或JSONP,因此在使用ajax提交时会陷入循环。它处理提交但从未"完成"当表单处理程序的成功URL设置为引用URL时。它在放弃之前尝试6次,处理提交的数据并每次发送新的潜在客户通知电子邮件。

Pardot help docs提出以下解决方案:

  

可以通过将表单处理程序的成功和错误URL分别设置为执行成功和错误回调的JavaScript URL来模拟JSONP响应。

我不完全确定这意味着什么或如何处理它。我已经做了一些stackoverflowing和谷歌搜索,但我似乎无法绕过如何做到这一点。有人可以帮助澄清这个概念或指出我正确的方向吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

编辑:所以,经过几天的战斗,我会发布我的最终解决方案,这可能会帮助其他人尝试使用JSONP与Pardot沟通。 这是一个三部分问题:

  1. 向Pardot表单处理程序发送JSONP请求
  2. 将Pardot表单处理程序成功/错误重定向到您自己的服务器
  3. 从您的服务器返回JSONP
  4. 向Pardot From Handler发送JSONP请求

    要将表单数据发送到表单处理程序,您需要对字段名称和值进行URI编码。

    (使用JQuery的示例。在指定dataType时,'?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重定向到您自己的服务器

    见@ nickjag的回答:

    将成功位置和错误位置设置为后端的端点。

    由于pardot不会转发你传入的任何GET参数,你必须使用一些默认值,即回调函数名称(因此指定jsonpCallback并且在我的请求中没有成功)。

    从您的服务器返回JSONP

    使用时我遇到控制台错误(Uncaught SyntaxError: Unexpected token :)问题: return "{ 'result' : 'success' }"因为它是一个JSON对象而JSONP需要一个带有JavaScript的文件。因此,要返回的格式应为:return "callback({ 'result' : 'success' })"

    再次Pardot不转发GET参数,JQuery生成的回调函数名称没有传播,我无法返回正确的JavaScript代码。如果没有提供,则默认使用函数名称“callback”。

    Guide for returning JSONP from .NET MVC backend

答案 1 :(得分:1)

Pardot建议在您自己的服务器上创建2个静态URL,以返回简单的JSON响应。

例如:

  1. mysite.com/pardot-success
  2. 返回:{"result":"success"}

    1. mysite.com/pardot-error
    2. 返回:{"result":"error"}

      然后,您将使用这两个网址作为Pardot表单处理程序设置的成功和错误重定向网址。

      然后可以使用JSONP向您的Pardot表单处理程序发出AJAX请求,JSONP将从其中一个URL包装并返回JSON响应(取决于结果)。

      您的AJAX响应数据将包含您的JSON结果(成功或错误)。

答案 2 :(得分:0)

这里的所有答案确实有助于我继续使用该解决方案,但我的要求是使所有内容只能通过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网站在以下URL上公开此REST Web服务:

  

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技术堆栈无关,但对于将来寻找答案的人们应该有所帮助。