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:
validationErrorsbliver tildetails.fields, ogcodebliver tilVALIDATION_FAILED, også når standardsvarteksten havde en domænekode.- En
codepå øverste niveau i standardsvaret bevares, når der ikke er valideringsfelter. - Andre egenskaber på øverste niveau bortset fra
error,message,validationErrorsogcodeflyttes tildetails; ved rapporteksport bliverlimitf.eks. tildetails.limit. - En
erroraf typen streng på øverste niveau bliver tilmessage. Hvis den ikke findes, bruges statuskodens standardtekst. - Standardkoder er
AUTH_REQUIRED(401),PERMISSION_DENIED(403),RESOURCE_NOT_FOUND(404),CONFLICT(409),VALIDATION_FAILED(422og andre uklassificerede4xx),RATE_LIMITED(429),EXTERNAL_PROVIDER_FAILED(502) ogINTERNAL_ERROR(andre5xx, inklusive503). requestIder den nøjagtigeX-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:
- konfiguration og autentificering af arbejdsområdetokens;
- værtspolitik og anmodningsgrænser for token/arbejdsområde;
- filtrering efter aktuelle rettigheder;
- idempotensvalidering og reservation ved hver ændringshandling;
- 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.
| Status | Hvornår | Nøjagtig svartekst | Relevante headere |
|---|---|---|---|
401 | Manglende, 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 |
404 | Tokenet er gyldigt, men dets arbejdsområdevært har ikke adminApiEnabled | { "error": "Not Found" } | Cache-Control: no-store |
429 | Anmodningspuljen for tokenet eller arbejdsområdet er opbrugt | { "error": "Too many attempts. Please try again later." } | Retry-After: <seconds> |
503 | Autentificering af arbejdsområdetokens er midlertidigt utilgængelig | { "error": "Admin API workspace-token configuration is unavailable", "code": "WORKSPACE_API_CONFIG_UNAVAILABLE" } | — |
503 | Opslag 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 for | Status | Nøjagtig svartekst | Headere/noter |
|---|---|---|---|
| Alle ruter efter autentificering | 403 | { "error": "Insufficient workspace-token scope", "code": "INSUFFICIENT_SCOPE" } | Returneres, når et påkrævet scope mangler. |
| Enhver ændringshandling | 400 | { "error": "Idempotency-Key is required for this operation", "code": "IDEMPOTENCY_KEY_REQUIRED" } | Ingen nøgle angivet. |
| Enhver ændringshandling | 400 | { "error": "Exactly one Idempotency-Key is required", "code": "INVALID_IDEMPOTENCY_KEY" } | Dubleret eller kommasepareret header. |
| Enhver ændringshandling | 400 | { "error": "Idempotency-Key must contain 1 to 255 visible characters", "code": "INVALID_IDEMPOTENCY_KEY" } | Tom, for lang eller indeholder et kontroltegn. |
| Enhver ændringshandling | 409 | { "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 ændringshandling | 409 | { "error": "Request is already processing", "code": "IDEMPOTENT_REQUEST_PROCESSING" } | Retry-After: 5. |
| Enhver ændringshandling | 409 | { "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 ændringshandling | 503 | { "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 sti | 422 | { "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åde | 404 | { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" } | Bruges konsekvent, medmindre en tabel nedenfor angiver andet. |
| Ethvert endpoint med en uventet fejl | 500 | { "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
| Endpoints | Status | Nøjagtig svartekst |
|---|---|---|
| Oprettelse/opdatering af sted; validering af arbejdsområdefelter | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
DELETE /v2/admin/sites/:siteId, når stedet har afhængigheder | 409 | { "error": "<message>", "code": "SITE_NOT_EMPTY" } |
GET /v2/admin/sites/geocode ugyldig normaliseret søgning | 400 | { "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 geokodningsfejl | 502 | { "error": "<message>", "code": "GEOCODING_UNAVAILABLE" }; en uventet fejl bruger Address search is temporarily unavailable |
PUT /v2/admin/sites/:siteId/power-management ugyldig topologi-/domænekonfiguration | 422 | { "error": "<message>", "code": "INVALID_POWER_MANAGEMENT_CONFIGURATION" } |
| Samme samt OCPP-afvisning/timeout, samtidigheds- eller afstemningskonflikt | 409 | { "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.
| Endpoints | Status | Nøjagtig svartekst |
|---|---|---|
| Enhver ovenstående handling med en domænevalideringsfejl | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Enhver ovenstående handling med en konflikt vedrørende tilstand, entydighed, offline/OCPP, fakturering, Tagless, stik eller parathed | 409 | { "error": "<message>", "code": "CHARGER_CONFLICT" } |
GET /chargers/:chargerId/sessions, ugyldigt standard- eller eksplicit tidsinterval | 422 | { "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
| Endpoints | Status | Nøjagtig svartekst |
|---|---|---|
Data-/eksportinterval, hvor from >= to | 422 | { "validationErrors": { "range": ["from must be earlier than to"] } } |
| Data-/eksportinterval over 90 dage | 422 | { "validationErrors": { "range": ["Report ranges cannot exceed 90 days"] } } |
| Ugyldig uigennemsigtig markør for data/målinger | 422 | { "validationErrors": { "cursor": ["<message>"] } } |
GET /reports/export, resultatet overstiger 2.000 rækker | 422 | { "error": "<message>", "code": "REPORT_EXPORT_ROW_LIMIT", "limit": 2000 } |
POST /reports/send, ingen gemt tidsplan | 409 | { "error": "A workspace report schedule must be saved before sending", "code": "REPORT_SCHEDULE_REQUIRED" } |
| Samme samt afvisning eller fejl fra mailafsender | 502 | { "error": "Report delivery failed", "code": "REPORT_DELIVERY_FAILED" } |
| Den ejede ressource til tidsplan/målinger findes ikke | 404 | fælles RESOURCE_NOT_FOUND-svartekst |
En vellykket eksport er binær; alle eksportfejl forbliver JSON.
Tariffejl
| Endpoints | Status | Nøjagtig svartekst |
|---|---|---|
| Domænevalidering for oprettelse/opdatering/komponenter/markedspris/tildeling | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Konflikt vedrørende tarifsletning eller tildelingens tilstand, afhængighed eller entydighed | 409 | { "error": "<message>", "code": "TARIFF_CONFLICT" } |
| Manglende ejerskab af tarif, budområde, lader, stik, tariftildeling eller anden underordnet ressource | 404 | fælles RESOURCE_NOT_FOUND-svartekst |
Fejl i ladeprofiler
| Endpoints | Status | Nøjagtig svartekst |
|---|---|---|
| Domænevalidering for oprettelse/opdatering/tidsplan/tildeling | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Profilen refereres af en beskyttet anvendelse | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_IN_USE" } |
| OCPP-synkronisering, tildeling, samtidighed eller anden profilkonflikt | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_CONFLICT" } |
| Manglende ejerskab af profil, lader, stik, tildeling eller anden underordnet ressource | 404 | fæ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.
| Status | Kode(r) | Anmodnings-/svartekst |
|---|---|---|
400 | INVALID_USER_CURSOR | { "validationErrors": { "cursor": ["The user-list cursor is invalid for the selected status"] }, "code": "INVALID_USER_CURSOR" } |
409 | USER_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>" } |
422 | INVALID_EMAIL, INVALID_RFID, INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE | { "validationErrors": { "<field>": ["<message>"] }, "code": "<listed code>" } |
422 | NO_CHARGERS_AVAILABLE | { "error": "No chargers are available", "code": "NO_CHARGERS_AVAILABLE" } |
429 | INVITATION_RESEND_THROTTLED | { "error": "Invitation resend is temporarily unavailable", "code": "INVITATION_RESEND_THROTTLED" }; indeholder Retry-After |
503 | USER_CURSOR_UNAVAILABLE | { "error": "User pagination is temporarily unavailable", "code": "USER_CURSOR_UNAVAILABLE" } |
404 | RESOURCE_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:
| Endpointgruppe | Brugerdomænekoder ud over 404 og fælles svar |
|---|---|
GET /users | INVALID_USER_CURSOR (400), USER_CURSOR_UNAVAILABLE (503) |
POST /users | USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409) |
PATCH /users/:userId | TAGLESS_USER_PROTECTED (409) |
DELETE /users/:userId | TAGLESS_USER_PROTECTED, PROTECTED_WORKSPACE_USER, USER_RELATED_DATA (409) |
| Læsning af brugeroplysninger, køretøjer, RFID/adgang/grænser | ingen domænekode ud over 404 |
| Oprettelse af RFID | CUSTOMER_CONTRACT_MISSING, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_RFID (422) |
| Opdatering/sletning af RFID | TAGLESS_USER_PROTECTED (409) |
| Erstatning af adgang | TAGLESS_USER_PROTECTED (409); NO_CHARGERS_AVAILABLE (422) |
| Tilbagekaldelse af adgang | TAGLESS_USER_PROTECTED (409) |
| Oprettelse/opdatering af grænse | TAGLESS_USER_PROTECTED, LIMIT_ALREADY_EXISTS (409); INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE (422) |
| Sletning af grænse | TAGLESS_USER_PROTECTED (409) |
| Oprettelse af arbejdsområdeinvitation | CUSTOMER_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ådeinvitation | INVALID_EMAIL (422), INVITATION_RESEND_THROTTLED (429) |
| Annullering af arbejdsområdeinvitation | INVALID_EMAIL (422) |
| Opret lokal laderbruger for eksisterende kunde | LOCAL_USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409) |
| Invitation til lokal laderbruger | LOCAL_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 bruger | INVALID_EMAIL (422) |
| Opdatering/sletning af lokal bruger | TAGLESS_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.