2012-05-28 5 views
2

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

$.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 

Как вы можете видеть, что я действительно получаю результат запроса-результат .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: Неожиданный токен:. Вот как первые строки ответа выглядит следующим образом:

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

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

С уважением!

+1

Я просто нашел это: http://code.google.com/p/rdf-spark/issues/detail ? id = 1 – paxRoman

+0

если это исправить вашу проблему, не стесняйтесь отвечать на свой вопрос и принимать ответ (так что другим легко понять, что такое решение). –

+0

он все еще не исправлен, вот почему он в комментарии ... Я все же отредактировал вопрос, чтобы отразить текущее состояние – paxRoman

ответ

4

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

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

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

Сценарий:

 $(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> 
+0

Да, он работает хотя бы в одном домене. На данный момент достаточно завершить мою демонстрацию. Существуют некоторые различия в вашем подходе: например, вы задаете язык запроса и запрос непосредственно в разделе данных запроса; то ваш запрос напрямую не закодирован, как мой. Поскольку я много раз пробовал использовать междоменную область, это нормально, что она не работала без поддержки jsonp. Возможно, вы рассмотрите возможность добавления поддержки jsonp в Sesame в будущем или каким-либо другим способом для поддержки междоменных запросов, поскольку приложения Linked Data могут нуждаться в этом. – paxRoman

+1

В Sesame 2.7.0 добавлена ​​поддержка обратного вызова JSONP. В стороне, просто для того, чтобы быть ясным: способ, которым я устанавливаю querylanguage и query в разделе данных, не имеет никакого значения в отправляемом фактическом запросе, его просто читать и редактировать легче. Я также тестировал все параметры, напрямую закодированные в URL-адресе, что дало тот же результат. –