Integrazione tra API REST e database

1

Ho uno scenario in cui:

  • Ho un'API REST per gestire le risorse, ad esempio workspaces . Questa API REST è chiusa nel senso che non può essere modificata.

  • Voglio CRUD workspaces ma salvo informazioni aggiuntive su di essi, che l'API REST principale non supporta.

  • Quindi, creo un'altra API REST, la chiamo API client, quali CRUD workspaces nell'API REST principale e salva ulteriori informazioni in un database.

  • È importante notare che non ci sono altri client che utilizzano l'API REST principale, ovvero non ci sono problemi di sincronizzazione.

Il mio problema è qual è il modo migliore per mantenere l'integrità tra workspaces nell'API REST principale e workspaces che vivono nell'API REST del client?

Ad esempio, per creare uno spazio di lavoro, c'è POST /workspaces nell'API client che:

1 - Crea uno spazio di lavoro nell'API REST principale.
2 - Creare uno spazio di lavoro nel database del cliente.

Se il passaggio 2 non riesce, ho creato workspace nell'API REST principale e non nel database client.

Qual è l'approccio migliore per affrontarlo?

    
posta soares 10.04.2018 - 14:15
fonte

2 risposte

1

Ti consiglio di creare la tua interfaccia personale che il tuo client utilizza per avvolgere l'interfaccia del venditore. Forse questo è ciò che intendi per 'CRUD' qui, ma fai attenzione a mescolare CRUD e REST perché le operazioni HTTP (GET, PUT, POST ecc.) Non si allineano esattamente CRUD (crea, leggi, aggiorna, cancella).

Il tuo cliente non dovrebbe preoccuparsi affatto dell'API del fornitore. La tua API wrapper sarà tutto ciò che sa. Il lavoro che desideri fare dovrebbe essere semplice.

Il tuo problema con l'inserimento del DB fallito è valido. Senza un'interfaccia commit a 2 fasi , la soluzione migliore è quella di utilizzare una memoria locale per i guasti con tentativi. Una cosa che dovresti prendere in considerazione è l'inserimento preliminare (e il commit) prima di chiamare l'API che rappresenta una transazione in sospeso. Ciò renderà più facile rilevare se si incontra un problema che richiede una riparazione. Se ciò non riesce, puoi abortire prima di creare la risorsa. Ciò dovrebbe ridurre la quantità di guasti nel secondo passaggio ma non eliminerà la possibilità. Se questo succede. la creazione della risorsa ha esito positivo ma l'inserto con l'ID non riesce, l'ID viene archiviato in un archivio di backup come un file. Dovrebbe essere scritto anche un log contenente l'id. Una procedura di ripetizione può essere implementata per essere eseguita periodicamente per tentare di risolvere il problema. Se trovi istanze nel tuo database in cui l'ID non è stato archiviato, puoi risolvere il problema.

    
risposta data 10.04.2018 - 16:48
fonte
1

Come ho visto, hai il concetto di spazi di lavoro per la tua applicazione, ma i clienti diversi sono interessati a più / meno informazioni? Penso che il tuo attuale approccio difficilmente possa dimostrarsi sostenibile a lungo termine.

Vorrei attenermi all'utilizzo di un unico endpoint API per il tuo dominio workspaces e utilizzare i parametri della stringa di query per modificare i dati restituiti. In questo modo, hai una sola fonte di dati e non devi preoccuparti della sincronizzazione tra database.

Ad esempio, se il modello di base dello spazio di lavoro conteneva un nome e del testo:

{
    "name": "Workspace Name",
    "text": "Text"
}

È possibile accedere a questo con la chiamata standard dell'area di lavoro: example.com/workspaces/1 . Se si desidera ottenere un modello più dettagliato: example.com/workspaces/1?detailed=true . La seconda chiamata potrebbe compilare campi aggiuntivi che potrebbero semplicemente essere ignorati dai client che non sapevano come elaborarli.

    
risposta data 10.04.2018 - 14:22
fonte

Leggi altre domande sui tag