*Client concret, ctx en premier argument partout et des groupes de ressources, et elle corrige tous les bugs connus de la v2. Elle couvre les 67 opérations de l’API actuelle.
En un coup d’œil
Construction et options
Options par requête :
Méthode par méthode
api est le rest.Rest de la v2, c le *squarecloud.Client de la v3.
Types
Erreurs
rest.APIError (StatusCode, Code, Message) devient squarecloud.APIError (Status, Code, Message, Method, Path) : renommez StatusCode en Status. rest.ErrorCode(err) et rest.IsRateLimit(err) ont été supprimés : utilisez errors.As et vérifiez Code ou Status == 429.
- Les échecs réseau sont désormais des
*APIErroravecStatus0,CodeNETWORK_ERRORouTIMEOUTet le texte de la cause commeMessage, et ils encapsulent la cause (errors.Is(err, context.Canceled)fonctionne). - Il en va de même pour les vérifications locales (
Status0:INVALID_ID,FILE_TOO_LARGE,INVALID_API_KEY) et pour un corps 2xx qui n’est pas du JSON (UNKNOWN_ERROR,Invalid JSON in HTTP <status> response). - Un corps 2xx indiquant
"status": "error"est désormais une erreur (la v2 le signalait comme un succès). Les refus du cluster lors du démarrage ou de l’arrêt des applications et des bases de données arrivent en 409CONTAINER_ALREADY_STARTED,CONTAINER_ALREADY_STOPPED,CONTAINER_TEMPORARILY_SUSPENDED,CONTAINER_NOT_FOUND,CONTAINER_INSUFFICIENT_DISK_SPACE,CONTAINER_NETWORK_CONFLICTouACTION_FAILED, sans message. Le SDK renvoie une réponse « déjà » comme une erreur : traitez-la vous-même comme un succès si nécessaire. - Une réponse sans code a le
CodeUNKNOWN_ERROR. - Une clé API expirée donne 401
ACCESS_DENIED, comme une clé inconnue. - Il existe une constante
Code*pour chaque code documenté par l’API. L’API envoie désormais 429RATE_LIMITED(CodeRateLimited) là où elle envoyaitRATE_LIMITetRATE_LIMIT_EXCEEDED;CodeRateLimitetCodeRateLimitExceededrestent, dépréciées. - Chaque erreur de
AI.Chata la forme OpenAI avec un code en minuscules (access_denied,rate_limit_exceeded,server_overloaded, …), queCodereprend tel quel. Error()produitsquarecloud: <METHOD> <path>: HTTP <status> <CODE>: <message>(v2 :squarecloud: <message> (<CODE>, HTTP <status>)). Basez-vous sur les champs, pas sur le texte.
Changements de comportement
- Clé API vide :
New("")(ou une clé composée uniquement d’espaces) renvoie toujours un client (il ne peut pas renvoyer d’erreur), mais chaque appel saufService.Statuséchoue localement avecINVALID_API_KEY. - Snapshot 202 : la v2 renvoyait une
*APIErroravecStatusCode202. La v3 renvoie unSnapshotCreatedavecPending: trueet une erreurnil. - Temps réel :
Nextrenvoie désormais unRealtimeEvent. Faites un switch surev.Event(system,status,logs,error,message). Pour les logs, affichezev.Line(l’octet\u0001/\u0002est retiré ;ev.Datareste la trame brute) et utilisezev.Streampour stdout/stderr. Pour le statut, utilisezev.Status: jamaisnilsur un événement de statut, fusionné superficiellement entre les trames et les reconnexions. AprèsREALTIME_DISCONNECTED,Nextrenvoieio.EOF. Le flux ne s’arrête plus au bout de 30 s, les reconnexions attendent au moins 5,5 s après l’ouverture précédente, et l’ouverture est bornée par le timeout du client jusqu’à l’arrivée des en-têtes. Voir Temps réel. - Timeouts : la v2 utilisait un timeout fixe de 30 s du
http.Clientpour tout. La v3 n’applique une échéance par défaut que lorsquectxn’en a pas : le timeout du client (WithTimeout, 30 s) pour la plupart des appels ; au moins 2 minutes pour start/stop/restart, la création de base de données, la création et la restauration de snapshot etAI.Chat; aucune pour les envois, les écritures de fichiers de plus de 1 MiB de contenu et les téléchargements de snapshots.WithTimeout(0)les désactive toutes. - Fenêtres réseau vides :
Analytics,ErrorsetPerformancerenvoient des pointeursnillorsque la fenêtre n’a pas de trafic. - En-têtes : chaque requête à l’API envoie
Accept: application/json(text/event-streampour le temps réel). LeUser-Agentpar défaut est passé deSquare GOàsquarecloud-sdk-go/3.0.0(WithUserAgentle remplace toujours). - Identifiants : chaque identifiant est désormais encodé en pourcentage comme un seul segment de chemin (la v2 le collait tel quel dans le chemin), et un identifiant vide,
.ou..échoue localement avecINVALID_ID. - Écriture de fichiers : la v2 envoyait toujours le contenu sous forme de chaîne, ce qui corrompait les fichiers binaires, et ne pouvait pas écrire de fichier vide. La v3 envoie toujours le contenu encodé en base64 : chaque octet est donc conservé, un contenu vide écrit un fichier vide, et un contenu de plus de 10 Mo échoue localement avec
FILE_TOO_LARGE. L’API répond 400INVALID_CONTENTpour un contenu qu’elle ne peut pas décoder. - Lecture de fichiers : la v3 demande toujours du base64 et le décode, au lieu du tableau d’octets JSON que lisait la v2 (déprécié par l’API). Un fichier de plus de 10 Mo donne 413
FILE_TOO_LARGE. - Liste de fichiers : lister un répertoire inexistant donne 404
FILE_NOT_FOUND; c’était auparavant une liste vide. - Snapshots : les entrées de la liste portent
VersionIDetURLfournis par l’API ; rien n’est extrait deKey. - Nouvelles tentatives : nouveau. Les erreurs réseau sur GET, les 503
UPLOAD_BUSY/ANALYTICS_BUSYet le 503DATABASE_UNAVAILABLEsur GET sont réessayés deux fois par défaut ;WithMaxRetries(0)rétablit le comportement de la v2.DATABASE_UNAVAILABLEpeut arriver après le début d’une mutation : le SDK ne le réessaie donc jamais sur les autres méthodes ; réessayez vous-même une mutation idempotente si vous le souhaitez. Voir Nouvelles tentatives. - Version de Go : le minimum est passé de Go 1.24 à Go 1.22.

