2014-10-15 21 views
5

Sto sviluppando un'API REST per la mia applicazione.Combinare più richieste API REST in una singola richiesta?

Con questa API posso fare cose come aggiornare società e le persone che utilizzano i dettagli PUT companies/1 e PUT persons/2, families/3, eccetera.

Desidero utilizzare questa API per eseguire la sincronizzazione normale da altre applicazioni. Ciò comporterebbe centinaia di migliaia di richieste all'API REST, la maggior parte di tali aggiornamenti. Ogni richiesta richiede pochissimo tempo, ma la latenza di ogni singola richiesta si aggiunge a un bel po 'di tempo.

C'è un modo in cui posso creare API REST che può combinare più richieste come una volta. Potrei facilmente pensare di fare semplicemente un PUT con una serie di percorsi e di formdata, ma sembra che qualcuno abbia già progettato una soluzione migliore.

Esiste una best practice per combinare più richieste diverse a un'API REST in un'unica richiesta per evitare la latenza o esiste un modo migliore in generale per gestire una situazione come questa?

risposta

1

La latenza si aggiunge solo per serie di richieste. L'utilizzo di richieste parallele risolverebbe il problema.

Non esiste una procedura ottimale qui.

  • È possibile inviare PATCH con più elementi alle raccolte.
    PATCH /companies [{id:1, ...}, {id: 2, ...}, ...]
  • È possibile definire una raccolta composita che può contenere elementi di tipi diversi.
    PATCH /resources [{id: 1, "rdf:type": "app:Company", ...}, {...}]

non mi piace nessuno dei due, ma questo è solo un parere ...

+0

Le richieste parallele aiutano molto. Stavo usando 'curl' (PHP) per fare le richieste e ho aggiunto il supporto per' curl_multi' per le richieste parallele e fire & forget con rispettivamente ~ 5x e ~ 10x miglioramenti delle prestazioni rispetto alle chiamate di blocco. – Martijn

+1

Whoops. Sembra che la latenza non sia l'unico problema. L'invio di migliaia di richieste in parallelo sembra attivare una sorta di rilevamento DDoS. – Martijn

+0

Ogni sistema ha i suoi limiti ... ;-) – inf3rno

2

di Google Gmail API supporta questo, con un piuttosto solido, API riutilizzabile.

https://developers.google.com/gmail/api/guides/batch

Per farla breve, la vostra API ha un endpoint POST /batch, e nel corpo della richiesta, si inviano più richieste HTTP. Le risposte saranno analogamente codificate.
Ciò richiede logica lato server e lato client, ma sarebbe molto generico e molto riutilizzabile.

Esempio:

POST /batch HTTP/1.1 
Content-Type: multipart/mixed; boundary=batch_foobarbaz 
Content-Length: total_content_length 

--batch_foobarbaz 
Content-Type: application/http 

GET /farm/v1/animals/pony 

--batch_foobarbaz 
Content-Type: application/http 

PUT /farm/v1/animals/sheep 
Content-Type: application/json 
Content-Length: part_content_length 
If-Match: "etag/sheep" 

{ 
    "animalName": "sheep", 
    "animalAge": "5" 
    "peltColor": "green", 
} 

--batch_foobarbaz 
Content-Type: application/http 

GET /farm/v1/animals 
If-None-Match: "etag/animals" 

--batch_foobarbaz-- 
Problemi correlati