Опрос магазина "Сезам" с использованием JavaScript

Я пытаюсь получить данные из Сезамского триплетов, используя ajax. Вероятно, это проблема 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 / sparql-results + json на application / 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. 

1 ответ

Решение

Конкретная ошибка (AFAIK) специфична для Chrome и связана с тем, что Chrome не распознает application/sparql-results+json как совместимый со сценариями медиа-тип. Чтобы это исправить, замените медиатип на application/json в вашем параметре Accept в запросе.

В целом, я должен отметить, что то, что вы делаете здесь, не связано с CORS. CORS - это добавление набора заголовков HTTP к каждому запросу / ответу для разрешения вызовов междоменных сценариев из браузеров. Здесь вы используете обратные вызовы JSONP, которые являются другим (более старым и немного менее безопасным) механизмом для достижения той же цели.

FWIW Sesame Server в настоящее время еще не поддерживает заголовки CORS, хотя это находится в списке ToDo: https://openrdf.atlassian.net/browse/SES-1757.

Другие вопросы по тегам