Jquery Ajax请求中的响应错误

时间:2010-09-09 15:33:52

标签: jquery ajax jsonp

我有一个脚本将一些表单数据发布到Quickbase,我得到了浏览器在Quickbase的XML响应中解释为JavaScript错误的内容。现在,数据已正确记录在Quickbase中,但我似乎无法抑制解析错误。此外,我无法访问服务器端语言 - 只是客户端JavaScript。

这是Ajax代码:

myObject.prototype.get = function (url, formdata, context, callback) {
    var options = {
        "url": url,
        "type": "GET",
        "data": formdata,
        "context": context,
        "complete": callback,
        "dataType" : "jsonp",
        "dataFilter" : function (data,type) { 
            alert(data);
        }
    };
    jQuery.ajax(options);
};

生成的URL最终如下所示: https://www.quickbase.com/db/xxxxxx?act=API_AddRecord&apptoken=xxxxxxxx&callback=jsonp1284044371978&_fid_11=www.domain.com&_fid_12=xxxxx&_fid_17=xxxxxx&_fid_6=xxxxx&_fid_10=xxxxxxxx&=No+Thanks

因为我是跨域发布的,所以我使用的是JSONP数据类型,这似乎正常工作,直到我得到这个XML响应:

<?xml version="1.0" ?>
<qdbapi>
    <action>API_AddRecord</action>
    <errcode>0</errcode>
    <errtext>No error</errtext>
    <rid>740</rid>
    <update_id>1284045768176</update_id>
</qdbapi>

然后Firebug抛出此错误:

“未终止的正则表达式文字”

<errcode>0</errcode>\n

您会看到我尝试使用dataFilter设置对响应采取行动,但我甚至无法解决此问题。该脚本运行,没有任何警报。

值得注意的是,我不关心Quickbase服务器的响应;我只是希望错误消失,因为我没有对响应做任何事情。

修改 Vivin Paliath在下面指出我得到错误的原因是因为浏览器正在寻找要返回的JavaScript,但由于QuickBase不会返回除XML之外的任何内容,我需要一种方法来销毁或改变响应 *结束编辑*

任何人都可以告诉我:

  1. 为什么dataFilter永远不会触发?
  2. 如何抑制此错误?
  3. 谢谢大家

    ----------

    更新:我将Vivin Paliath的答案标记为已接受,因为它们是正确的:如果不访问代理或服务器端语言,就无法这样做。我决定走另一个方向。这就是我所做的。

    1. 在页面上创建隐藏的iframe

      <iframe id="myHiddenIframe" name"myHiddenIframe" src="#" height="1" width="1" style="display:hidden"></iframe>

    2. 提交<form id="myForm">后,我收集并序列化了答案:

      var myAnswers = $('#myForm').serialize();

    3. 构建我想要使用的网址:

      var myUrl = 'https://www.quickbase.com/db/xxxxxxx?act=API_AddRecord&apptoken=xxxxxxxx&'+myAnswers;

    4. 将iframe推送到我创建的网址 $('#myHiddenIframe').attr('src', myUrl);

    5. ----------

2 个答案:

答案 0 :(得分:1)

如果你正在使用JSONP,那么响应应该是某种Javascript。问题似乎是它试图在XML上运行eval这是无效的Javascript(从我访问你提供的链接后我可以看到)。这就是您看到解析器错误的原因。似乎QuickBase没有生成有效的Javascript。

如果您可以访问服务器端的某些内容,则可以创建一个转发到QuickBase的代理并将XML返回给您的AJAX调用。这可能是你最好的选择(特别是如果QuickBase不支持JSONP)。

JSONP违反同源政策的方式是使用SCRIPTSCRIPT标记不符合同源策略,因此您可以加载不同域上的Javascript文件。但是,要使用JSONP,主机站点必须能够识别JSONP。这意味着如果您在请求中指定回调,则它必须返回使用您在请求中指定的回调的有效Javascript。因此,如果QuickBase可识别JSONP,则可能返回如下内容:

jsonp1284044371978({
   qdbapi: {
      action: "API AddRecord",
      errcode: 32,
      errtext: "No such database",
      errdetail: "The application does not exist or was deleted. If you followed a link to get here, you may want to inform the author of that link that the application no longer exists.",
      dbid: "xxxxxx"
   }
});

此数据现在位于SCRIPT标记中,可立即进行评估。由于您指定了回调函数,现在将使用QuickBase返回的数据调用您的回调。

您遇到的问题是QuickBook返回的数据是XML而不是Javascript。因此,您的SCRIPT标记如下所示:

<script type="text/javascript" src="https://www.quickbase.com/db/xxxxxx?act=API_AddRecord&apptoken=xxxxxxxx&callback=jsonp1284044371978&_fid_11=www.domain.com&_fid_12=xxxxx&_fid_17=xxxxxx&_fid_6=xxxxx&_fid_10=xxxxxxxx&=No+Thanks">
</script>

本质上是:

<script type="text/javascript">
<qdbapi>
   <action>API_AddRecord</action>
   <errcode>32</errcode>
   <errtext>No such database</errtext>
   <errdetail>
      The application does not exist or was deleted. If you followed a link to get here, you may want to inform the author of that link that the application no longer exists. 
   </errdetail>
   <dbid>xxxxxx</dbid>
</qdbapi>
</script>

而且,正如您所知,这不是有效的Javascript。不幸的是,在这种情况下,没有使用代理就无法解决这个问题(据我所知,你不能“拦截”SCRIPT标签收到的数据)。无论数据是如何返回的,您都可以使用代理将其包装在备用表单中,甚至可以将其作为直接XML(jQuery支持)返回。如果您有代理,而不是调用QuickBase,您将调用您的代理,后者又调用QuickBase。然后,您的代理将XML返回到您的AJAX调用。在jQuery AJAX调用{/ 1}}而不是dataType中设置xml时,您真正需要的唯一更改。

修改

根据Jon的评论,您也可以使用jsonp

答案 1 :(得分:0)

这可能会有所帮助 - https://quickbase-script-engine.heroku.com/ - 它可以返回JSON