web-dev-qa-db-fra.com

Comment mettre correctement implémenter la clé = stockage de valeur REST API

Je suis nouveau à REST API, j'ai donc décidé de me familiariser en concevant une petite API de service Web. J'ai son dessein écrit et j'aimerais que vous l'examiniez. J'ai envie de l'examiner. J'ai fait des erreurs dans la conception et la compréhension REST concepts, que j'essaie de traiter avec des questions sur mon design à la fin. Je suis surtout pas sûr de mon utilisation d'URL pour l'API .

Le service Web que j'essaie de concevoir un moyen de stocker une clé de stockage = de la valeur, c'est-à-dire de récupérer la valeur en sachant sa clé, mettez à jour la valeur d'une clé existante et supprimez une clé existante. Toute l'ensemble des actions de crud!

Voici ce que j'ai proposé.

Versions

Puisque mon API pourrait évoluer, je veux une notion de versions API, alors j'ai

GET api.example.com/supported-versions

Qui renvoie une liste JSON d'entiers indiquant les versions API pris en charge.

L'API sera disponible à api.example.com/{VERSION}/ point final, par exemple api.example.com/1/ pour la première version.

Clé = stockage de la valeur

GET api.exmaple.com/1/keys/{KEY}

Permet à un utilisateur d'obtenir une valeur associée à une clé KEY. Le serveur répond avec un code d'état (200, 404, etc.) et une valeur de texte sur le succès, à la fois codées dans JSON.


POST and PUT api.exmaple.com/1/keys/{KEY}?value={VALUE}

Permet à un utilisateur de créer/mettre à jour la valeur associée à la touche KEY. Le serveur renvoie un code d'état (200, 404, etc.). VALUE est une chaîne de texte.

DELETE api.exmaple.com/1/keys/{KEY}

Permet à un utilisateur de supprimer une touche = paire de valeur avec la touche KEY. Le serveur qui supprimera la touche = paire de valeur et renvoyera un code d'état (200, 404, etc.).


Imaginons qu'il existe une authentification de l'authentification OAuth2, qui est utilisée pour les méthodes up-post/Met/Met/Supprimez (mais que personne ne peut obtenir que personne ne puisse obtenir d'authentification pour cela), il existe donc un moyen d'identifier de manière unique Un utilisateur et gardez la piste quelle clé = paires de valeur appartient à quel utilisateur.

Maintenant, je souhaite que un utilisateur authentifié puisse obtenir une liste de toutes les clés qu'ils ont, de sorte qu'ils n'ont pas à stocker ces informations sur le côté client afin d'envoyer une demande de suppression ou de la demande ultérieure.

GET api.exmaple.com/1/keys?page={PAGE}

Cela permet à un utilisateur d'obtenir une liste de toutes les clés existantes créées. PAGE est un paramètre facultatif. L'utilisateur peut augmenter la page de page jusqu'à ce que l'utilisateur puisse obtenir un code d'état d'erreur. Il renvoie une liste de pagies de toutes les clés existantes qu'un utilisateur a créé et également un code d'état (200, 404, etc.).


Y a-t-il quelque chose de mal avec cette API?

Si le premier get/post/post/supprime/supprime de clé = stockage de valeur Section est sur /keys/ ou /values/?

Est-ce bien que le dernier "get", celui qui renvoie toutes les clés qu'un utilisateur a, est aussi /keys/?

6
Waffle Lord

Votre solution est correcte, économisez pour quelques choses:

  1. Versioning REST API au niveau des ressources n'est généralement pas une bonne pratique, bien que cela ne soit pas nécessairement une vue de consensus. Voir ici Pour certains commentaires et liens vers de nouvelles discussions.

  2. À votre deuxième question, vous pourriez probablement discuter de toute façon pour savoir si /keys/{id}/ ou /values/{id}/ est correct, mais mon instinct serait d'utiliser l'utilisation keys car c'est le "parent" du tuple, ou j'utiliserais un nom total différent tel que /data/ ou /elements/, ou quoi que ce soit ces choses représentent réellement.

  3. J'aurais probablement des méthodes d'obtention différentes pour l'ensemble du dictionnaire de la valeur clé, par ex. /keys/{id}/et une ressource distincte pour celles d'un utilisateur particulier, par ex. /users/{id}/keys/{keyId}.

Enfin, ce n'est pas génial (bien que possible) d'utiliser des chaînes de requête avec des méthodes post/placez/de suppression. C'est une Query String, après tout. Au lieu de cela, vous pouvez utiliser POST /data/, et mettre la paire de la valeur de clé en tant que données JSON dans le corps de la demande. Voir Cette question aussi.

8
Dan1701