Si la définition d'une upsert est un mélange de nouveaux enregistrements avec des enregistrements existants (à mettre à jour).
Se référant à : https://restfulapi.net/rest-put-vs-post/
PUT doit être idempotent. Cela signifie que si vous envoyez la même charge utile une deuxième fois, l'état du système ne doit pas être modifié.
Si la charge utile prévue est un mélange de nouveaux et d'anciens enregistrements et que le comportement attendu est de créer plus de nouveaux enregistrements la deuxième fois, il semblerait que "upsert" soit plus proche de POST.
Nous nous efforçons de créer des API tolérantes aux erreurs. Si vous ne pouvez pas rendre le PUT idempotent et qu'ils doivent l'utiliser, ils pourraient corrompre le système. D'autre part, POST n'est pas censé être idempotent, donc si vous envoyez des données de mise à jour uniquement (encore et encore) dans les données utiles (même si cela viole techniquement la règle d'idempotence pour POST parce que cela ne change pas l'état du système en ajoutant des enregistrements lors des appels suivants), le système ne serait (probablement) pas corrompu.
- La spécification indique que PUT "peut" ajouter de nouveaux éléments et "doit" être idempotent.
- Il dit que POST "doit" ajouter de nouveaux éléments et n'est pas idempotent.
Si vous voulez vraiment mettre en œuvre un upsert, aucun des deux n'est parfait, mais si des erreurs provoquent une corruption sur PUT, l'API est à blâmer (elle est censée être idempotente) alors que la corruption sur POST est "je vous l'avais dit".
J'aime aussi penser à ce que le consommateur d'API recherchera. En général, un développeur d'interface utilisateur travaillant sur un nouvel écran cherchera à ajouter les enregistrements que l'utilisateur a ajoutés dans l'interface utilisateur. Il cherchera d'abord un POST, puis découvrira que l'API gère également le côté PUT de l'équation.
Donc, ni l'un ni l'autre, mais si vous devez choisir, choisissez POST.