gpt4 book ai didi

json - 这是使用 Golang 忽略来自 PUT/PATCH 的 JSON 负载中不需要的字段的最佳方法吗?

转载 作者:IT王子 更新时间:2023-10-29 01:27:52 33 4
gpt4 key购买 nike

我遇到这样一种情况,使用我们 API 的人需要对我的资源进行部分更新。我知道 HTTP 明确指定这是一个 PATCH 操作,即使我们这边的人习惯于为此发送 PUT 请求,这就是遗留代码的构建方式。

为了举例说明,想象一下下面的简单结构:

type Person struct {
Name string
Age int
Address string
}

在 POST 请求中,我将提供包含所有三个值(姓名、年龄、地址)的负载,并在我的 Golang 后端相应地验证它们。简单。

但是,在 PUT/PATCH 请求中,我们知道,例如,name 永远不会改变。但是如果我想更改 age,那么我只需发送一个包含新 age 的 JSON 负载:

PUT /person/1 {age:30}

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

例子:

PUT /person/1 {name:"New Name", age:35} 

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

  1. 在我的 validator 方法中,我要么强行删除不需要的字段 name 要么用错误消息响应 name不允许。

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

    类型 PersonPut 结构 {
    年龄整数
    地址字符串
    }

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

老实说,我不喜欢这两种方法,我想知道你们是否遇到过同样的问题以及你们是如何解决的。

谢谢!

最佳答案

您带来的第一个解决方案很好。一些众所周知的框架用于实现类似的逻辑。

例如,最新的 Rails 版本带有一个内置的解决方案,可以防止用户在请求中添加额外的数据,从而导致服务器更新数据库中的错误字段。它是一种由ActionController::Parameters 类实现的白名单。

假设我们有一个如下所示的 Controller 类。为了便于说明,它包含两个 update 操作。但您不会在实际代码中看到它。

class PeopleController < ActionController::Base

# 1st version - Unsafe, it will rise an exception. Don't do it
def update
person = current_account.people.find(params[:id])
person.update!(params[:person])
redirect_to person
end

# 2nd version - Updates only permitted parameters
def update
person = current_account.people.find(params[:id])
person.update!(person_params) # call to person_params method
redirect_to person
end


private

def person_params
params.require(:person).permit(:name, :age)
end

end

由于第二个版本只允许允许的值,它将阻止用户更改有效负载并发送包含新密码值的 JSON:

{ name: "acme", age: 25, password: 'account-hacked' }

有关更多详细信息,请参阅 Rails 文档:Action Controller OverviewActionController::Parameters

关于json - 这是使用 Golang 忽略来自 PUT/PATCH 的 JSON 负载中不需要的字段的最佳方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27871570/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com