rest - 为什么我不能获得 HAL 支持以在 grails 2.3.8 中工作?

标签 rest grails hateoas

我按照文档中的说明操作,此处:

http://grails.org/doc/2.3.8/guide/webServices.html#hypermedia

为什么 grails 不能生成 HAL 格式的输出,如文档中所示?

我有一个用@Resource 注释映射的领域对象:

@Resource(uri='/documentCatalogs', formats = ['json', 'xml'], readOnly = true)
class DocumentCatalog {
    String entityType
    String actionCode
    ...
}

...在我的 conf/spring/resources.groovy 中,我配置了 HAL JSON 渲染器 bean:

import com.cscinfo.platform.api.formslibrary.DocumentCatalog
import grails.rest.render.hal.HalJsonCollectionRenderer
import grails.rest.render.hal.HalJsonRenderer

// Place your Spring DSL code here
beans = {
    halDocumentCatalogRenderer(HalJsonRenderer, DocumentCatalog)
    halDocumentCatalogCollectionRenderer(HalJsonCollectionRenderer, DocumentCatalog)
}

使用调试器,我确认调用了 HalJsonRenderer 上的 initialize() 方法,并且它是使用正确的 targetType 构造的。

我使用 Postman 发送休息电话:

http://localhost:8080/formslibrary/documentCatalogs/3
Accept application/hal+json

然后我得到一个常规 JSON 响应,不包含任何链接:

{
    "class": "com.cscinfo.platform.api.formslibrary.DocumentCatalog",
    "id": 3,
    "actionCode": "WITH",
    "entityType": "LLP",
...
}

我错过了什么?是否必须为此行为启用某些插件或配置设置?是否有一些未记录的其他映射属性?

最佳答案

想通了!修复有多个方面...

我必须在@Resource 注释中添加“hal”作为列出的格式之一:

@Resource(uri='/documentCatalogs', formats = ['json', 'xml', 'hal'])

调试器中的一些搜索显示,Grails 将根据从客户端发送的 UserAgent 字符串,愉快地忽略 Accept header 。 (在我的例子中,因为我使用的是 Postman,所以它是 Google Chrome UA 字符串。)

Accept header 问题的一种解决方法是将“.hal”添加到 URL 的末尾:

http://localhost:8080/formslibrary/documentCatalogs/3.hal

在我看来,这不是一个很好的解决方案,因为渲染器生成的 HAL URL 默认情况下不会以“.hal”结尾。

更好的解决方案是通过更新配置来修复 Grails 对接受 header 的处理。在 Config.groovy 中,您会看到一行内容:

grails.mime.disable.accept.header.userAgents = ['Gecko', 'WebKit', 'Presto', 'Trident']

将其更改为:

grails.mime.disable.accept.header.userAgents = ['None']

这会强制 Grails 接受 Accept header ,而不管用户代理是什么。

希望这对遇到同样问题的其他人有所帮助。

附言在 ResponseMimeTypesApi#getMimeTypesFormatAware(...) 方法中放置断点非常有用。

关于rest - 为什么我不能获得 HAL 支持以在 grails 2.3.8 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24071604/

相关文章:

javascript - 相当于jquery中的angularjs拦截器

django - Web API 的用途是什么

model-view-controller - RESTful API/MVC 应用程序的 Grails 与 JAX-RS

java - 是否有适用于 java for sdkman for grails、groovy 和 gradle 的 sdk 管理器

Grails 错误代码

rest - 完全 RESTful(包括 HATEOAS)客户端可以在客户端状态下存储服务器提供的 URI 吗?

rest - REST API 真的是 RPC 吗?罗伊·菲尔丁似乎也这么认为

rest - 实体管理器为空。在 WAS-Liberty 上使用 JAX-RS 和 JPA

rest - 测试 HATEOAS URL

django - Tastypie "always_return_data"选项更改响应状态代码