1

我有一個示例應用程序:https://github.com/LateralThoughts/orsyp-frontend-training/tree/master/zupr_trackr。它通過Spring DATA/REST處理的REST資源暴露3個JPA實體(Company,Employee,Activity)。Spring Data/REST - Javascript(jQuery,backbone)restful調用最終得到404響應

雖然我可以成功地通過瀏覽器查詢REST API REST附加例如,下面的查詢(在同一個域或另一個)總是返回404:

$.getJSON("http://localhost:8080/api/companies/") 
    .success(function() { alert("success"); }) 
    .fail(function(event, jqxhr, exception) { 
     console.log(jqxhr, exception); 
    }) 
    .complete(function() { alert("Done"); } 
); 

唯一的區別我們在比較生成的HTTP請求(通過REST插件)和jQuery驅動的HTTP請求時注意到的是在第一種情況下沒有'Referer'並且它在最後一個存在。

將此頭添加到REST附加接口將導致請求失敗,如前所述。

任何想法,歡迎,謝謝提前

羅爾夫

P.S:這是GET/POST和其他動詞如此。

+0

你是否在Java端獲得任何異常? HTTP響應中是否有更詳細的錯誤消息? – elevine

+0

這不是最後的尾隨/有沒有可能?發生在我之前,你永遠不知道... –

+0

嗨感謝您的答案,這不是關於尾部斜槓,這兩個URL(有和沒有/)都是手動進行處理時。 我會將LOG級別設置爲TRACE並查看是否可以檢測到任何堆棧。 – Rolf

回答

1

Spring Data REST不喜歡jQuery發送的Accept標頭。

的jQuery將這些標題:

Accept:application/json, text/javascript, */*; q=0.01 

如果你嘗試這樣的疑問:

curl -v -XGET -H "Accept:application/json, text/javascript, */*; q=0.01" http://localhost:8080/api/employees/ 

它會失敗,因爲一個404,但如果你通過刪除text/javascript部分更改:

curl -v -XGET -H "Accept:application/json, */*; q=0.01" http://localhost:8080/api/employees/ 

這個工作。

您可以通過使用$.ajaxSetup方法覆蓋jQuery使用的默認Accept標頭,也可以在查詢API時簡單覆蓋這些設置。

$.ajax({ 
    url : "http://localhost:8080/api/employees", 
    accepts: {json:'application/json'} 
}) 

現在談談爲什麼,我覺得有一個在春季數據REST一個問題就在這裏:當Accept頭匹配

https://github.com/SpringSource/spring-data-rest/blob/master/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java#L46

,我認爲這可能是由於對於SpringData REST,不存在text/javascript的事實。