Pogodba odgovorov in napak Admin API
Ta datoteka dopolnjuje pogodbo odgovorov za vsako končno točko v Referenci končnih točk. Za uspešno telo preberite vrstico končne točke, za vsa skupna ali posebna neuspešna telesa pa spodnje tabele. Napake privzeto uporabljajo več združljivostnih oblik; klicatelji lahko izberejo eno univerzalno ovojnico.
Neobvezna strukturirana ovojnica napak
Kateri koli končni točki pošljite to glavo zahteve:
X-Error-Format: envelope
Primerjava vrednosti odstrani robne presledke in ne razlikuje velikosti črk. Pri tej natančni vrednosti se vsak odgovor JSON s stanjem 400 ali višjim pretvori v:
ErrorEnvelope = {
error: {
code: string,
message: string,
details: Record<string, unknown>,
requestId: string
}
}
Primer pretvorbe privzetega telesa preverjanja:
{
"error": {
"code": "VALIDATION_FAILED",
"message": "Invalid request",
"details": {
"fields": {
"name": ["String must contain at least 1 character(s)"]
}
},
"requestId": "integration-42"
}
}
Pravila pretvorbe so natančna:
validationErrorspostanedetails.fieldsincodepostaneVALIDATION_FAILED, tudi če je privzeto telo imelo domensko kodo.- Privzeti
codena najvišji ravni se ohrani, kadar ni polj za preverjanje veljavnosti. - Druge lastnosti najvišje ravni razen
error,message,validationErrorsincodese premaknejo vdetails; na primerlimitizvoza poročila postanedetails.limit. - Niz
errorna najvišji ravni postanemessage. Če ga ni, se uporabi nadomestna vrednost za stanje. - Nadomestne kode so
AUTH_REQUIRED(401),PERMISSION_DENIED(403),RESOURCE_NOT_FOUND(404),CONFLICT(409),VALIDATION_FAILED(422in drugi nerazvrščeni4xx),RATE_LIMITED(429),EXTERNAL_PROVIDER_FAILED(502) inINTERNAL_ERROR(drugi5xx, vključno z503). requestIdje natančna glava odgovoraX-Request-Id. ID zahteve, ki ga poda klicatelj, se uporabi samo, če po obrezovanju ustreza[A-Za-z0-9._:-]{1,128}; sicer strežnik ustvari UUID.
Ta pretvorba ne spreminja stanja ali glav, nepovezanih s telesom. Velja tudi za idempotentne ponovitve glede na glavo X-Error-Format ponovljene zahteve. Binarni uspešni odgovori ostanejo binarni; njihove napake JSON dobijo ovojnico. Preostale tabele prikazujejo privzeta telesa; zgornja pravila dajo drugo možno telo odgovora za vsako vrstico.
Oznake odgovorov
ValidationError = {
validationErrors: Record<string, string[]>,
code?: string
}
CodedError = {
error: string,
code: string,
// a route may add fields explicitly listed below
}
PlainError = { error: string }
error in besedilo sporočila preverjanja sta opisna, ne stabilna programska razlikovalnika. Razvejite po code, kadar je prisoten. Preverjanje zahteve vrne 422 ValidationError; preverjanje celotnega objekta lahko vrne { "validationErrors": {} }, kadar posamezno polje ni določeno. Neveljaven JSON in nepričakovane napake vrnejo spodaj prikazani globalni 500 PlainError.
Vsi primeri JSON prikazujejo natančne oblike teles. Besedilo <message> je vrnjeno sporočilo preverjanja ali operacije in je niz JSON, ne dobesedna vrednost v kotnih oklepajih.
Vrstni red obdelave zahtev
Zahteve se obdelajo v tem vrstnem redu:
- konfiguracija in overjanje žetona delovnega prostora;
- pravilnik gostitelja in omejitve zahtev žetona/delovnega prostora;
- filtriranje trenutnih pravic;
- za vsako spremembo preverjanje/rezervacija idempotentnosti;
- preverjanje obsegov končne točke, preverjanje zahteve in zahtevana operacija.
Zato mora tudi sprememba z veljavnim žetonom s preozkim obsegom poslati Idempotency-Key. Dokončan odgovor spremembe 403, 404, 409 ali 422 je mogoče ponoviti z istim ključem/zahtevo.
Odgovori za overjanje, pravilnike in omejevanje zahtev
Ti odgovori se lahko pojavijo pri vsaki registrirani končni točki /v2/admin pred obdelavo, značilno zanjo.
| Stanje | Kdaj | Natančno telo | Ustrezne glave |
|---|---|---|---|
401 | Manjkajoči, podvojeni, z vejico združeni, ne-Bearer, napačno oblikovani, neznani, potekli, preklicani ali drugače neveljavni žeton delovnega prostora | { "error": "Unauthorized", "code": "INVALID_WORKSPACE_TOKEN" } | WWW-Authenticate: Bearer, Cache-Control: no-store |
404 | Žeton je veljaven, vendar gostitelj njegovega delovnega prostora nima adminApiEnabled | { "error": "Not Found" } | Cache-Control: no-store |
429 | Kvota zahtev žetona ali delovnega prostora je izčrpana | { "error": "Too many attempts. Please try again later." } | Retry-After: <seconds> |
503 | Overjanje z žetonom delovnega prostora začasno ni na voljo | { "error": "Admin API workspace-token configuration is unavailable", "code": "WORKSPACE_API_CONFIG_UNAVAILABLE" } | — |
503 | Iskanje pravilnika gostitelja ali preverjanje trenutnih pravic ni uspelo | { "error": "Workspace authorization is temporarily unavailable", "code": "WORKSPACE_AUTHORIZATION_UNAVAILABLE" } | — |
Dostop API je vključen v vsak paket. Izklop nastavitve adminApiEnabled gostitelja delovnega prostora vrne 404; izguba dodatne pravice do funkcije odstrani samo prizadete obsege. Nastala zavrnitev obsega uporabi spodnji odgovor in ne postopka osveževanja žetona.
Obseg, idempotentnost, razčlenjevanje, lastništvo in nepričakovane napake
| Velja za | Stanje | Natančno telo | Glave/opombe |
|---|---|---|---|
| Vsaka pot po overjanju | 403 | { "error": "Insufficient workspace-token scope", "code": "INSUFFICIENT_SCOPE" } | Vrne se, če manjka kateri koli zahtevani obseg. |
| Vsaka sprememba | 400 | { "error": "Idempotency-Key is required for this operation", "code": "IDEMPOTENCY_KEY_REQUIRED" } | Ključ ni podan. |
| Vsaka sprememba | 400 | { "error": "Exactly one Idempotency-Key is required", "code": "INVALID_IDEMPOTENCY_KEY" } | Podvojena glava ali vrednosti, združene z vejico. |
| Vsaka sprememba | 400 | { "error": "Idempotency-Key must contain 1 to 255 visible characters", "code": "INVALID_IDEMPOTENCY_KEY" } | Prazno, predolgo ali vsebuje nadzorni znak. |
| Vsaka sprememba | 409 | { "error": "Idempotency-Key was already used with a different request", "code": "IDEMPOTENCY_CONFLICT" } | Isti žeton/metoda/pot/ključ, drug URL ali telo. |
| Vsaka sprememba | 409 | { "error": "Request is already processing", "code": "IDEMPOTENT_REQUEST_PROCESSING" } | Retry-After: 5. |
| Vsaka sprememba | 409 | { "error": "Previous request outcome is unknown; verify its effects before attempting the operation again", "code": "IDEMPOTENCY_OUTCOME_UNKNOWN" } | Prejšnji najem obdelave je potekel, povezava se je zaprla ali se je zahteva končala z 5xx. |
| Vsaka sprememba | 503 | { "error": "Idempotency storage unavailable", "code": "IDEMPOTENCY_UNAVAILABLE" } | API ne more preveriti ali shraniti zapisa idempotentnosti. |
| Katera koli končna točka z neveljavno shemo poizvedbe/telesa/poti | 422 | { "validationErrors": { "<field>": ["<message>"] } } | Prisotnih je lahko več polj/sporočil. Klicatelji ne morejo podati cpoId; delovni prostor vedno izhaja iz žetona. |
| Kateri koli manjkajoči gnezdeni vir ali ID drugega delovnega prostora | 404 | { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" } | Dosledno uporabljeno, razen če spodnja tabela navaja drugače. |
| Katera koli končna točka z nepričakovano napako | 500 | { "error": "Something went wrong" } | Pri spremembah poznejši ponovni poskus z istim ključem vrne 409 IDEMPOTENCY_OUTCOME_UNKNOWN. |
ID-ji poti virov morajo biti pozitivna števila. Nepozitivni ali neštevilčni :siteId, :chargerId, :portId, :tariffId, :profileId, :assignmentId, :userId, :rfidId, :accessId, :limitId ali :localUserId vrne 422 ValidationError, ne 400.
Napake lokacij in upravljanja moči
| Končne točke | Stanje | Natančno telo |
|---|---|---|
| Ustvarjanje/posodobitev lokacije; preverjanje polj delovnega prostora | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
DELETE /v2/admin/sites/:siteId, kadar ima lokacija odvisnosti | 409 | { "error": "<message>", "code": "SITE_NOT_EMPTY" } |
GET /v2/admin/sites/geocode neveljavno normalizirano iskanje | 400 | { "error": "<message>", "code": "INVALID_GEOCODE_QUERY" } |
| Enako, omejena čakalna vrsta ponudnika je polna | 429 | { "error": "<message>", "code": "GEOCODING_BUSY" }; vključuje Retry-After, kadar ga poda geokoder |
| Enako, časovna omejitev/napaka ponudnika ali nepričakovana napaka geokoderja | 502 | { "error": "<message>", "code": "GEOCODING_UNAVAILABLE" }; nepričakovana napaka uporablja Address search is temporarily unavailable |
PUT /v2/admin/sites/:siteId/power-management neveljavna topologija/domenska konfiguracija | 422 | { "error": "<message>", "code": "INVALID_POWER_MANAGEMENT_CONFIGURATION" } |
| Enako, zavrnitev OCPP/časovna omejitev, sočasna sprememba ali spor uskladitve | 409 | { "error": "<message>", "code": "POWER_MANAGEMENT_CONFLICT" } |
Napake polnilnic
mapChargerErrors() se uporablja za ustvarjanje/posodobitev polnilnice, poverilnice, nastavitve priključkov, javno objavo, razreševanje vsebine QR, spremembo/ponovno nalaganje konfiguracije, začetek vdelane programske opreme, vse štiri osnovne ukaze in zahtevo sestavljenega urnika.
| Končne točke | Stanje | Natančno telo |
|---|---|---|
| Katera koli zgornja operacija z domensko napako preverjanja | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Katera koli zgornja operacija s sporom stanja, enoličnosti, povezave/OCPP, obračunavanja, Tagless, priključka ali pripravljenosti | 409 | { "error": "<message>", "code": "CHARGER_CONFLICT" } |
GET /chargers/:chargerId/sessions, neveljavno privzeto/izrecno časovno obdobje | 422 | { "validationErrors": { "from": ["from must be before or equal to to"] } } ali { "validationErrors": { "from": ["Session range cannot exceed 90 days"] } } |
Običajne bralne operacije vračajo samo skupne odgovore 401/403/404/429/500/503 in preverjanje poizvedbe/poti 422. Izbris polnilnice lahko vrne skupni 500 PlainError, če ne uspe brez natančnejšega odgovora napake.
Napake poročil
| Končne točke | Stanje | Natančno telo |
|---|---|---|
Obdobje podatkov/izvoza, kjer from >= to | 422 | { "validationErrors": { "range": ["from must be earlier than to"] } } |
| Obdobje podatkov/izvoza nad 90 dni | 422 | { "validationErrors": { "range": ["Report ranges cannot exceed 90 days"] } } |
| Neveljaven neprosojni kazalec podatkov/meritev | 422 | { "validationErrors": { "cursor": ["<message>"] } } |
GET /reports/export, rezultat presega 2.000 vrstic | 422 | { "error": "<message>", "code": "REPORT_EXPORT_ROW_LIMIT", "limit": 2000 } |
POST /reports/send, brez shranjenega urnika | 409 | { "error": "A workspace report schedule must be saved before sending", "code": "REPORT_SCHEDULE_REQUIRED" } |
| Enako, poštna storitev zavrne/ne uspe | 502 | { "error": "Report delivery failed", "code": "REPORT_DELIVERY_FAILED" } |
| Vir urnika/meritev v lasti manjka | 404 | skupno telo RESOURCE_NOT_FOUND |
Uspešen izvoz je binaren; vse napake izvoza ostanejo JSON.
Napake tarif
| Končne točke | Stanje | Natančno telo |
|---|---|---|
| Domensko preverjanje ustvarjanja/posodobitve/komponent/tržnih cen/dodelitve | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Spor stanja/odvisnosti/enoličnosti pri izbrisu ali dodelitvi tarife | 409 | { "error": "<message>", "code": "TARIFF_CONFLICT" } |
| Tarifa, trgovalno območje, polnilnica, priključek, dodelitev tarife ali drug gnezdeni vir ne pripada lastniku | 404 | skupno telo RESOURCE_NOT_FOUND |
Napake profilov polnjenja
| Končne točke | Stanje | Natančno telo |
|---|---|---|
| Domensko preverjanje ustvarjanja/posodobitve/urnika/dodelitve | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Na profil se sklicuje zaščitena uporaba | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_IN_USE" } |
| Spor sinhronizacije OCPP, dodelitve, sočasnosti ali drugega profila | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_CONFLICT" } |
| Profil, polnilnica, priključek, dodelitev ali drug gnezdeni vir ne pripada lastniku | 404 | skupno telo RESOURCE_NOT_FOUND |
Napake uporabniške domene
Napake preverjanja uporabnikov, ki določajo polje, uporabljajo ValidationError in code; druge uporabniške napake uporabljajo CodedError. Vsi primeri manjkajočih virov uporabljajo skupni nerazkrivajoči odgovor RESOURCE_NOT_FOUND.
| Stanje | Kode | Telo |
|---|---|---|
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" }; vključuje 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 lahko po razčlenjevanju telesa vrne tudi skupni 403 INSUFFICIENT_SCOPE, če manjka users:access ali če je podan RFID in manjka users:rfid. Končne točke lokalnih uporabnikov navajajo vsak zahtevani obseg v Referenci končnih točk.
Kode uporabniških napak se uporabljajo tako:
| Skupina končnih točk | Uporabniške domenske kode, različne od 404, poleg skupnih odgovorov |
|---|---|
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) |
| Branje podrobnosti uporabnika, vozil, RFID/dostopa/omejitev | brez domenske kode, različne od 404 |
| Ustvarjanje RFID | CUSTOMER_CONTRACT_MISSING, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_RFID (422) |
| Posodobitev/izbris RFID | TAGLESS_USER_PROTECTED (409) |
| Zamenjava dostopa | TAGLESS_USER_PROTECTED (409); NO_CHARGERS_AVAILABLE (422) |
| Preklic dostopa | TAGLESS_USER_PROTECTED (409) |
| Ustvarjanje/posodobitev omejitve | TAGLESS_USER_PROTECTED, LIMIT_ALREADY_EXISTS (409); INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE (422) |
| Izbris omejitve | TAGLESS_USER_PROTECTED (409) |
| Ustvarjanje povabila v delovni prostor | CUSTOMER_CONTRACT_MISSING, INVITATION_EMAIL_IN_USE, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL/INVALID_RFID (422); INVITATION_RESEND_THROTTLED (429), kadar velja čakalni čas dostave |
| Ponovno pošiljanje povabila v delovni prostor | INVALID_EMAIL (422), INVITATION_RESEND_THROTTLED (429) |
| Preklic povabila v delovni prostor | INVALID_EMAIL (422) |
| Ustvarjanje lokalnega uporabnika polnilnice za obstoječo stranko | LOCAL_USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409) |
| Povabilo lokalnega uporabnika polnilnice | LOCAL_USER_ALREADY_EXISTS, INVITATION_EMAIL_IN_USE, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL (422); INVITATION_RESEND_THROTTLED (429), kadar velja čakalni čas dostave |
| Preklic povabila lokalnega uporabnika | INVALID_EMAIL (422) |
| Posodobitev/izbris lokalnega uporabnika | TAGLESS_USER_PROTECTED (409) |
Vsi izidi lastništva in manjkajočih virov v teh skupinah, tudi neregistriran e-poštni naslov pri POST /users, uporabljajo skupno telo 404 RESOURCE_NOT_FOUND.
Odgovori brez telesa in ponovljeni odgovori
Uspešen odgovor 204 nima telesa. To velja za vsak dokumentiran izbris, ki navaja 204 empty. Dokončano idempotentno ponavljanje nastavi Idempotency-Replayed: true in uporabi shranjeno stanje/telo; pri 204 odgovor HTTP ostane brez telesa. API nikoli ne vrne uspešnega objekta JSON za dokumentirano operacijo 204.