Sync e sincronizzazione massiva
Modulo Sync: "Use this api module, for bulk syncronization operation with your software" (pagina Help).
GET /api/sync/{Resource}
| Voce | Valore |
|---|---|
| Descrizione | Restituisce i record della risorsa variati dopo LastUtcRun |
| Autenticazione | Bearer |
| Risposta 200 | Array JSON di record, con TotalRowsCount |
| Parametro | Descrizione |
|---|---|
LastUtcRun | Data/ora UTC nel formato YYYY-MM-DD HH:MM:SS.000; 1900-01-01 00:00:00.000 restituisce tutto |
PageSize, PageNumber | Paginazione |
curl -G "<BASE_URL>/api/sync/CliFor" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
--data-urlencode "LastUtcRun=<YYYY-MM-DD HH:MM:SS.000>" \
--data-urlencode "PageSize=500" --data-urlencode "PageNumber=1"
Procedura completa: Sincronizzazioni incrementali.
POST /api/sync/{Resource}
| Voce | Valore |
|---|---|
| Descrizione | Invio massivo di record alla risorsa |
| Autenticazione | Bearer (utente abilitato alla scrittura) |
| Content-Type | application/json; charset=utf-8 |
| Corpo | Array di record della risorsa |
| Risposta | 200 se il blocco è accettato |
Operazione di scrittura
Usala solo con un utente abilitato e, per le prove, su un tenant di prova concordato.
Regole di invio
| Aspetto | Regola |
|---|---|
| Blocchi | Dividi i record in blocchi di alcune centinaia; per i documenti, che contengono anche le righe, usa blocchi più piccoli |
| Righe documento | Array StoricoDocumentiR annidato in ogni record di StoricoDocumentiT |
| Cancellazione logica | flg_isdeleted: false sui record attivi |
| Controllo | Dopo l'invio, GET /api/resources/{Resource} e confronto di TotalRowsCount |
| Errori | Fermati al primo codice diverso da 200 e registra il corpo della risposta |
Ordine di pubblicazione e codice: Integrazione ERP.
- C#
- JavaScript
const int Blocco = 500;
for (var i = 0; i < records.Count; i += Blocco)
{
var blocco = records.Skip(i).Take(Blocco).ToList();
using var resp = await http.PostAsJsonAsync("api/sync/MarcaArticoli", blocco);
if (!resp.IsSuccessStatusCode)
throw new InvalidOperationException($"HTTP {(int)resp.StatusCode}: {await resp.Content.ReadAsStringAsync()}");
}
for (let i = 0; i < records.length; i += 500) {
const resp = await fetch(`${BASE_URL}/api/sync/MarcaArticoli`, {
method: "POST",
headers: { ...headers, "Content-Type": "application/json; charset=utf-8" },
body: JSON.stringify(records.slice(i, i + 500)),
});
if (!resp.ok) throw new Error(`HTTP ${resp.status}: ${await resp.text()}`);
}