这是使用Golang从PUT/PATCH中忽略JSON有效负载中不需要的字段的最佳方法吗?

Mat*_*ipe 5 api json put go partial

我的情况是,使用我们的API的人需要在我的资源中进行部分更新.我理解HTTP明确指出这是一个PATCH操作,即使我们这边的人都用来发送PUT请求,这就是遗留代码的构建方式.

举例来说,想象一下简单的结构:

type Person struct {
    Name string
    Age int
    Address string
}
Run Code Online (Sandbox Code Playgroud)

在POST请求中,我将提供具有所有三个值(名称,年龄,地址)的有效负载,并在我的Golang后端上相应地验证它们.简单.

但是,在PUT/PATCH请求中,我们知道,例如,name永远不会改变.但是说我想改变它age,然后我只是发送一个包含新的JSON有效载荷age:

PUT /person/1 {age:30}
Run Code Online (Sandbox Code Playgroud)

现在我的真正问题是:name如果我们的API的消费者发送包含该name字段的JSON有效负载,防止有意或无意修改使用/更新的最佳做法是什么?

例:

PUT /person/1 {name:"New Name", age:35} 
Run Code Online (Sandbox Code Playgroud)

我想到的可能的解决方案,但我实际上并不喜欢它们,是:

  1. 在我的validator方法上,我要么强行删除不需要的字段,要么name回复一条错误消息说name不允许.

  2. 创建一个DTO对象/结构,它几乎是我的Person结构的扩展,然后将我的JSON有效负载解组到它中,例如

    type PersonPut struct { Age int Address string }

在我看来,这将添加不必要的额外代码和逻辑来抽象问题,但我没有看到任何其他优雅的解决方案.

老实说,我不喜欢这两种方法,我想知道你们是否面临同样的问题,以及你们是如何解决它的.

谢谢!

Tia*_*cia 0

我不精通 Golang,但我相信一个好的策略是将您的name字段转换为只读字段。

例如,在 Java/.NET/C++ 等严格面向对象的语言中,您可以只提供 Getter,但不能提供 Setter。

也许 Golang 有一些访问器配置,就像 Ruby 一样......

如果它是只读的,那么它不应该费心接收备用值,它应该忽略它。但同样,不确定 Golang 是否支持它。

  • 这是不正确的:“Name”字段不是“name”,并且 Go 不允许您拥有只读字段。此外,Go 通常不需要 getter 和 setter 来进行 Json 编组。 (2认同)