Svar og fejl

Kontrakt for svar og fejl i Admin API

Denne fil fuldender svarkontrakten for hvert endpoint i Endpointreference. Læs endpointrækken om vellykket svartekst og tabellerne nedenfor om alle fælles eller endpointspecifikke svartekster ved manglende succes. Som standard bruger fejl flere kompatibilitetsstrukturer; klienter kan vælge én universel omslutning.

Valgfri struktureret fejlomslutning

Send denne anmodningsheader til et hvilket som helst endpoint:

X-Error-Format: envelope

Ved værdisammenligningen fjernes omgivende mellemrum, og store og små bogstaver skelnes ikke. Med netop denne værdi konverteres alle JSON-svar med status 400 eller højere til:

ErrorEnvelope = {
  error: {
    code: string,
    message: string,
    details: Record<string, unknown>,
    requestId: string
  }
}

Eksempel på konvertering af en standardvalideringssvartekst:

{
  "error": {
    "code": "VALIDATION_FAILED",
    "message": "Invalid request",
    "details": {
      "fields": {
        "name": ["String must contain at least 1 character(s)"]
      }
    },
    "requestId": "integration-42"
  }
}

Konverteringsreglerne er præcise:

  • validationErrors bliver til details.fields, og code bliver til VALIDATION_FAILED, også når standardsvarteksten havde en domænekode.
  • En code på øverste niveau i standardsvaret bevares, når der ikke er valideringsfelter.
  • Andre egenskaber på øverste niveau bortset fra error, message, validationErrors og code flyttes til details; ved rapporteksport bliver limit f.eks. til details.limit.
  • En error af typen streng på øverste niveau bliver til message. Hvis den ikke findes, bruges statuskodens standardtekst.
  • Standardkoder er AUTH_REQUIRED (401), PERMISSION_DENIED (403), RESOURCE_NOT_FOUND (404), CONFLICT (409), VALIDATION_FAILED (422 og andre uklassificerede 4xx), RATE_LIMITED (429), EXTERNAL_PROVIDER_FAILED (502) og INTERNAL_ERROR (andre 5xx, inklusive 503).
  • requestId er den nøjagtige X-Request-Id-svarheader. Et anmodnings-ID angivet af klienten bruges kun, når det matcher [A-Za-z0-9._:-]{1,128} efter fjernelse af omgivende mellemrum; ellers genererer serveren en UUID.

Denne transformation ændrer ikke status eller headere uden for svarteksten. Den gælder også ved idempotente gentagelser i henhold til gentagelsesanmodningens X-Error-Format-header. Binære svar ved succes forbliver binære; deres JSON-fejl omsluttes. De øvrige tabeller viser standardsvarteksterne; anvendelse af reglerne ovenfor giver den anden mulige svartekst for hver række.

Notation for svar

ValidationError = {
  validationErrors: Record<string, string[]>,
  code?: string
}

CodedError = {
  error: string,
  code: string,
  // a route may add fields explicitly listed below
}

PlainError = { error: string }

error og valideringsmeddelelser er beskrivende tekst, ikke en stabil programmatisk skelnen. Basér logikken på code, når den er til stede. Anmodningsvalidering returnerer 422 ValidationError; validering af et helt objekt kan give { "validationErrors": {} }, når intet enkelt felt identificeres. Ugyldig JSON og uventede fejl returnerer den globale 500 PlainError vist nedenfor.

Alle JSON-eksempler viser de nøjagtige strukturer for anmodnings- og svartekster. Tekst vist som <message> er den returnerede validerings- eller handlingsmeddelelse og er en JSON-streng, ikke en bogstavelig værdi med vinkelparenteser.

Rækkefølge for anmodningsbehandling

Anmodninger behandles i denne rækkefølge:

  1. konfiguration og autentificering af arbejdsområdetokens;
  2. værtspolitik og anmodningsgrænser for token/arbejdsområde;
  3. filtrering efter aktuelle rettigheder;
  4. idempotensvalidering og reservation ved hver ændringshandling;
  5. kontrol af endpointscopes, anmodningsvalidering og den ønskede handling.

En ændringsanmodning med et gyldigt token, men utilstrækkelige scopes, skal derfor stadig sende Idempotency-Key. Et fuldført svar med 403, 404, 409 eller 422 på en ændringsanmodning kan gentages med samme nøgle og anmodning.

Svar om autentificering, politik og anmodningsbegrænsning

Disse svar kan forekomme på alle registrerede /v2/admin-endpoints før endpointspecifik behandling.

