2016-11-29 2 views
1

Je suis en train de concevoir une API RESTful pour les tests et les métadonnées de tests. J'ai deux ressources: Test et TestRun. Sous le capot, ils ont une relation un-à-un dans la base de données. Je crée d'abord une ressource Test en envoyant un POST à api/v1/test.Création/modification d'une ressource en envoyant une requête POST à ​​une autre ressource (associée)

Ensuite, je dois commencer ce test. Je fais cela en envoyant un POST à api/v1/test/{id}/run, ce qui crée une ressource TestRun qui se rapporte à cette ressource Test.

Ensuite, je peux aussi arrêter le test en envoyant un POST-api/v1/test/{id}/finish, qui modifie la TestRun ressource (définit certains domaines, comme finish_time, result etc.) correspondant.

L'utilisateur de l'API n'aura jamais GET accès aux ressources TestRun et n'y aura accès qu'à travers ses ressources Test.

Bien qu'il semble que cette conception soit assez simple pour l'utilisateur de l'API, je doute que ce soit aussi simple pour un développeur. Ce design est-il assez bon? Viole-t-il les principes ou les meilleures pratiques REST? J'apprécierais toute contribution à ce sujet.

Une description de la conception étendue de toute l'API: https://gist.github.com/Ch00k/27724e29ec1bf044ebbfdabef9e842d5

+0

'Je doute que ce soit aussi simple pour un développeur'. Quel pourrait être le problème? –

+0

@Lutz Horn C'était apparemment une mauvaise question :) Je me demandais juste si c'était une bonne idée de la façon dont je l'ai fait, et si ce n'est pas contre les bonnes pratiques REST. –

Répondre

0

Votre API ne permet pas l'accès au TestRun, donc un TestRun ne semble pas être une ressource REST. En fait, vos URL sont un mélange de REST, en ce qui concerne le test, et RPC, en particulier les chemins /run et /finish.

RPC n'est pas REST, donc je retravailler un peu cette question:

  • Utilisez uniquement un type de ressource, le test, à api/v1/test/{id}.
  • Un test a un état qui peut être retrievd en utilisant une demande GET-api/v1/test/{id}:
    • status: stopped, started, finished, ...
    • finish_time
    • result
    • ...
  • L'état d'un test est modifié chantez une requête PATCH à api/v1/test/{id} avec un corps JSON contenant le nouvel état: {"status": "started"} pour lancer le test, etc. Ceci remplace les appels RPC.
+0

Conserveriez-vous également la conception de la base de données existante? C'est à dire.Je vais toujours avoir une table de test et une table TestRun, et quand j'émets une requête PATCH à api/v1/test/{id} changera l'enregistrement dans la table TestRun. Notez que dans ma conception, le test lui-même n'a pas d'état, mais son état est défini par les paramètres start_time et end_time de son TestRun. –

+0

J'ajouterai en fait un champ d'état, car cela rend l'interrogation beaucoup plus facile. –

+1

REST n'a rien à voir avec vous persister les ressources. Une ressource peut être stockée dans plusieurs tables. –