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的事实。