我正在使用spring框架构建RESTful Web服务。我发送的JSON响应包含图像URL。图像URL存储为数据库中的相对路径,但为了避免紧密耦合客户端,我希望响应包含绝对URL。
例如: 而不是像
那样返回json{"username": "user123", "profile_picture": "/user123_profile.jpg"}
I want to return a json like
{"username": "user123", "profile_picture": "http://example.com/user123_profile.jpg"}
当然,图像字段可以位于响应中的任何位置,也可以位于嵌套对象中。
截取任何返回的响应并将图片字段转换为绝对网址的最佳位置是什么?
我想为图片字段创建一个特殊的注释,例如@ImageURL
,然后定义一个@ControllerAdvice
,在方法beforeBodyWrite()
中,我会遍历所有字段,每当我找到一个注释的字段{ {1}},我添加了它的绝对路径。
这样可以很容易地定义新的图像字段,但是对于每个我认为不好的请求/响应都有很多反映。
有更好的建议吗?
答案 0 :(得分:1)
这种问题在Spring REST HATEOAS https://spring.io/guides/gs/rest-hateoas/解决的问题中似乎很明显
下面仅举例说明API的工作原理(以此为例,请查看官方文档以获取有关Spring HATEOAS API的详细信息):
SELECT * FROM sys_online_users WHERE last_active BETWEEN DATE_SUB(NOW(), INTERVAL 10 SECOND) AND NOW()
在上面的代码中,我做了以下假设:控制器名为@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);
}
,除了上面显示的GET方法以检索用户数据外,还有第二个MyServiceController
方法响应URL,如{ {1}},返回实际的图像文件内容。
Spring REST HATEOAS提供的方法(如linkTo,methodOn等...)将负责生成对服务的后续REST调用的绝对URL映射。
因此,在调用http://example.com/myservice/user/123时,这将向客户端返回类似于以下内容的JSON对象:
getProfilePicture
从这里开始,客户端将知道在您的REST服务上调用标记为profile_picture的_link以获取图像内容的绝对URL。