【问题标题】:load .srj files with jQuery's ajax or getJSON使用 jQuery 的 ajax 或 getJSON 加载 .srj 文件
【发布时间】:2012-05-28 11:55:44
【问题描述】:

谁能给我看一个例子,说明如何加载使用 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 中 - 据我所知不需要 任何其他工作,但仍然没有成功。

这是请求标头

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 等)。

最好的问候!

【问题讨论】:

  • 如果解决了您的问题,请随意回答您自己的问题并接受答案(这样其他人很容易看到解决方案是什么)。
  • 它仍然没有修复,这就是它在评论中的原因......但我确实编辑了问题以反映当前状态
  • 我对 jQuery 不是很有经验,如果这是个愚蠢的问题,很抱歉,但是:如果将数据类型设置为 'json' 而不是 'jsonp' 会发生什么?
  • 还是不行。如果您发出普通的 json 请求,则数据类型为“json”或“jsonp”(参见stackoverflow.com/questions/2067472/please-explain-jsonpjson-p.org)。使用 jQuery 尝试时,json 请求将仅以代码 200 退出,而 jsonp 请求将起作用,但会在 query-results.sjr 文件的第二行引发错误。现在由于我没有在服务器端进行任何更改,因为我不需要/不想这样做,唯一的解释似乎是 Sesame 不支持 jsonp,但为什么正常请求不起作用很难得到。

标签: javascript jquery json sesame


【解决方案1】:

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

【讨论】:

  • 是的,它至少在同一个域上工作。现在完成我的演示就足够了。您的方法存在一些差异:例如 - 您直接在请求的数据部分设置查询语言和查询;那么您的查询不会像我的那样直接编码。由于我大部分时间都在尝试跨域,因此如果没有 jsonp 支持,它就无法工作是正常的。也许您将来会考虑在 Sesame 中添加 jsonp 支持,或者其他方式来支持跨域查询,因为关联数据应用程序可能需要它。
  • Sesame 2.7.0 中添加了 JSONP 回调支持。顺便说一句,要明确一点:我在数据部分设置查询语言和查询的方式对发送的实际请求没有影响,只是更容易阅读和编辑。我还测试了直接在 url 中编码的所有参数,结果相同。
猜你喜欢
  • 2016-11-03
  • 2012-12-02
  • 2010-10-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
相关资源
最近更新 更多