Heim >Backend-Entwicklung >Golang >Behandeln von PATCH-Teilaktualisierungen, wenn der Schlüssel nicht vorhanden ist

Behandeln von PATCH-Teilaktualisierungen, wenn der Schlüssel nicht vorhanden ist

王林
王林nach vorne
2024-02-09 15:39:18842Durchsuche

当密钥不存在时处理 PATCH 部分更新

Der PHP-Editor von Apple ist hier, um Ihnen ein Problem mitzuteilen, bei dem der Schlüssel bei der Verarbeitung einiger Updates nicht vorhanden ist. Wenn Sie eine PATCH-Anfrage stellen, kommt es manchmal vor, dass der Schlüssel nicht vorhanden ist. Wie sollen wir also damit umgehen? In diesem Artikel stellen wir die Methoden und Schritte zur Lösung dieses Problems im Detail vor, damit Sie besser mit dieser Situation umgehen und den normalen Betrieb des Systems sicherstellen können. Lass uns einen Blick darauf werfen!

Frageninhalt

Ich versuche herauszufinden, wie ich dieses Problem lösen kann.

Ich habe einen user 结构,上面有一些字段。但是,当为 patch 用户调用解码 json 对象时,缺少键会导致值设置为 *nil。对应的数据库属性是 text null-Typ, sodass das Ergebnis immer als Null gespeichert wird, wenn der Schlüssel fehlt.

type updateuserdto struct {
  id         uuid.uuid
  firstname  string
  lastname   string
  imageurl  *string
}

imageurl kann Null sein, aber wenn das Objekt vom Client gesendet wird:

{ firstName: "Jimmy" }

Dies wird als imageurl = nil,因为 json 中不存在 imageurl = Null dekodiert, da

in JSON nicht existiert.

map[string]struct{} 而不是我的 dto 检查每个字段是否存在的情况下处理部分更新?

解决方法

您可以实现自定义json.unmarshaler来确定是否该字段被完全省略,已提供但其值为 nullWie kann ich mit Teilaktualisierungen umgehen, ohne map[string]struct{} zu verwenden, anstatt dass mein DTO prüft, ob jedes Feld vorhanden ist?

LösungSie können benutzerdefinierte json.unmarshaler

implementieren, um zu bestimmen, ob die Das Feld wurde vollständig weggelassen, es wurde bereitgestellt, aber sein Wert war null, oder es wurde ein Wert ungleich Null angegeben.

type optstring struct {
    isvalid bool
    string  *string
}

// if a field with this type has no corresponding field in the
// incoming json then this method will not be invoked and the
// isvalid flag's value will remain `false`.
func (s *optstring) unmarshaljson(data []byte) error {
    if err := json.unmarshal(data, &s.string); err != nil {
        return err
    }
    s.isvalid = true
    return nil
}
type updateuserdto struct {
    id        uuid.uuid
    firstname string
    lastname  string
    imageurl  optstring
}
https://www.php.cn/link/22f791da07b0d8a2504c2537c560001c json.decoder (由 json.unmarshalEine andere Möglichkeit, die keinen benutzerdefinierten Typ erfordert, besteht darin, den Wert des Feldes „go“ auf den Wert der aktuellen Datenbankspalte zu setzen, bevor der JSON entmarshaliert wird. Wenn der eingehende JSON keine passenden Felder enthält, werden die Felder des Ziels durch die Verwendung von ) nicht „berührt“.

dto := loadUpdateUserDTOFromDB(conn)
if err := json.Unmarshal(data, dto); err != nil {
    return err
}

https://www.php.cn/link/cdf49f5251e7b3eb4f009483121e9b64

Das obige ist der detaillierte Inhalt vonBehandeln von PATCH-Teilaktualisierungen, wenn der Schlüssel nicht vorhanden ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen