json (p), solr, jquery 1.5.2, «не называется»? - PullRequest
2 голосов
/ 06 мая 2011

У меня есть экземпляр моментального снимка Apache Solr 4.0.Solr для тех, кто не знает, предоставляет конечную точку HTTP, которая выполняет запросы.Вы можете попросить его вернуть результаты в виде json или jsonp (или других вещей, которые не имеют отношения к делу).

Используя jquery 1.5.2, я пытался использовать $.ajax, чтобы поговорить с этим, используя код изПроект ajax-solr на github.Его автор настроил вещи для jsonp, чтобы позволить вещам работать между доменами.

Когда вы спрашиваете у solr о jsonp, это действительно делает jsonp.Он включает json в вызов функции.

В этом режиме работы (jsonp) я не смог заставить его работать ни с Chrome, ни с Firefox 4. Я сделал некоторую отладку в jquery, но у меня может бытьследовал за следом красных сельдей.

Проблема запуска заключалась в том, что solr возвращает тип содержимого «текст» вместо «приложение / json».Это, в свою очередь, запускает некоторый сложный код в jquery, который пробует несколько стратегий преобразования.

В Chrome, похоже, происходит ILLEGAL SYNTAX, когда весь кусок добавляется к узлу сценария DOM.В Firefox нет явной ошибки, но никогда не вызывается функция jsonp.

Когда я изменяю вещи, чтобы использовать простой json вместо jsonp, все работает нормально (у меня solr работает на том же хосте: port, как истатический контент, который говорит с ним.)

Я вставил гигантский кусок jsonp и связал его ниже.Это синтаксически верно.Я озадачен, но не застрял, поскольку для моего приложения использование простого json работает нормально.

Отвечающие указывают, что в текст включены символы, недопустимые в jsonp, поскольку они недопустимы в javascript в качестве объяснения дляошибка jsonp.

Код для разговора с solr:

var url = this.solrUrl + servlet + '?' + this.store.string() + '&wt=json&json.wrf=?';
jQuery.ajax({
          url: url,
          dataType: 'jsonp',
          success: function (data, textStatus, xhr) { 
                self.handleResponse(data); 
          },
          error: function(jqXHR, textStatus, errorThrown) {
              alert(textStatus + " " + errorThrown);
          }
        });

Это относится к функции ошибки с errorThrown:

errorThrown: "jQuery15205321112349629402_1304645690480 не был вызван"

Ответ выглядит как вызов функции для этого прекрасного элемента.

Консоль Chrome говорит: «Uncaught SyntaxError: Неожиданный токен ILLEGAL».

Я захватил полную загрузку JavaScript,и передал его в jsLint, у которого нет претензий.

Pastebin: http://pastebin.com/ft5rw6uT

Я собираюсь попытаться поймать исключение синтаксического анализа в chrome.

Вотгде jquery получает бросок:

     // Evalulates a script in a global context
    globalEval: function( data ) {
    if ( data && rnotwhite.test(data) ) {
        // Inspired by code by Andrea Giammarchi
        // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
        var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement,
            script = document.createElement( "script" );

        if ( jQuery.support.scriptEval() ) {
            script.appendChild( document.createTextNode( data ) );
        } else {
            script.text = data;
        }

        // Use insertBefore instead of appendChild to circumvent an IE6 bug.
        // This arises when a base node is used (#2709).
        head.insertBefore( script, head.firstChild );
        //Chrome annotates the above with:
        //jquery-1.5.2.js:593Uncaught SyntaxError: Unexpected token ILLEGAL
        head.removeChild( script );
    }
}

А вот версия, полученная с помощью CURL, с использованием более короткой строки для имени функции.

http://pastebin.com/zB6BkmEL

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Мкоряк прав в своем ответе. Ваш сервер solr должен обернуть ответ в метод, созданный вызовом jsonp. Похоже, вы приняли его совет, и теперь вы приступили к чему-то новому.

Ошибка, которую вы видите в Chrome:

'Uncaught SyntaxError: неожиданный токен ILLEGAL'.

является результатом неправильной интерпретации некоторых символов Юникода в анализаторе json. Для этого вам следует отправить сообщение об ошибке ребятам из Chrome. А пока удалите символы Юникода, такие как \ 342 \ 200 \ 251 (разрывы абзацев), и вы будете в бизнесе.

edit: Похоже, ребята из Chrome уже на вершине: http://code.google.com/p/v8/issues/detail?id=616 Поэтому TIL: http://ecma262 -5.com / ELS5_HTML.htm # Section_15.12.1.1 - Новые строки не допускаются внутри строк JSON. Возможно, мы сможем заставить ребят из Chrome улучшить обработку ошибок.

1 голос
/ 06 мая 2011

Ну, похоже, ваш обратный вызов не вызывается.Из документов:

Тип jsonp добавляет параметр строки запроса callback =?на URL.Сервер должен добавить данные JSON к имени обратного вызова, чтобы сформировать действительный ответ JSONP.

Итак, правильно ли сервер обрабатывает это?

я имею в виду, что в приведенном выше случае ответ сервера должен быть следующим:

Query15205321112349629402_1304645690480({some:json,goes:here});

он знает функцию обратного вызова, просматривая параметр обратного вызова в строке запроса.В противном случае (из документов):

Мы можем указать имя параметра, кроме обратного вызова, с опцией jsonp для $ .ajax ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...