在Spring的JSON响应中添加绝对URL

5
我是用Spring框架构建RESTful Web服务。我发送的JSON响应包含图像URL。这些图像URL在数据库中存储为相对路径,但为了避免紧密耦合的客户端,我希望响应包括绝对URL。
例如: 不要返回以下JSON:
{"username": "user123", "profile_picture": "/user123_profile.jpg"}

我希望返回一个类似json的格式。
{"username": "user123", "profile_picture": "http://example.com/user123_profile.jpg"}

当然,图像字段可以出现在响应的任何位置,也可能出现在嵌套对象中。
拦截任何返回响应并将图像字段转换为绝对URL的最佳位置是什么?
我考虑创建一个特殊注释,例如@ImageURL用于图像字段,然后定义@ControllerAdvice,在方法beforeBodyWrite()中,遍历所有字段,并且每当我找到一个带有@ImageURL注释的字段时,我添加绝对路径。
这样可以轻松地定义新的图像字段,但它会随着每个请求/响应进行反射操作,我认为这不是好的做法。 有更好的建议吗?
1个回答

2
这种问题似乎恰恰是Spring REST HATEOAS所解决的问题之一。请参阅官方文档获取有关Spring HATEOAS API精确细节的详细信息:https://spring.io/guides/gs/rest-hateoas/
以下仅作为示例,以说明该API的工作原理(请将其视为说明性示例,请查看Spring HATEOAS API的官方文档以获取确切细节)。
@RequestMapping(value="/user/{id}", method=RequestMethod.GET)
HttpEntity<MyUserResource> getUser( @PathVariable("id") long id )
{
     MyUserResource resource = new MyUserResource( ... retrieve from db user data ... );
    .
    .
    .
    resource.add(linkTo(methodOn(MyServiceController.class).getProfilePicture( ...profile picture relative URL... )).withRel("profile_picture"));    
    .
    .
    .
    return new ResponseEntity<MyUserResource>(resource, HttpStatus.OK);
}

在上面的代码中,我做出以下假设:控制器的名称为MyServiceController,除了上面显示的用于检索用户数据的GET方法之外,它还有第二个getProfilePicture方法,响应类似于GET "/user/{id}/profile_picture/{profile picture relative url}"的URL,并返回实际的图像文件内容。
Spring REST HATEOAS提供的方法(如linkTo、methodOn等)将负责生成绝对URL映射到服务的后续REST调用。
因此,当调用http://example.com/myservice/user/123时,这将向客户端返回类似以下的JSON对象:
{
  "username":"user123",
  "links": [
      {
    "rel": "profile_picture",
    "href":"http://example.com/myservice/user/123/profile_picture/user123_profile.jpg"
    }
  ]
}

从这里开始,客户端将会知道调用标记为profile_picture的_link在你的REST服务上,以获取图片内容的绝对URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接