StatusHvornårNøjagtig svartekstRelevante headere
401Manglende, dubleret, kommasepareret, ikke-Bearer, forkert formateret, ukendt, udløbet, tilbagekaldt eller på anden måde ugyldigt arbejdsområdetoken{ "error": "Unauthorized", "code": "INVALID_WORKSPACE_TOKEN" }WWW-Authenticate: Bearer, Cache-Control: no-store
404Tokenet er gyldigt, men dets arbejdsområdevært har ikke adminApiEnabled{ "error": "Not Found" }Cache-Control: no-store
429Anmodningspuljen for tokenet eller arbejdsområdet er opbrugt{ "error": "Too many attempts. Please try again later." }Retry-After: <seconds>
503Autentificering af arbejdsområdetokens er midlertidigt utilgængelig{ "error": "Admin API workspace-token configuration is unavailable", "code": "WORKSPACE_API_CONFIG_UNAVAILABLE" }—
503Opslag af værtspolitik eller autorisation af aktuelle rettigheder mislykkes{ "error": "Workspace authorization is temporarily unavailable", "code": "WORKSPACE_AUTHORIZATION_UNAVAILABLE" }—

API-adgang er inkluderet i alle planer. Hvis adminApiEnabled-indstillingen på arbejdsområdets vært deaktiveres, returneres 404; tab af en ekstra funktionsrettighed fjerner kun de berørte scopes. Den efterfølgende afvisning af scope bruger svaret nedenfor, ikke et tokenfornyelsesforløb.

Fejl i scopes, idempotens, fortolkning og ejerskab samt uventede fejl

Gælder forStatusNøjagtig svartekstHeadere/noter
Alle ruter efter autentificering403{ "error": "Insufficient workspace-token scope", "code": "INSUFFICIENT_SCOPE" }Returneres, når et påkrævet scope mangler.
Enhver ændringshandling400{ "error": "Idempotency-Key is required for this operation", "code": "IDEMPOTENCY_KEY_REQUIRED" }Ingen nøgle angivet.
Enhver ændringshandling400{ "error": "Exactly one Idempotency-Key is required", "code": "INVALID_IDEMPOTENCY_KEY" }Dubleret eller kommasepareret header.
Enhver ændringshandling400{ "error": "Idempotency-Key must contain 1 to 255 visible characters", "code": "INVALID_IDEMPOTENCY_KEY" }Tom, for lang eller indeholder et kontroltegn.
Enhver ændringshandling409{ "error": "Idempotency-Key was already used with a different request", "code": "IDEMPOTENCY_CONFLICT" }Samme token, metode, sti og nøgle, men anden URL eller anmodningstekst.
Enhver ændringshandling409{ "error": "Request is already processing", "code": "IDEMPOTENT_REQUEST_PROCESSING" }Retry-After: 5.
Enhver ændringshandling409{ "error": "Previous request outcome is unknown; verify its effects before attempting the operation again", "code": "IDEMPOTENCY_OUTCOME_UNKNOWN" }Den tidligere behandlingslås udløb, forbindelsen blev lukket, eller anmodningen afsluttedes med en 5xx.
Enhver ændringshandling503{ "error": "Idempotency storage unavailable", "code": "IDEMPOTENCY_UNAVAILABLE" }API'et kan ikke kontrollere eller gemme idempotensposten.
Ethvert endpoint med ugyldigt skema for forespørgsel, anmodningstekst eller sti422{ "validationErrors": { "<field>": ["<message>"] } }Flere felter og meddelelser kan forekomme. Klienter kan ikke angive cpoId; arbejdsområdet kommer altid fra tokenet.
Enhver manglende underordnet arbejdsområderessource eller ethvert ID fra et andet arbejdsområde404{ "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" }Bruges konsekvent, medmindre en tabel nedenfor angiver andet.
Ethvert endpoint med en uventet fejl500{ "error": "Something went wrong" }Ved ændringshandlinger vil et senere nyt forsøg med samme nøgle give 409 IDEMPOTENCY_OUTCOME_UNKNOWN.

Ressource-ID'er i stien skal være positive tal. Ikke-positive eller ikke-numeriske værdier for :siteId, :chargerId, :portId, :tariffId, :profileId, :assignmentId, :userId, :rfidId, :accessId, :limitId eller :localUserId returnerer 422 ValidationError, ikke 400.

Fejl i steder og strømstyring

