首页 > 解决方案 > 带有正文的 GET 请求

问题描述

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

@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 会更干净吗?

谢谢,弗朗西斯科

标签: restkotlin

解决方案


我认为你可以

  1. 多个查询参数(在此处查看方法)
  2. 不同的api
  3. 当前方法,使用 POST 代替(查看此讨论

推荐阅读