使用AngularJS调用Play 2 REST API(CORS问题)

时间:2014-02-22 01:37:55

标签: ajax angularjs rest playframework-2.0

我正在开发一个AngularJS应用程序,调用使用Play Framework 2.2.0开发的REST API。

我遇到与跨域ajax调用相关的问题,因为Angular应用程序和Play播放器不会托管在同一个域中。

这是我的Angular服务中的JS调用:

    $http
        .post("http://localhost:9001/category/list", { langCode: 'fr-FR' })
        .success(function(data, status, headers, config) {
            callback(data.items);
        })
        .error(function(data, status, headers, config) {
            console.log("Error Data : " + data);
            console.log("Error Status : " + status);
        });

以下是我的Play应用中的路线:

POST /category/list controllers.catalog.ProductCategoryController.list()

  • 如果我没有在请求中发送任何数据,一切正常
  • 如果我发送数据,我有关于ACCESS_CONTROL_ALLOW_ORIGIN,ACCESS_CONTROL_ALLOW_HEADERS
  • 的Ajax错误

我唯一的解决方法如下:

  • 拦截Global类中的所有请求并添加标题

    @Override public Action onRequest(Request request, Method method) { return new Action.Simple() { @Override public Promise<SimpleResult> call(Context ctx) throws Throwable { Logger.debug("Intercepting request and applying CORS headers..."); ctx.response().setHeader(Controller.ACCESS_CONTROL_ALLOW_ORIGIN, "*"); ctx.response().setHeader(Controller.ACCESS_CONTROL_ALLOW_HEADERS, "Content-Type"); return delegate.call(ctx); } }; }

  • 在路线中添加另一条路线

OPTIONS /category/list controllers.catalog.ProductCategoryController.list()

有没有办法让整合更简单?

2 个答案:

答案 0 :(得分:2)

没有开箱即用的CORS支持;这是我希望改变的情况,但是现在你已经确定了一个疣。

好消息是,您可以管理全局解决方法如果您可以为所有资源设置一个CORS设置。它可以通过几种方式完成,其中一种方式是您确定的。我倾向于采用低级OPTIONS路线。

类似的东西:

OPTIONS        /*path                         controllers.Application.options()

从那里,您的处理程序定义可以是:

Ok("").withHeaders(
      "ACCESS_CONTROL_ALLOW_METHODS" -> "GET, POST, PUT, PATCH",
      "ACCESS_CONTROL_ALLOW_HEADERS"->"Content-Type", 
      "ACCESS_CONTROL_ALLOW_ORIGIN" -> "*"
)

它不是超级干净,但是直到Play增加了一些可行的东西,我认为这是你制作大量OPTIONS路线的最佳选择(再次假设你对全球CORS设置感到满意)

答案 1 :(得分:-1)

您必须为Play网络服务器启用CORS支持。以下url确实有很多方法可以配置服务器以支持跨源支持:

http://enable-cors.org/server.html