EndpointsStatusNøjagtig svartekst
Oprettelse/opdatering af sted; validering af arbejdsområdefelter422{ "validationErrors": { "<field>": ["<message>"] } }
DELETE /v2/admin/sites/:siteId, når stedet har afhængigheder409{ "error": "<message>", "code": "SITE_NOT_EMPTY" }
GET /v2/admin/sites/geocode ugyldig normaliseret søgning400{ "error": "<message>", "code": "INVALID_GEOCODE_QUERY" }
Samme samt fuld afgrænset leverandørkø429{ "error": "<message>", "code": "GEOCODING_BUSY" }; indeholder Retry-After, når geokoderen angiver den
Samme samt timeout/fejl hos leverandør eller uventet geokodningsfejl502{ "error": "<message>", "code": "GEOCODING_UNAVAILABLE" }; en uventet fejl bruger Address search is temporarily unavailable
PUT /v2/admin/sites/:siteId/power-management ugyldig topologi-/domænekonfiguration422{ "error": "<message>", "code": "INVALID_POWER_MANAGEMENT_CONFIGURATION" }
Samme samt OCPP-afvisning/timeout, samtidigheds- eller afstemningskonflikt409{ "error": "<message>", "code": "POWER_MANAGEMENT_CONFLICT" }

Laderfejl

mapChargerErrors() bruges ved oprettelse/opdatering af lader, legitimationsoplysninger, stikindstillinger, offentlig visning, QR-dataopløsning, konfigurationsændring/genindlæsning, firmwarestart, alle fire grundkommandoer og anmodning om sammensat tidsplan.

EndpointsStatusNøjagtig svartekst
Enhver ovenstående handling med en domænevalideringsfejl422{ "validationErrors": { "<field>": ["<message>"] } }
Enhver ovenstående handling med en konflikt vedrørende tilstand, entydighed, offline/OCPP, fakturering, Tagless, stik eller parathed409{ "error": "<message>", "code": "CHARGER_CONFLICT" }
GET /chargers/:chargerId/sessions, ugyldigt standard- eller eksplicit tidsinterval422{ "validationErrors": { "from": ["from must be before or equal to to"] } } eller { "validationErrors": { "from": ["Session range cannot exceed 90 days"] } }

Almindelige læsehandlinger returnerer kun de fælles 401/403/404/429/500/503-svar samt 422 ved validering af forespørgsel eller sti. Sletning af en lader kan returnere den fælles 500 PlainError, hvis sletningen mislykkes uden et mere specifikt fejlsvar.

Rapportfejl

EndpointsStatusNøjagtig svartekst
Data-/eksportinterval, hvor from >= to422{ "validationErrors": { "range": ["from must be earlier than to"] } }
Data-/eksportinterval over 90 dage422{ "validationErrors": { "range": ["Report ranges cannot exceed 90 days"] } }
Ugyldig uigennemsigtig markør for data/målinger422{ "validationErrors": { "cursor": ["<message>"] } }
GET /reports/export, resultatet overstiger 2.000 rækker422{ "error": "<message>", "code": "REPORT_EXPORT_ROW_LIMIT", "limit": 2000 }
POST /reports/send, ingen gemt tidsplan409{ "error": "A workspace report schedule must be saved before sending", "code": "REPORT_SCHEDULE_REQUIRED" }
Samme samt afvisning eller fejl fra mailafsender502{ "error": "Report delivery failed", "code": "REPORT_DELIVERY_FAILED" }
Den ejede ressource til tidsplan/målinger findes ikke404fælles RESOURCE_NOT_FOUND-svartekst

En vellykket eksport er binær; alle eksportfejl forbliver JSON.

Tariffejl

EndpointsStatusNøjagtig svartekst
Domænevalidering for oprettelse/opdatering/komponenter/markedspris/tildeling422{ "validationErrors": { "<field>": ["<message>"] } }
Konflikt vedrørende tarifsletning eller tildelingens tilstand, afhængighed eller entydighed409{ "error": "<message>", "code": "TARIFF_CONFLICT" }
Manglende ejerskab af tarif, budområde, lader, stik, tariftildeling eller anden underordnet ressource404fælles RESOURCE_NOT_FOUND-svartekst

Fejl i ladeprofiler

EndpointsStatusNøjagtig svartekst
Domænevalidering for oprettelse/opdatering/tidsplan/tildeling422{ "validationErrors": { "<field>": ["<message>"] } }
Profilen refereres af en beskyttet anvendelse409{ "error": "<message>", "code": "CHARGING_PROFILE_IN_USE" }
OCPP-synkronisering, tildeling, samtidighed eller anden profilkonflikt409{ "error": "<message>", "code": "CHARGING_PROFILE_CONFLICT" }
Manglende ejerskab af profil, lader, stik, tildeling eller anden underordnet ressource404fælles RESOURCE_NOT_FOUND-svartekst

Brugerdomænefejl

Brugervalideringsfejl, som identificerer et felt, bruger ValidationError sammen med code; andre brugerfejl bruger CodedError. Alle tilfælde af manglende ressourcer bruger det fælles RESOURCE_NOT_FOUND-svar, som ikke afslører ressourcens eksistens.

