在spring json响应中添加绝对url

j13ufse2  于 2022-12-17  发布在  Spring
关注(0)|答案(1)|浏览(122)

我正在用Spring框架构建一个RESTful Web服务。我发送的JSON响应包含图像URL。图像URL在DB中存储为相对路径,但为了避免客户端紧密耦合,我希望响应包含绝对URL。
例如:而不是返回一个

{"username": "user123", "profile_picture": "/user123_profile.jpg"}

我想返回一个json,如

{"username": "user123", "profile_picture": "http://example.com/user123_profile.jpg"}

当然,图像字段可以在响应中的任何地方,也可以在嵌套对象中。
拦截任何返回的响应并将图像字段转换为绝对URL的最佳位置是什么?
我想为图像字段创建一个特殊的注解,如@ImageURL,然后定义一个@ControllerAdvice,在方法beforeBodyWrite()中,我遍历所有字段,每当我找到一个注解为@ImageURL的字段时,我就向它添加绝对路径。

  • 这很有效,可以很容易地定义新的图像字段,但每个请求/响应都有很多反射,我认为这不好 *。

有更好的建议吗?

afdcj2ne

afdcj2ne1#

这种问题似乎正是Spring REST HATEOAS 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,返回实际的图像文件内容。
SpringRESTHATEOAS提供的方法(如linkTo、methodOn等)将负责生成绝对URLMap,以Map到对服务的后续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"
    }
  ]
}

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

相关问题