【问题标题】:Play Framework Cross Domain Web ServicePlay框架跨域Web服务
【发布时间】:2012-02-28 04:37:12
【问题描述】:

我一直在尝试创建一个带有播放框架的 Web 服务。我搜索了一些关于此的教程和资源,最终使用 renderJSON() 方法来提供 JSON RESTful Web 服务。

但是,当我尝试使用 JQuery 使用 Web 服务时,似乎存在问题。如果我使用 JSON,它会失败并出现此错误 Origin http://localhost is not allowed by Access-Control-Allow-Origin。这似乎是一个跨域问题。然后我尝试使用 JSONP 作为 JQuery 尝试使用 Web 服务时的数据类型,再次出现 parseError 问题。

经过一番研究,我发现要为 JSONP 请求提供 Web 服务。我们需要提供类似回调函数的东西。因此,仅将 JSON 对象返回给客户端是不够的。如果我没记错的话,格式应该类似于 {#callback-function}{#JSON-data}

如何在 Play Framework 中制作跨域 Web 服务?有什么解决方法吗? 有没有办法将对象列表的 JSON 格式保留为字符串,而不是像调用 renderJSON() 那样直接将对象呈现为 JSON?

【问题讨论】:

    标签: json web-services rest playframework jsonp


    【解决方案1】:

    这就是我所做的。在我的路线中,我将响应的格式设置为 javascript:

    GET /api/projects.json Api.projects(format:'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) + ')');
        }
    

    所以现在可以通过点击 /api/projects.json?p=whatever 来进行 jsonp 调用,返回将是:

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

    您也可以使用 flexjson 仅序列化您想要公开的对象部分。

    用 jquery 测试它:

    $.ajax({
      url: "http://api/projects.json",
      dataType: "jsonp", 
      jsonp : 'p',
      crossDomain : true,
      success: function(data){
       console.log(data);
      }
    });
    

    【讨论】:

    • 不要自己做 p/括号的事情,而是使用 play.libs.Jsonp.jsonp
    【解决方案2】:

    这很好用,但您可以直接使用 Gson 对象而不是 flexjson 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-15
      • 2012-03-29
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 2018-07-31
      • 2015-07-22
      • 2011-02-11
      相关资源
      最近更新 更多