【问题标题】:GET request with body带有正文的 GET 请求
【发布时间】: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 标头找出这三个中的哪一个

标签: rest kotlin


【解决方案1】:

我认为你可以用

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

【讨论】:

    猜你喜欢
    • 2016-08-24
    • 1970-01-01
    • 2018-08-02
    • 2015-07-02
    • 2020-11-14
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多