Ошибка в ответе на запрос Jquery Ajax - PullRequest
3 голосов
/ 09 сентября 2010

У меня есть скрипт, который публикует некоторые данные формы в Quickbase, и я получаю то, что браузер интерпретирует как ошибку JavaScript в XML-ответе Quickbase.В данный момент данные должным образом записываются в 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;Я просто хочу, чтобы ошибка исчезла, поскольку я ничего не делаю с ответом.

Редактировать Вивин Палиат указал ниже, что причина, по которой я получаю ошибкупотому что браузер ищет возвращаемый JavaScript, но поскольку QuickBase не возвращает ничего, кроме XML, мне нужен способ уничтожить или изменить ответ * Завершить редактирование *

Можеткто-нибудь скажет мне:

  1. Почему DataFilter никогда не срабатывает?
  2. Как я могу устранить эту ошибку?

Спасибо всем

----------

Обновление: я отмечаю ответ Вивин Палиат как принятый, потому что он правильный: вы не можете сделать это таким образом без доступа к прокси или языкам на стороне сервера.Я решил пойти в другом направлении.Это то, что я сделал.

  1. Создание скрытого фрейма на странице

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

  2. После представления<form id="myForm">, я собрал и сериализовал ответы:

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

  3. Построил URL, который я хочу использовать:

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

  4. Переместил iframe на созданный мной URL $('#myHiddenIframe').attr('src', myUrl);

----------

Ответы [ 2 ]

1 голос
/ 09 сентября 2010

Если вы используете JSONP, то ответ должен быть неким Javascript.Кажется, проблема в том, что он пытается запустить eval на XML, который не является допустимым Javascript (из того, что я вижу после того, как я получил доступ к указанной вами ссылке).Вот почему вы видите ошибку синтаксического анализатора.Кажется, что QuickBase не генерирует допустимый Javascript.

Если у вас есть доступ к чему-либо на стороне сервера, вы можете создать прокси, который переходит в QuickBase и возвращает XML для вашего вызова AJAX.Это, вероятно, ваш лучший выбор (особенно если QuickBase не поддерживает JSONP).

Способ, которым JSONP побеждает политику того же происхождения, заключается в использовании SCRIPT.Тег SCRIPT не соответствует политике того же источника, и поэтому вы можете загружать файлы 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.Единственное изменение, которое вам действительно нужно, это установить dataType в вызове jQuery AJAX на xml вместо jsonp.

EDIT

Согласно комментарию Джона,Вы также можете использовать IFRAME.

0 голосов
/ 10 сентября 2010

Это может помочь - https://quickbase -script-engine.heroku.com / - может вернуть JSON

...