1

我有一个示例应用程序:https ://github.com/LateralThoughts/orsyp-frontend-training/tree/master/zupr_trackr 。它通过 Spring DATA/REST 处理的 REST 资源公开了 3 个 JPA 实体(CompanyEmployeeActivity )。

例如,虽然我可以通过浏览器 REST 插件成功查询 REST API,但以下查询(在同一域或另一个域上)总是返回 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 驱动的请求时,我们注意到的唯一区别是在第一种情况下没有“Referer”,而在最后一种情况下它存在。

使用 REST 附加接口添加此标头将导致请求失败,如前所述。

欢迎任何想法,提前谢谢

罗尔夫

PS:对于 GET/POST 和其他动词也是如此。

4

1 回答 1

1

Spring Data REST 不喜欢AcceptjQuery 发送的标头。

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/

这个有效。

Accept您可以使用该方法覆盖 jQuery 使用的默认标头$.ajaxSetup,或者您可以在查询 API 时简单地覆盖这些设置。

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

现在关于为什么,我认为这里的 Spring Data REST 存在问题:

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 不存在Accept的事实。text/javascript

于 2013-04-16T06:54:58.780 回答