загружать файлы .srj с помощью jQuery ajax или getJSON

Может ли кто-нибудь показать мне пример загрузки файлов .srj, полученных в результате запроса конечной точки Sesame SPARQL с использованием getJSON jQuery? Я пытался установить заголовок Accept и другие трюки, но я все еще вижу код 200 и, по-видимому, никакой ошибки, но содержимое файла не загружается.

$.getJSON("http://localhost:8090/openrdf-sesame/repositories/myrepo?queryLn=SPARQL&query=QUERY&limit=none&infer=true&Accept=application%2Fsparql-results%2Bjson",
{
},
function(data) {
   alert('data = ', data);
});

Я пробовал что-то подобное и бесчисленное множество других вариантов, и это все еще не работает. Я должен упомянуть, что я тестировал оба случая:

  1. Tomcat не монтируется в Apache, случай, когда у нас есть междоменный запрос - и я попытался установить все, что нужно, в браузере;
  2. Tomcat смонтирован в Apache, который, насколько я знаю, не требовал ничего другого для работы, но все равно безуспешно.

Вот Заголовок запроса:

Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate
Accept-Language:en-us,en;q=0.5
Connection:keep-aliveHost:localhost:8090
Origin:http://localhost
Referer:http://localhost/d3v280/examples/ablodvis/localtest.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0

Вот Заголовок ответа:

Content-Disposition:attachment; filename=query-result.srj
Content-Language:en-US
Content-Type:application/sparql-results+json;charset=UTF-8
Date:Mon, 28 May 2012 14:06:06 GMT
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked

Как видите, я получаю результат в файле query-result.srj, но не знаю, как получить к нему доступ. Я бы очень хотел, чтобы первая версия работала, но, видимо, я что-то упускаю. Все аналогичные запросы getJSON работали.

Вот запрос, который почти работает:

 $.ajax({

        beforeSend: function(xhrObj){
                      xhrObj.setRequestHeader("Accept","application/sparql-results+json");
                },

        dataType: 'jsonp',
        url: queryUrl,
        success: function(data) {
          // callback code here
          console.log("source: " + data.length)
          alert('success!');
        }
      });

Однако он выдает «ошибку недопустимой метки» в Firefox, тогда как в Chrome он не выдает никаких ошибок, но, как я вижу во второй строке моего query-results.srj показывает Uncaught SyntaxError: Unexpected token:. Вот как выглядят первые строки ответа:

