2014-02-22 62 views
1

我正在開發一個AngularJS應用程序,它調用使用Play Framework 2.2.0開發的REST API。使用AngularJS調用Play 2 REST API(CORS問題)

我有一個與跨域AJAX調用相關的問題,因爲Angular應用程序和Play不會託管在同一個域中。

這裏是我的角度服務的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); 
     }); 

這裏是我的播放應用程序的路徑:

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

  • 如果我不發送任何數據請求,一切工作正常
  • 如果我發送數據,我有關於ACCESS_CONTROL_ALLOW_ORIGIN,ACCESS_CONTROL_ALLOW_HEA的Ajax錯誤DERS

我唯一的解決方法是:在全球一流

  • 攔截所有請求,並添加頁眉

    @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

有沒有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" -> "*" 
) 

這不是超級乾淨,但直到遊戲增加了一些更可行的,我認爲這是你的最佳選擇是製作大量的OPTIONS路線(同樣,假設你對全局CORS設置感到滿意)

+0

這種解決方案比我的維護更感謝!我現在接受它,我們將看到框架將如何處理這個問題。 – c4k

+0

哎@Damiya,當使用角度和播放框架將視頻上傳到'brightcove'時,我也面臨同樣的問題,但上面的解決方案對我來說並不合適。我的角碼如下:'url:'http://api.brightcove.com/services/post', header:{ 'Content-Type':file.type }, method:'POST',' –

+0

它也不適合我 – Marin

-1

您必須對您的Play網絡服務器啓用CORS支持。以下網址也有足夠的操作方法用於配置服務器啓用跨源支持:

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

+0

正如我對Ramesh說的,服務器接受我的請求,主要問題是在我必須指定一個路線兩次(選項和POST) – c4k