*Client concreto, ctx come primo argomento ovunque e gruppi di risorse, e corregge ogni bug noto della v2. Copre tutte le 67 operazioni dell’API attuale.
In sintesi
Costruzione e opzioni
Opzioni per richiesta:
Metodo per metodo
api è il rest.Rest della v2, c il *squarecloud.Client della v3.
Tipi
Errori
rest.APIError (StatusCode, Code, Message) diventa squarecloud.APIError (Status, Code, Message, Method, Path): rinomina StatusCode in Status. rest.ErrorCode(err) e rest.IsRateLimit(err) sono stati rimossi: usa errors.As e controlla Code o Status == 429.
- I fallimenti di rete ora sono
*APIErrorconStatus0,CodeNETWORK_ERRORoTIMEOUTe il testo della causa comeMessage, e fanno l’unwrap alla causa (errors.Is(err, context.Canceled)funziona). - Lo stesso vale per i controlli locali (
Status0:INVALID_ID,FILE_TOO_LARGE,INVALID_API_KEY) e per un body 2xx che non è JSON (UNKNOWN_ERROR,Invalid JSON in HTTP <status> response). - Un body 2xx che contiene
"status": "error"ora è un errore (la v2 lo segnalava come successo). I rifiuti del cluster all’avvio/arresto di app e database arrivano come 409CONTAINER_ALREADY_STARTED,CONTAINER_ALREADY_STOPPED,CONTAINER_TEMPORARILY_SUSPENDED,CONTAINER_NOT_FOUND,CONTAINER_INSUFFICIENT_DISK_SPACE,CONTAINER_NETWORK_CONFLICToACTION_FAILED, senza messaggio. L’SDK restituisce una risposta “already” come errore: trattala tu come successo, se necessario. - Una risposta senza codice ha
CodeUNKNOWN_ERROR. - Una chiave API scaduta produce 401
ACCESS_DENIED, come una sconosciuta. - Esiste una costante
Code*per ogni codice documentato dall’API. L’API ora invia 429RATE_LIMITED(CodeRateLimited) dove prima inviavaRATE_LIMITeRATE_LIMIT_EXCEEDED;CodeRateLimiteCodeRateLimitExceededrestano, deprecati. - Ogni errore di
AI.Chatha la forma di OpenAI con un codice minuscolo (access_denied,rate_limit_exceeded,server_overloaded, …), cheCoderiporta testualmente. Error()producesquarecloud: <METHOD> <path>: HTTP <status> <CODE>: <message>(v2:squarecloud: <message> (<CODE>, HTTP <status>)). Basati sui campi, non sul testo.
Cambiamenti di comportamento
- Chiave API vuota:
New("")(o una chiave composta solo da spazi) restituisce comunque un client (non può restituire un errore), ma ogni chiamata tranneService.Statusfallisce localmente conINVALID_API_KEY. - Snapshot 202: la v2 restituiva un
*APIErrorconStatusCode202. La v3 restituisce unSnapshotCreatedconPending: truee un errorenil. - Realtime:
Nextora restituisce unRealtimeEvent. Usa uno switch suev.Event(system,status,logs,error,message). Per i log, stampaev.Line(il byte\u0001/\u0002viene rimosso;ev.Dataresta il frame grezzo) e usaev.Streamper stdout/stderr. Per lo stato, usaev.Status: mainilin un evento di stato, unito in modo superficiale tra frame e riconnessioni. DopoREALTIME_DISCONNECTED,Nextrestituisceio.EOF. Il flusso non si interrompe più dopo 30 s, le riconnessioni attendono almeno 5,5 s dopo l’apertura precedente, e l’apertura è limitata dal timeout del client fino all’arrivo degli header. Vedi Realtime. - Timeout: la v2 usava un timeout fisso di 30 s dell’
http.Clientper tutto. La v3 applica una scadenza predefinita solo quandoctxnon ne ha una: il timeout del client (WithTimeout, 30 s) per la maggior parte delle chiamate; almeno 2 minuti per start/stop/restart, creazione di database, creazione/ripristino di snapshot eAI.Chat; nessuna per upload, scritture di file con contenuto oltre 1 MiB e download di snapshot.WithTimeout(0)le disattiva tutte. - Finestre di rete vuote:
Analytics,ErrorsePerformancerestituiscono puntatorinilquando la finestra non ha traffico. - Header: ogni richiesta all’API invia
Accept: application/json(text/event-streamper il realtime). LoUser-Agentpredefinito è cambiato daSquare GOasquarecloud-sdk-go/3.0.0(WithUserAgentlo sostituisce ancora). - Id: ogni id ora è codificato in percent-encoding come un singolo segmento del percorso (la v2 lo inseriva nel percorso così com’era), e un id vuoto,
.o..fallisce localmente conINVALID_ID. - Scrittura di file: la v2 inviava sempre il contenuto come stringa, cosa che corrompeva i file binari, e non poteva scrivere un file vuoto. La v3 invia sempre il contenuto codificato in base64, quindi ogni byte resta identico, un contenuto vuoto scrive un file vuoto e un contenuto oltre 10 MB fallisce localmente con
FILE_TOO_LARGE. L’API risponde 400INVALID_CONTENTper un contenuto che non riesce a decodificare. - Lettura di file: la v3 richiede sempre base64 e lo decodifica, invece dell’array di byte JSON letto dalla v2 (che l’API ha deprecato). Un file oltre 10 MB produce 413
FILE_TOO_LARGE. - Elenco dei file: elencare una directory che non esiste produce 404
FILE_NOT_FOUND; prima era un elenco vuoto. - Snapshot: le voci dell’elenco contengono
VersionIDeURLforniti dall’API; non viene estratto nulla daKey. - Retry: novità. Gli errori di rete delle GET, i 503
UPLOAD_BUSY/ANALYTICS_BUSYe i 503DATABASE_UNAVAILABLEsulle GET vengono ripetuti due volte per impostazione predefinita;WithMaxRetries(0)ripristina il comportamento della v2.DATABASE_UNAVAILABLEpuò arrivare dopo che una mutazione è iniziata, quindi l’SDK non lo ripete mai sugli altri metodi; ripeti tu una mutazione idempotente, se vuoi. Vedi Retry. - Versione di Go: il minimo è sceso da Go 1.24 a Go 1.22.

