【发布时间】:2020-09-07 01:00:24
【问题描述】:
在我的上一个项目中,我做了一个像这样的控制器:
@GetMapping("/search")
fun findByUserContact(@RequestBody @Valid userContactDto: UserContactDto) =
userService.findByUserContact(userContactDto)
UserContactDto 是:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes(
JsonSubTypes.Type(value = Email::class, name = "email"),
JsonSubTypes.Type(value = Cellphone::class, name = "cellphone"),
JsonSubTypes.Type(value = Both::class, name = "both")
)
sealed class UserContactDto
data class Email(@field:javax.validation.constraints.Email val email: String) : UserContactDto()
data class Cellphone(@field:PhoneNumber val cellphone: String) : UserContactDto()
data class Both(
@field:javax.validation.constraints.Email val email: String,
@field:PhoneNumber val cellphone: String
) : UserContactDto()
我是这样设计API的,因为我不知道搜索是否会通过:
- 仅限电子邮件
- 仅限手机
- 电子邮件和手机
但我认为这对于 REST API 来说不是一个好的设计……带有正文的 GET 请求。 什么是解决我的用例的好方法?
自定义序列化程序查询参数 -> UserContact 是一种有效的方法吗?
为 3 种不同的情况创建不同的 API 会更简洁吗?
谢谢, 弗朗切斯科
【问题讨论】:
-
您可以通过请求中的
user-agent等 HTTP 标头找出这三个中的哪一个