{
"head": {
    "vars": [ "s", "p", "o", "r" ]
}, 
"results": {
    "bindings": [ ...

На этот раз я могу увидеть успешно выполненный запрос и увидеть его в своем браузере (по крайней мере, в режиме отладки как в Chrome, так и в Firefox). Должен ли я понимать, что трюк jsonp не работает с Sesame? Если я возьму ответ от Sesame, скопирую его в файл, переименую в file.js и загружу с помощью $.getJSON, он будет работать нормально... Я не хочу иметь серверную часть код для этого приложения, просто для прямой обработки результата запроса SPARQL. Я легко настроил остальные источники (WorldBank, DBPedia и другие) через $.getJSON или $.ajax.

С наилучшими пожеланиями!


person paxRoman    schedule 28.05.2012    source источник
comment
Я только что нашел это: code.google.com/p/rdf -spark/issues/detail?id=1   -  person paxRoman    schedule 28.05.2012
comment
если это устранило вашу проблему, не стесняйтесь отвечать на свой вопрос и принимать ответ (чтобы другим было легко увидеть, каково решение).   -  person Jeen Broekstra    schedule 29.05.2012
comment
это все еще не исправлено, поэтому оно в комментарии ... Однако я отредактировал вопрос, чтобы отразить текущее состояние   -  person paxRoman    schedule 29.05.2012
comment
Я не очень разбираюсь в jQuery, поэтому извините, если это глупый вопрос, но: что произойдет, если вы установите тип данных «json» вместо «jsonp»?   -  person Jeen Broekstra    schedule 29.05.2012
comment
Все еще не работает. Тип данных — json, если вы отправляете обычный запрос json или jsonp (см. объясните-jsonp и json-p.org). Запрос json просто выйдет с кодом 200 при попытке его с помощью jQuery, в то время как запрос jsonp будет работать, но выдаст ошибку во второй строке файла query-results.sjr. Теперь, поскольку я ничего не менял на стороне сервера, потому что мне это не нужно/не хочется делать, единственное объяснение, кажется, в том, что Sesame не поддерживает jsonp, но почему обычный запрос не работает, трудно получить.   -  person paxRoman    schedule 29.05.2012
comment
поскольку jsonp подвергает вас всевозможным атакам, я бы предпочел использовать json напрямую, если бы только был способ получить к нему прямой доступ с помощью jQuery. У меня нет проблем с получением файла .srj с помощью CURL или Python, и он работает как шарм, за исключением того, что для этого приложения мне не нужен какой-либо дополнительный код. Я также пытался заключить все в скобки и выполнить eval(obj), но это все равно не работает. Вот еще одна ссылка mycodefixes.blogspot.com/2012/01/json-and-jsonp.html. Весь этот jsonp просто потому, что вызов ajax обычно не разрешает междоменные вызовы.   -  person paxRoman    schedule 29.05.2012


Ответы (1)


Я только что написал свой собственный простой сценарий JQuery, чтобы проверить это, и, похоже, все работает так, как ожидалось. Мне потребовалось некоторое время, чтобы заставить его работать, но в основном это было связано с тем, что мой скрипт не работал на том же сервере, что и Sesame.

Обновите, чтобы ответить на ваш вопрос о jsonp: начиная с версии 2.7.0 Sesame поддерживает обратные вызовы JSONP (см. SES-1019).

Но при условии, что сценарий JQuery работает на том же хосте, что и сервер sesame, следующий сценарий выводит результат запроса в виде таблицы. Я не совсем понял, что я делаю иначе, чем вы, и я не утверждаю, что это наиболее эффективно для обработки результатов, но, по крайней мере, это работает, поэтому я надеюсь, что это будет полезно.

Скрипт:

      $(document).ready(function() {
      $.ajax({
                url: 'http://localhost:8080/openrdf-sesame/repositories/test',
                dataType: 'json', 
                data: { 
                    queryLn: 'SPARQL',
                    query: "SELECT * WHERE { ?s ?p ?o }", 
                    limit: 'none',
                    infer: 'true',
                    Accept: 'application/sparql-results+json'
                },
                success: displayData, 
                error: displayError
        });
    });

    function displayError(xhr, textStatus, errorThrown) {
        alert(textStatus);
        alert(errorThrown);
    }

    function displayData(data) {
        var header = $('#result thead').append('<tr/>');
        $.each(data.head.vars, function(key,value) {
            header.append("<th>" + value + "</th>");
        });


        $.each(data.results.bindings, function(index, bs) {
        var row = $('<tr/>');
        $.each(data.head.vars, function(key, varname) {
            row.append("<td>" + bs[varname].value + "</td>"); 
            });
        $("#result tbody").after(row);
        });
    }

Тело HTML содержит пустую таблицу:

  <table id="result" border=1>
  <thead/>
     <tbody/>
  </table>
person Jeen Broekstra    schedule 29.05.2012
comment
Да, это работает по крайней мере на том же домене. На данный момент достаточно, чтобы закончить мою демонстрацию. В вашем подходе есть некоторые отличия: например - вы задаете язык запроса и сам запрос прямо в разделе данных запроса; тогда ваш запрос не закодирован напрямую, как мой. Поскольку большую часть времени я пытался использовать междоменный доступ, это нормально, что он не работал без поддержки jsonp. Возможно, вы рассмотрите возможность добавления поддержки jsonp в Sesame в будущем или какой-либо другой способ поддержки междоменных запросов, поскольку это может понадобиться приложениям связанных данных. - person paxRoman; 30.05.2012
comment
Поддержка обратного вызова JSONP была добавлена ​​в Sesame 2.7.0. Кстати, просто для ясности: то, как я устанавливаю язык запросов и запрос в разделе данных, не влияет на фактический отправляемый запрос, его просто легче читать и редактировать. Я также протестировал все параметры, непосредственно закодированные в URL-адресе, что дало тот же результат. - person Jeen Broekstra; 02.09.2014