Progettazione dell'API: POST con parametro di query per specificare la relazione?

0

Supponiamo di avere una risorsa Utente che deve essere sempre associata a un altro tipo di risorsa, un'azienda.

Quando si crea un nuovo utente, è giusto che l'endpoint POST utilizzi un parametro di query per specificare l'attività commerciale da utilizzare?

Ad esempio:

POST /users?business=123
{"firstName": "John", "lastName": "Smith"}
    
posta evilcelery 01.09.2016 - 16:52
fonte

1 risposta

1

Sì, puoi; non c'è nulla su HTTP che impone una particolare struttura API. Tuttavia, ti suggerirei di riflettere sull'argomento.

La modellazione dell'API riguarda solo la comprensione del modello di dominio; dipende dalla relazione tra business e user e il significato relativo di queste entità.

Ecco i miei pensieri riguardo alle tue opzioni principali; Non posso rispondere a questa domanda per te, ma speriamo che questo ti aiuti ad affrontare il problema nel modo giusto.

Uno-a-molti

  • Un'azienda può contenere molti utenti
  • Un utente può essere collegato a una sola attività

Se gli utenti sono trattati come proprietà o componenti di un'azienda, rendi gli utenti un oggetto figlio dell'azienda.

POST /businesses/123/users
{"firstName": "John", "lastName": "Smith"}

Se gli utenti vengono visualizzati come entità distinte che sono solo collegate a un'attività commerciale, devi semplicemente collegare l'utente all'azienda.

POST /users 
{ "user": {"firstName": "John", "lastName": "Smith"}, "business": 123 } 

molti-a-molti

  • Un'azienda può contenere molti utenti
  • Un utente può essere collegato a molte aziende

Potresti rendere il collegamento alle attività commerciali una proprietà dell'utente.

POST /users 
{ "user": {"firstName": "John", "lastName": "Smith"}, "businesses": [123, 789] } 

Oppure, se il link a un'azienda ha un significato sostanziale per il tuo modello di dominio, potresti creare un'entità completamente nuova che rappresenti un impiego.

POST /users 
{ "user": {"firstName": "John", "lastName": "Smith"} } 

POST /employment
{ "user": 345, "business": 123, "commenced": "2016-09-01", "terminated": false } 
    
risposta data 01.09.2016 - 17:28
fonte

Leggi altre domande sui tag