GET请求与身体

时间:2020-05-20 15:25:06

标签: rest kotlin

在上一个项目中,我完成了一个像这样的控制器:

@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是否更干净?

谢谢, 弗朗切斯科

1 个答案:

答案 0 :(得分:0)

我认为您可以

  1. 多个查询参数(检查方法here
  2. 不同的api
  3. 当前方法,改用POST(请检查此discussion