Maison > développement back-end > Golang > le corps du texte

Gestion des mises à jour partielles PATCH lorsque la clé n'existe pas

王林
Libérer: 2024-02-09 15:39:18
avant
822 Les gens l'ont consulté

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

L'éditeur php d'Apple est là pour partager avec vous un problème concernant la clé qui n'existe pas lors du traitement de certaines mises à jour. Lorsque vous effectuez une requête PATCH, vous rencontrez parfois une situation dans laquelle la clé n'existe pas. Alors, comment devrions-nous y faire face ? Dans cet article, nous présenterons en détail les méthodes et les étapes pour résoudre ce problème afin de vous aider à mieux gérer cette situation et à assurer le fonctionnement normal du système. Nous allons jeter un coup d'oeil!

Contenu de la question

J'essaie de comprendre comment résoudre ce problème.

J'ai un type user 结构,上面有一些字段。但是,当为 patch 用户调用解码 json 对象时,缺少键会导致值设置为 *nil。对应的数据库属性是 text null donc lorsque la clé est manquante, le résultat sera toujours stocké comme nul.

type updateuserdto struct {
  id         uuid.uuid
  firstname  string
  lastname   string
  imageurl  *string
}
Copier après la connexion

imageurl peut être nul, mais lorsque l'objet est envoyé par le client :

{ firstName: "Jimmy" }
Copier après la connexion

Ceci se décode comme imageurl = nil,因为 json 中不存在 imageurl = nul car

n'existe pas en json.

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

解决方法

您可以实现自定义json.unmarshaler来确定是否该字段被完全省略,已提供但其值为 nullComment puis-je gérer les mises à jour partielles sans utiliser map[string]struct{} au lieu de mon dto vérifiant si chaque champ existe ?

SolutionVous pouvez implémenter un json.unmarshaler

personnalisé pour déterminer si le Le champ a été entièrement omis, a été fourni mais sa valeur était null, ou une valeur non nulle a été fournie.

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
}
Copier après la connexion
type updateuserdto struct {
    id        uuid.uuid
    firstname string
    lastname  string
    imageurl  optstring
}
Copier après la connexion
https://www.php.cn/link/22f791da07b0d8a2504c2537c560001c json.decoder (由 json.unmarshalUne autre méthode qui ne nécessite pas de type personnalisé consiste à définir la valeur du champ go sur

la valeur de la

colonne de base de données actuelle avant de démarshaler le json. Si le json entrant ne contient pas de champs correspondants, alors

en utilisant ) ne "touchera" pas les champs de la cible. 🎜
dto := loadUpdateUserDTOFromDB(conn)
if err := json.Unmarshal(data, dto); err != nil {
    return err
}
Copier après la connexion
🎜🎜https://www.php.cn/link/cdf49f5251e7b3eb4f009483121e9b64🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal