使用jQuery的ajax或getJSON加载.srj文件

时间:2012-05-28 11:55:44

标签: javascript jquery json sesame

有人能告诉我如何加载使用 jQuery的getJSON 查询 Sesame SPARQL 端点所产生的.srj文件的示例吗?我已经尝试设置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中 - 据我所知,这不是必需的 其他任何工作,但仍然没有成功。
  3. 以下是请求标头

    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中它不会引发任何错误,但正如我在查询结果的第二行上看到的那样。 srj 文件显示 Uncaught SyntaxError:Unexpected token:。以下是响应的第一行:

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

    这一次,我能够看到请求成功完成并在我的浏览器中看到它(至少在Chrome和Firefox的调试模式下)。我应该理解jsonp技巧不适用于Sesame吗?如果我从Sesame中获取答案,将其复制到一个文件中,将其重命名为 file.js 并使用$ .getJSON加载它可以正常工作...我不想让任何服务器端此应用程序的代码,只是直接处理SPARQL查询的结果。我可以通过$ .getJSON或$ .ajax轻松设置其余的源(WorldBank,DBPedia和其他)。

    祝你好运!

1 个答案:

答案 0 :(得分:4)

我刚刚编写了我自己的简单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>