StatusKode(r)Anmodnings-/svartekst
400INVALID_USER_CURSOR{ "validationErrors": { "cursor": ["The user-list cursor is invalid for the selected status"] }, "code": "INVALID_USER_CURSOR" }
409USER_ALREADY_EXISTS, CUSTOMER_CONTRACT_MISSING, INVITATION_EMAIL_IN_USE, RFID_ALREADY_EXISTS, ACCESS_ALREADY_EXISTS, ACCESS_ALL_ALREADY_EXISTS, LIMIT_ALREADY_EXISTS, LOCAL_USER_ALREADY_EXISTS, PROTECTED_WORKSPACE_USER, TAGLESS_USER_PROTECTED, USER_RELATED_DATA{ "error": "<message>", "code": "<listed code>" }
422INVALID_EMAIL, INVALID_RFID, INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE{ "validationErrors": { "<field>": ["<message>"] }, "code": "<listed code>" }
422NO_CHARGERS_AVAILABLE{ "error": "No chargers are available", "code": "NO_CHARGERS_AVAILABLE" }
429INVITATION_RESEND_THROTTLED{ "error": "Invitation resend is temporarily unavailable", "code": "INVITATION_RESEND_THROTTLED" }; indeholder Retry-After
503USER_CURSOR_UNAVAILABLE{ "error": "User pagination is temporarily unavailable", "code": "USER_CURSOR_UNAVAILABLE" }
404RESOURCE_NOT_FOUND{ "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" }

POST /users/invitations kan også returnere den fælles 403 INSUFFICIENT_SCOPE efter fortolkning af anmodningsteksten, hvis users:access mangler, eller hvis en RFID blev angivet, og users:rfid mangler. Endpoints til lokale brugere viser alle påkrævede scopes i Endpointreference.

Brugerfejlkoderne gælder som følger:

EndpointgruppeBrugerdomænekoder ud over 404 og fælles svar
GET /usersINVALID_USER_CURSOR (400), USER_CURSOR_UNAVAILABLE (503)
POST /usersUSER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409)
PATCH /users/:userIdTAGLESS_USER_PROTECTED (409)
DELETE /users/:userIdTAGLESS_USER_PROTECTED, PROTECTED_WORKSPACE_USER, USER_RELATED_DATA (409)
Læsning af brugeroplysninger, køretøjer, RFID/adgang/grænseringen domænekode ud over 404
Oprettelse af RFIDCUSTOMER_CONTRACT_MISSING, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_RFID (422)
Opdatering/sletning af RFIDTAGLESS_USER_PROTECTED (409)
Erstatning af adgangTAGLESS_USER_PROTECTED (409); NO_CHARGERS_AVAILABLE (422)
Tilbagekaldelse af adgangTAGLESS_USER_PROTECTED (409)
Oprettelse/opdatering af grænseTAGLESS_USER_PROTECTED, LIMIT_ALREADY_EXISTS (409); INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE (422)
Sletning af grænseTAGLESS_USER_PROTECTED (409)
Oprettelse af arbejdsområdeinvitationCUSTOMER_CONTRACT_MISSING, INVITATION_EMAIL_IN_USE, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL/INVALID_RFID (422); INVITATION_RESEND_THROTTLED (429), når leveringsventetid gælder
Gensendelse af arbejdsområdeinvitationINVALID_EMAIL (422), INVITATION_RESEND_THROTTLED (429)
Annullering af arbejdsområdeinvitationINVALID_EMAIL (422)
Opret lokal laderbruger for eksisterende kundeLOCAL_USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409)
Invitation til lokal laderbrugerLOCAL_USER_ALREADY_EXISTS, INVITATION_EMAIL_IN_USE, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL (422); INVITATION_RESEND_THROTTLED (429), når leveringsventetid gælder
Annullering af invitation til lokal brugerINVALID_EMAIL (422)
Opdatering/sletning af lokal brugerTAGLESS_USER_PROTECTED (409)

Alle ejerskabs- og manglende-ressource-resultater i disse grupper, herunder en uregistreret e-mailadresse i POST /users, bruger den fælles 404 RESOURCE_NOT_FOUND-svartekst.

Svar uden svartekst og ved gentagelse

Et vellykket 204-svar har ingen svartekst. Det gælder alle dokumenterede sletninger, der angiver 204 empty. En fuldført idempotent gentagelse sætter Idempotency-Replayed: true og bruger den gemte status og svartekst; ved 204 forbliver HTTP-svaret uden svartekst. API'et returnerer aldrig et JSON-objekt ved en vellykket dokumenteret 204-handling.