web-dev-qa-db-fra.com

Itinéraire approprié pour vérifier l'existence d'une ressource dans une API RESTful

Quelle est la meilleure façon/reposante de concevoir un point de terminaison API pour vérifier l'existence de ressources?

Par exemple, il existe une base de données d'utilisateurs. Tandis que le nouvel utilisateur essaie de s’inscrire, je veux vérifier si le courrier électronique a été utilisé à la volée.

Mon idée est la suivante: POST /user/exists et la charge utile serait quelque chose comme {"email": "[email protected]"}. La réponse serait 200 OK ou 409 Conflict.

Est-ce une bonne façon?

Merci!

25
x1a0

HEAD est le plus efficace pour les contrôles d'existence:

HEAD /users/{username}

Demander le chemin d'un utilisateur et renvoyer un 200 s'il existe, ou un 404 s'ils ne le sont pas.

Remarquez, vous ne voulez probablement pas exposer les ordinateurs d'extrémité qui vérifient les adresses électroniques. Cela ouvre un trou dans la sécurité et la vie privée. Les noms d’utilisateur déjà affichés publiquement sur un site, comme sur reddit, pourraient convenir.

20
Baz

Je pense que la bonne façon de vérifier l'existence est d'utiliser un verbe HEAD pour la ressource que vous obtiendriez normalement avec une requête GET.

Je suis récemment tombé sur une situation où je voulais vérifier l'existence d'un fichier vidéo potentiellement volumineux sur le serveur. Je ne voulais pas que le serveur essaie de commencer à transmettre les octets en continu à un client. J'ai donc implémenté une réponse HEAD qui ne faisait que renvoyer les en-têtes que le client recevrait lors d'une requête GET pour cette vidéo.

Vous pouvez consulter la spécification W3 ici ou lire cet article de blog sur les utilisations pratiques du verbe HEAD.

Je pense que c’est génial, car il n’est pas nécessaire de réfléchir à la manière de former votre route différemment d’une route RESTful normale afin de vérifier l’existence de toute ressource. Que ce soit un fichier ou une ressource typique, comme un utilisateur ou quelque chose.

5
arjabbar
GET /[email protected]

Ceci est une requête de recherche de base: trouvez-moi les utilisateurs qui ont l'adresse email spécifiée. Répondez avec une collection vide si aucun utilisateur n'existe ou répondez avec les utilisateurs qui correspondent à la condition.

3
Paul Turner

Je préfère:

HEAD /users/email/[email protected]

Explication: Vous essayez de trouver parmi tous les utilisateurs quelqu'un qui utilise l'e-mail [email protected]. Je suppose ici que l'e-mail est not la clé de votre ressource et que vous disposez d'une certaine souplesse, car si vous avez besoin d'un autre point d'extrémité pour vérifier la disponibilité d'une autre information fournie par l'utilisateur, cette approche peut s'adapter. très bien.

En réponse, vous ne renvoyez que 200 (s'il n'est pas disponible) ou 404 (s'il est disponible) sous forme de réponse en code http.

Vous pouvez aussi utiliser:

HEAD /emails/[email protected]

si le HEAD /users/email/[email protected] entre en conflit avec une ressource restante existante, comme un GET /users/email/[email protected] avec une règle de gestion différente. Comme décrit dans la documentation de Mozilla :

La méthode HEAD demande une réponse identique à celle d'une demande GET, mais sans le corps de la réponse. *. 

Donc, avoir GET et HEAD avec des règles différentes n'est pas bon.

Un HEAD /users/[email protected] est également une bonne option si l'e-mail est la "clé" de la users, car vous avez (probablement) un GET /users/[email protected].

1
Dherik