Кросс-доменная веб-служба Play Framework - PullRequest
1 голос
/ 06 февраля 2012

Я пытался создать веб-сервис с игровой платформой. Я искал некоторый учебник и ресурс по этому поводу и в итоге использовал метод renderJSON () для предоставления веб-службы JSON RESTful.

Но, похоже, с этим связана проблема, когда я пытаюсь использовать веб-сервис с JQuery. Если я использую JSON , произойдет сбой с этой ошибкой Origin http://localhost is not allowed by Access-Control-Allow-Origin. Что кажется междоменной проблемой. Затем я пытаюсь использовать JSONP в качестве типа данных, когда JQuery пытается использовать веб-сервис, снова возникает проблема parseError.

После некоторых исследований я обнаружил, что для предоставления веб-службы запросу JSONP. Нам нужно предоставить что-то вроде функции обратного вызова. Поэтому недостаточно вернуть клиенту только объект JSON. Если я не ошибаюсь, формат должен выглядеть примерно так: {# callback-function} {# JSON-data}

Как сделать междоменный веб-сервис в Play Framework? Есть ли обходной путь для этого? Есть ли способ сохранить JSON-формат списка объектов в строке вместо того, чтобы визуализировать объект как JSON напрямую, как это делается путем вызова renderJSON () ?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Вот что я сделал. В моих маршрутах я установил формат ответа на javascript с помощью:

GET /api/projects.json Api.projects (формат: 'json')

Затем для контроллера в Api я использовал flexjson и сделал это:

public static void projects(String p) {
        JSONSerializer json = new JSONSerializer();
        List<Project> projects = Project.all().fetch(3);
        renderJSON(p + '(' + json.serialize(projects) + ')');
    }

Так что теперь вызовы jsonp можно сделать, нажав /api/projects.json?p=whither, и результат будет:

whatever([{"your":"json"}])

Вы также можете использовать flexjson для сериализации только тех частей объекта, которые вы хотите выставить.

Тестирование с помощью jquery:

$.ajax({
  url: "http://api/projects.json",
  dataType: "jsonp", 
  jsonp : 'p',
  crossDomain : true,
  success: function(data){
   console.log(data);
  }
});
0 голосов
/ 12 апреля 2012

Это прекрасно работает, но вы можете использовать объект Gson напрямую вместо объекта flexjson.

...