使用 JavaScript 查询芝麻三元组
Querying Sesame triplestore using JavaScript
我正在尝试使用 ajax 从 Sesame Triplestore 检索数据。这可能是一个 CORS 问题,我正在尝试使用 CORS 过滤器解决它。我的假设是正确的还是我需要更改代码中的某些内容?
$(document).ready(function() {
$.ajax({
url: 'http://localhost:8080/openrdf-sesame/repositories/Test12',
dataType: 'jsonp',
data: {
queryLn: 'SPARQL',
query: "SELECT * WHERE { ?s ?p ?o }",
limit: 100,
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);
});
}
我在 chrome 控制台中收到以下错误:
Resource interpreted as Script but transferred with MIME type application/sparql-results+json: "http://localhost:8080/openrdf-sesame/repositories/Test12?callback=jQuery213…=100&infer=true&Accept=application%2Fsparql-results%2Bjson&_=1429660808937". jquery-2.1.3.min.js:4
send jquery-2.1.3.min.js:4
n.extend.ajax jquery-2.1.3.min.js:4
(anonymous function) index_wip3.html:10
j jquery-2.1.3.min.js:2
k.fireWith jquery-2.1.3.min.js:2
n.extend.ready jquery-2.1.3.min.js:2
I jquery-2.1.3.min.js:2
Uncaught SyntaxError: Unexpected token : Test12:2
如果我用 application/json 替换 application/sparql-results+json,错误保持不变。
如果我将 dataType: 更改为 "json" 而不是 "jsonp",错误将更改为:
XMLHttpRequest cannot load http://localhost:8080/openrdf-sesame/repositories/Test12?queryLn=SPARQL&que…HERE+%7B+%3Fs+%3Fp+%3Fo+%7D&limit=100&infer=true&Accept=application%2Fjson. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
具体错误是 (AFAIK) Chrome-specific,并且与 Chrome 无法将 application/sparql-results+json
识别为 scripting-compatible media-type.要解决此问题,请在请求的接受参数中将媒体类型替换为 application/json
。
更一般地说,我应该指出你在这里做的不是 CORS-related。 CORS 是关于向每个 request/response 添加一组 HTTP headers 以允许来自浏览器的 cross-domain 脚本调用。在这里,您使用的是 JSONP 回调,这是一种 不同的 (较旧且安全性稍差)机制来实现相同的目的。
FWIW Sesame Server 目前尚不支持 CORS headers,尽管这在 ToDo 列表中:https://openrdf.atlassian.net/browse/SES-1757 .
我正在尝试使用 ajax 从 Sesame Triplestore 检索数据。这可能是一个 CORS 问题,我正在尝试使用 CORS 过滤器解决它。我的假设是正确的还是我需要更改代码中的某些内容?
$(document).ready(function() {
$.ajax({
url: 'http://localhost:8080/openrdf-sesame/repositories/Test12',
dataType: 'jsonp',
data: {
queryLn: 'SPARQL',
query: "SELECT * WHERE { ?s ?p ?o }",
limit: 100,
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);
});
}
我在 chrome 控制台中收到以下错误:
Resource interpreted as Script but transferred with MIME type application/sparql-results+json: "http://localhost:8080/openrdf-sesame/repositories/Test12?callback=jQuery213…=100&infer=true&Accept=application%2Fsparql-results%2Bjson&_=1429660808937". jquery-2.1.3.min.js:4
send jquery-2.1.3.min.js:4
n.extend.ajax jquery-2.1.3.min.js:4
(anonymous function) index_wip3.html:10
j jquery-2.1.3.min.js:2
k.fireWith jquery-2.1.3.min.js:2
n.extend.ready jquery-2.1.3.min.js:2
I jquery-2.1.3.min.js:2
Uncaught SyntaxError: Unexpected token : Test12:2
如果我用 application/json 替换 application/sparql-results+json,错误保持不变。
如果我将 dataType: 更改为 "json" 而不是 "jsonp",错误将更改为:
XMLHttpRequest cannot load http://localhost:8080/openrdf-sesame/repositories/Test12?queryLn=SPARQL&que…HERE+%7B+%3Fs+%3Fp+%3Fo+%7D&limit=100&infer=true&Accept=application%2Fjson. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
具体错误是 (AFAIK) Chrome-specific,并且与 Chrome 无法将 application/sparql-results+json
识别为 scripting-compatible media-type.要解决此问题,请在请求的接受参数中将媒体类型替换为 application/json
。
更一般地说,我应该指出你在这里做的不是 CORS-related。 CORS 是关于向每个 request/response 添加一组 HTTP headers 以允许来自浏览器的 cross-domain 脚本调用。在这里,您使用的是 JSONP 回调,这是一种 不同的 (较旧且安全性稍差)机制来实现相同的目的。
FWIW Sesame Server 目前尚不支持 CORS headers,尽管这在 ToDo 列表中:https://openrdf.atlassian.net/browse/SES-1757 .