2015-02-07 37 views
2

我的項目有一個奇怪的問題。我決定在Spring中編寫服務器應用程序,並使用AngularJS編寫前端程序。 在服務器端,我有一個簡單的控制器,從簡單的實體返回一些簡單的數據;)。它看起來像這樣:Spring&AngularJS - 與RESTful API的連接

@RestController 
public class ApiController 
{ 
    @RequestMapping(value = "/getAllProfiles", method = RequestMethod.GET) 
    public Entity getEntity() 
    { 
     Entity e = new Entity(); 
     e.setName("myname"); 
     return e; 
    } 
} 

在正面,我有一個Angulars控制器,它看起來像:

var app = angular.module('app', []); 

app.config(function($httpProvider) { 
    $httpProvider.defaults.useXDomain = true; 
    delete $httpProvider.defaults.headers.common['X-Requested-With']; 
}); 

app.controller('Hello', function ($scope, $http) { 
    $http.get({ 
     method: 'GET', 
     url: 'http://localhost:8080/getAllProfiles' 
    }).success(function (data) { 
     console.log('success', data) 
     $scope.greeting = data; 
    }).error(function(){ 
     console.log("something goes wrong"); 
    }); 
}) 

和HTML文件:

<html ng-app="app"> 
<head> 
    <title>Hello AngularJS</title> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.12/angular.min.js"></script> 
    <script src="view1.js"></script> 
</head> 
<body> 
<div ng-controller="Hello"> 
    <p>The content is {{greeting.name}}</p> 
</div> 
</body> 
</html> 

當我啓動服務器,我連接到localhost:8080/getAllProfiles,一切正常。我收到像這樣的JSON {"name":"myname"}。但是,當我嘗試從Angular端執行同樣的操作時,我收到了The content is - 來自服務器的空數據,當然錯誤函數正在調用控制器。我認爲這可能是一個CORS問題,但我在服務器端添加了過濾器,而在Angular端添加了過濾器,但它沒有幫助。 js控制檯(我正在使用Chrome)說:無法加載資源:服務器響應狀態爲404(未找到)

我真的不知道該怎麼做。我希望在這兩個應用程序之間「交談」,但是我不能因爲這個原因。 如果有人能幫助我,我會非常感激。

+0

它可能沒有什麼區別,但我看到你在http的配置中設置GET方法名稱。得到要求,當然你不需要這條線,它已經是GET – mindparse 2015-02-07 21:40:34

+0

是的,我知道。此http的結構之間的變化不能解決問題。 – allocer 2015-02-07 21:54:18

+0

如果您已經檢查過CORS不是問題,那麼您是否也仔細檢查過a)Spring應用程序正在偵聽8080以及b)沒有綁定的基本路徑(即某些/ foo/getAllProfiles) ? – h7r 2015-02-07 21:55:33

回答

0

如果CORS是本地主機上的問題,那麼您可以使用grunt-connect-proxy。 定義您咕嚕文件:

proxies: [ 
       { 
        context: '/', 
        host: '127.0.0.1', 
        port: 8080, 
        https: false, 
        xforward: false 
       } 
      ] 

不要忘記connext代理任務添加到您的任務。 在網站上一切都清楚解釋。 這將解決localhost中的跨域問題。 然後,你可以打電話給你的服務器在你的控制器:

$http.get({ 
     method: 'GET', 
     url: '/getAllProfiles' 
    }) 

它的工作,因爲呼嚕聲將您的應用程序的角度端口上運行的代理。

順便說一句。 您是否嘗試過通過單元測試來測試角邏輯? 使用$ httpbackend模擬與您的Spring應用程序完全相同的後端,您將看到結果。

+0

不,我沒有測試它。感謝你,我會這樣做。你能告訴更多關於這個咕嚕聲嗎?我需要將其添加到我的角度應用程序,並將其設置爲一些配置? – allocer 2015-02-07 22:01:37

+0

你用咕嚕聲嗎?它是咕嚕聲 - 一個爲你編譯項目的工具。沒有它,我不知道是否有代理。 – cyan 2015-02-07 22:11:29

+0

我已將Grunt安裝到我的項目中。我不知道,也許我做了一些錯誤的事情,但是我使用了本教程http://gruntjs.com/getting-started和自述文件,您在上面的帖子中提供了鏈接。它仍然不起作用。我正在使用WebStrom到我的前臺應用程序和IntelliJ到服務器應用程序。當我從WebStorm測試我的休息服務時,它工作正常(工具 - >測試RESTful服務)。我有Grunt,我有一個Gruntfile並且問題沒有解決。 – allocer 2015-02-07 23:03:18

0

好的,最後問題解決了。謝謝你的青睞,Grunt是一個解決方案。

我想爲不想閱讀本主題中所有內容的人介紹此解決方案。 ;) 我想從一些Angular應用程序連接到我的Spring REST API(2個分離的應用程序),但是我無法做到這一點,因爲我的本地主機上存在代理問題。我已經爲我的Angular應用程序安裝了一個Grunt,對此進行了配置,啓動了服務器並試圖從中獲取數據。它脫落了。 當然,需要服務器端的CORS過濾器。他們是在這裏描述https://spring.io/guides/gs/rest-service-cors/

我用這個教程,幫助我與它: http://www.hierax.org/2014/01/grunt-proxy-setup-for-yeoman.html http://fettblog.eu/blog/2013/09/20/using-grunt-connect-proxy/ 和青色GitHub的鏈接。

+0

我有完全相同的問題,我已經爲我的extJS應用程序安裝了Grunt,並試圖在我的Spring MVC(&security)服務器應用程序上安裝CORS過濾器,但它不起作用。我如何檢查服務器端的CORS過濾器? – Amir 2016-04-09 10:02:55