Administravimo API atsakymų ir klaidų sutartis
Šis failas papildo kiekvieno Galinių taškų žinyne esančio galinio taško atsakymų sutartį. Galinio taško eilutėje skaitykite sėkmingo atsakymo turinį, o toliau pateiktose lentelėse — visą bendrą ir konkrečiam taškui būdingą nesėkmės turinį. Pagal numatymą klaidos naudoja kelias suderinamumo struktūras; kviečiančiosios programos gali pasirinkti vieną universalų apvalkalą.
Neprivalomas struktūrizuotas klaidos apvalkalas
Siųskite šią užklausos antraštę bet kuriam galiniam taškui:
X-Error-Format: envelope
Lyginant reikšmes pašalinami kraštiniai tarpai ir neskiriamos didžiosios bei mažosios raidės. Esant tiksliai šiai reikšmei, kiekvienas JSON atsakymas, kurio būsena 400 arba didesnė, konvertuojamas į:
ErrorEnvelope = {
error: {
code: string,
message: string,
details: Record<string, unknown>,
requestId: string
}
}
Numatytojo tikrinimo turinio konvertavimo pavyzdys:
{
"error": {
"code": "VALIDATION_FAILED",
"message": "Invalid request",
"details": {
"fields": {
"name": ["String must contain at least 1 character(s)"]
}
},
"requestId": "integration-42"
}
}
Tikslios konvertavimo taisyklės:
validationErrorstampadetails.fields, ocodetampaVALIDATION_FAILED, net jei numatytajame turinyje buvo ir srities kodas.- Kai nėra tikrinamų laukų, išlaikoma numatytoji aukščiausio lygio
codereikšmė. - Kitos aukščiausio lygio savybės, išskyrus
error,message,validationErrorsircode, perkeliamos įdetails; pavyzdžiui, ataskaitos eksportolimittampadetails.limit. - Aukščiausio lygio eilutės tipo
errortampamessage. Jei tokio nėra, naudojamas numatytasis būsenos pranešimas. - Numatytieji kodai yra
AUTH_REQUIRED(401),PERMISSION_DENIED(403),RESOURCE_NOT_FOUND(404),CONFLICT(409),VALIDATION_FAILED(422ir kiti neklasifikuoti4xx),RATE_LIMITED(429),EXTERNAL_PROVIDER_FAILED(502) irINTERNAL_ERROR(kiti5xx, įskaitant503). requestIdyra tiksliX-Request-Idatsakymo antraštė. Kviečiančiosios programos pateiktas užklausos ID naudojamas tik jei pašalinus kraštinius tarpus atitinka[A-Za-z0-9._:-]{1,128}; kitu atveju serveris sugeneruoja UUID.
Ši transformacija nekeičia būsenos ar su turiniu nesusijusių antraščių. Ji taip pat taikoma idempotentiniams pakartojimams pagal pakartojimo užklausos X-Error-Format antraštę. Dvejetainiai sėkmingi atsakymai lieka dvejetainiai; jų JSON klaidos įdedamos į apvalkalą. Likusiose lentelėse parodytas numatytasis turinys; pritaikius pirmiau pateiktas taisykles gaunamas kitas galimas kiekvienos eilutės atsakymo turinys.
Atsakymų žymėjimas
ValidationError = {
validationErrors: Record<string, string[]>,
code?: string
}
CodedError = {
error: string,
code: string,
// a route may add fields explicitly listed below
}
PlainError = { error: string }
error ir tikrinimo pranešimo tekstas yra aprašomieji, o ne stabilus programinis skiriamasis požymis. Sprendimus grįskite code, kai jis pateiktas. Užklausos tikrinimas grąžina 422 ValidationError; viso objekto tikrinimas gali pateikti { "validationErrors": {} }, kai nenurodytas atskiras laukas. Netinkamas JSON ir netikėti sutrikimai grąžina bendrą toliau parodytą 500 PlainError.
Visi JSON pavyzdžiai rodo tikslią turinio struktūrą. Tekstas, pateiktas kaip <message>, yra grąžintas tikrinimo arba operacijos pranešimas ir yra JSON eilutė, o ne pažodinė reikšmė su kampiniais skliaustais.
Užklausų apdorojimo tvarka
Užklausos apdorojamos tokia tvarka:
- darbo srities prieigos raktų konfigūracija ir autentifikavimas;
- paslaugos teikėjo taisyklės ir prieigos rakto / darbo srities užklausų dažnio ribos;
- filtravimas pagal esamas teises;
- kiekvienai duomenų keitimo operacijai — idempotentiškumo tikrinimas / rakto rezervavimas;
- galinio taško prieigos sričių tikrinimas, užklausos tikrinimas ir prašoma operacija.
Todėl net duomenų keitimo užklausoje su galiojančiu, bet nepakankamų prieigos sričių raktu būtina siųsti Idempotency-Key. Užbaigtą 403, 404, 409 arba 422 duomenų keitimo atsakymą galima pakartotinai gauti naudojant tą patį raktą ir užklausą.
Autentifikavimo, prieigos taisyklių ir užklausų dažnio ribojimo atsakymai
Šie atsakymai gali pasitaikyti bet kuriame registruotame /v2/admin galiniame taške prieš jam būdingą apdorojimą.
| Būsena | Kada | Tikslus turinys | Susijusios antraštės |
|---|---|---|---|
401 | Trūkstamas, pasikartojantis, kableliais sujungtas, ne „Bearer“ schemos, netaisyklingas, nežinomas, pasibaigusio galiojimo, atšauktas arba kitaip netinkamas darbo srities prieigos raktas | { "error": "Unauthorized", "code": "INVALID_WORKSPACE_TOKEN" } | WWW-Authenticate: Bearer, Cache-Control: no-store |
404 | Prieigos raktas galioja, bet jo darbo srities paslaugos teikėjas neturi adminApiEnabled | { "error": "Not Found" } | Cache-Control: no-store |
429 | Išnaudota prieigos rakto arba darbo srities užklausų kvota | { "error": "Too many attempts. Please try again later." } | Retry-After: <seconds> |
503 | Darbo srities prieigos rakto autentifikavimas laikinai nepasiekiamas | { "error": "Admin API workspace-token configuration is unavailable", "code": "WORKSPACE_API_CONFIG_UNAVAILABLE" } | — |
503 | Nepavyksta gauti paslaugos teikėjo taisyklių arba patikrinti esamų teisių | { "error": "Workspace authorization is temporarily unavailable", "code": "WORKSPACE_AUTHORIZATION_UNAVAILABLE" } | — |
API prieiga įtraukta į visus planus. Išjungus darbo srities paslaugos teikėjo nustatymą adminApiEnabled, grąžinamas 404; praradus papildomą teisę į funkciją pašalinamos tik paveiktos prieigos sritys. Toks prieigos srities atmetimas naudoja toliau pateiktą atsakymą, o ne prieigos rakto atnaujinimo eigą.
Prieigos srities, idempotentiškumo, analizavimo, nuosavybės ir netikėti sutrikimai
| Taikoma | Būsena | Tikslus turinys | Antraštės / pastabos |
|---|---|---|---|
| Kiekvienas maršrutas po autentifikavimo | 403 | { "error": "Insufficient workspace-token scope", "code": "INSUFFICIENT_SCOPE" } | Grąžinama, kai trūksta bet kurios būtinos prieigos srities. |
| Kiekviena duomenų keitimo operacija | 400 | { "error": "Idempotency-Key is required for this operation", "code": "IDEMPOTENCY_KEY_REQUIRED" } | Raktas nepateiktas. |
| Kiekviena duomenų keitimo operacija | 400 | { "error": "Exactly one Idempotency-Key is required", "code": "INVALID_IDEMPOTENCY_KEY" } | Pasikartojanti arba kableliais sujungta antraštė. |
| Kiekviena duomenų keitimo operacija | 400 | { "error": "Idempotency-Key must contain 1 to 255 visible characters", "code": "INVALID_IDEMPOTENCY_KEY" } | Tuščia, per ilga arba yra valdymo simbolis. |
| Kiekviena duomenų keitimo operacija | 409 | { "error": "Idempotency-Key was already used with a different request", "code": "IDEMPOTENCY_CONFLICT" } | Tas pats prieigos raktas / metodas / kelias / raktas, bet kitas URL arba turinys. |
| Kiekviena duomenų keitimo operacija | 409 | { "error": "Request is already processing", "code": "IDEMPOTENT_REQUEST_PROCESSING" } | Retry-After: 5. |
| Kiekviena duomenų keitimo operacija | 409 | { "error": "Previous request outcome is unknown; verify its effects before attempting the operation again", "code": "IDEMPOTENCY_OUTCOME_UNKNOWN" } | Ankstesnės apdorojimo rezervacijos laikas baigėsi, ryšys nutrūko arba užklausa baigta su 5xx. |
| Kiekviena duomenų keitimo operacija | 503 | { "error": "Idempotency storage unavailable", "code": "IDEMPOTENCY_UNAVAILABLE" } | API negali patikrinti arba išsaugoti idempotentiškumo įrašo. |
| Bet kuris galinis taškas su netinkama užklausos parametrų, turinio arba kelio schema | 422 | { "validationErrors": { "<field>": ["<message>"] } } | Gali būti keli laukai arba pranešimai. Kviečiančiosios programos negali pateikti cpoId; darbo sritis visada nustatoma iš prieigos rakto. |
| Bet kuris nerastas įdėtasis darbo srities išteklius arba kitos darbo srities ID | 404 | { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" } | Naudojama nuosekliai, nebent toliau pateikta lentelė nurodo kitaip. |
| Bet kuris galinis taškas, kuriame įvyko netikėtas sutrikimas | 500 | { "error": "Something went wrong" } | Duomenų keitimo operacijoms vėliau pakartojus tą patį raktą gaunamas 409 IDEMPOTENCY_OUTCOME_UNKNOWN. |
Išteklių kelio ID turi būti teigiami skaičiai. Neteigiamas arba neskaitinis :siteId, :chargerId, :portId, :tariffId, :profileId, :assignmentId, :userId, :rfidId, :accessId, :limitId arba :localUserId grąžina 422 ValidationError, o ne 400.
Vietų ir galios valdymo klaidos
| Galiniai taškai | Būsena | Tikslus turinys |
|---|---|---|
| Vietos kūrimas / atnaujinimas; darbo srities laukų tikrinimas | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
DELETE /v2/admin/sites/:siteId, kai vieta turi priklausomybių | 409 | { "error": "<message>", "code": "SITE_NOT_EMPTY" } |
GET /v2/admin/sites/geocode netinkama normalizuota paieška | 400 | { "error": "<message>", "code": "INVALID_GEOCODE_QUERY" } |
| Tas pats, užpildyta ribota paslaugos teikėjo eilė | 429 | { "error": "<message>", "code": "GEOCODING_BUSY" }; apima Retry-After, kai pateikia geokodavimo paslauga |
| Tas pats, paslaugos teikėjo laukimo laiko pabaiga / sutrikimas arba netikėta geokodavimo klaida | 502 | { "error": "<message>", "code": "GEOCODING_UNAVAILABLE" }; netikėta klaida naudoja Address search is temporarily unavailable |
PUT /v2/admin/sites/:siteId/power-management netinkama topologijos / srities konfigūracija | 422 | { "error": "<message>", "code": "INVALID_POWER_MANAGEMENT_CONFIGURATION" } |
| Tas pats, OCPP atmetimas / laukimo laiko pabaiga, lygiagrečių operacijų lenktynės arba suderinimo konfliktas | 409 | { "error": "<message>", "code": "POWER_MANAGEMENT_CONFLICT" } |
Įkroviklių klaidos
mapChargerErrors() naudojamas įkrovikliui kurti / atnaujinti, prisijungimo duomenims, jungties nustatymams, viešam paskelbimui, QR duomenų nustatymui, konfigūracijos keitimui / įkėlimui iš naujo, programinės aparatinės įrangos naujinimui pradėti, visoms keturioms pagrindinėms komandoms ir sudėtinio tvarkaraščio užklausai.
| Galiniai taškai | Būsena | Tikslus turinys |
|---|---|---|
| Bet kuri pirmiau nurodyta operacija su srities taisyklių tikrinimo klaida | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Bet kuri pirmiau nurodyta operacija su būsenos, unikalumo, darbo be ryšio/OCPP, atsiskaitymo, veikimo be žymos, jungties arba pasirengimo konfliktu | 409 | { "error": "<message>", "code": "CHARGER_CONFLICT" } |
GET /chargers/:chargerId/sessions, netinkamas numatytasis arba aiškiai nurodytas laiko intervalas | 422 | { "validationErrors": { "from": ["from must be before or equal to to"] } } arba { "validationErrors": { "from": ["Session range cannot exceed 90 days"] } } |
Paprastos skaitymo operacijos grąžina tik bendrus 401/403/404/429/500/503 atsakymus ir 422 užklausos parametrų ar kelio tikrinimo atsakymą. Įkroviklio trynimas gali grąžinti bendrą 500 PlainError, jei trynimas nepavyksta be konkretesnio klaidos atsakymo.
Ataskaitų klaidos
| Galiniai taškai | Būsena | Tikslus turinys |
|---|---|---|
Duomenų / eksporto intervalas, kuriame from >= to | 422 | { "validationErrors": { "range": ["from must be earlier than to"] } } |
| Duomenų / eksporto intervalas ilgesnis nei 90 dienų | 422 | { "validationErrors": { "range": ["Report ranges cannot exceed 90 days"] } } |
| Netinkamas nepermatomas duomenų / matavimų žymeklis | 422 | { "validationErrors": { "cursor": ["<message>"] } } |
GET /reports/export, rezultatas viršija 2 000 eilučių | 422 | { "error": "<message>", "code": "REPORT_EXPORT_ROW_LIMIT", "limit": 2000 } |
POST /reports/send, nėra išsaugoto tvarkaraščio | 409 | { "error": "A workspace report schedule must be saved before sending", "code": "REPORT_SCHEDULE_REQUIRED" } |
| Tas pats, laiškų siuntimo sistema atmeta arba neveikia | 502 | { "error": "Report delivery failed", "code": "REPORT_DELIVERY_FAILED" } |
| Nėra priklausančio tvarkaraščio / matavimų ištekliaus | 404 | bendras RESOURCE_NOT_FOUND turinys |
Sėkmingas eksportas yra dvejetainis; visos eksporto klaidos lieka JSON formato.
Tarifų klaidos
| Galiniai taškai | Būsena | Tikslus turinys |
|---|---|---|
| Kūrimo / atnaujinimo / komponentų / rinkos kainos / priskyrimo srities taisyklių tikrinimas | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Tarifo trynimo arba priskyrimo būsenos / priklausomybių / unikalumo konfliktas | 409 | { "error": "<message>", "code": "TARIFF_CONFLICT" } |
| Nerastas priklausantis tarifas, prekybos zona, įkroviklis, jungtis, tarifo priskyrimas arba kitas įdėtasis išteklius | 404 | bendras RESOURCE_NOT_FOUND turinys |
Įkrovimo profilių klaidos
| Galiniai taškai | Būsena | Tikslus turinys |
|---|---|---|
| Kūrimo / atnaujinimo / tvarkaraščio / priskyrimo srities taisyklių tikrinimas | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Profilis naudojamas apsaugotoje vietoje | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_IN_USE" } |
| OCPP sinchronizavimo, priskyrimo, lygiagretumo arba kitas profilio konfliktas | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_CONFLICT" } |
| Nerastas priklausantis profilis, įkroviklis, jungtis, priskyrimas arba kitas įdėtasis išteklius | 404 | bendras RESOURCE_NOT_FOUND turinys |
Naudotojo srities klaidos
Naudotojų tikrinimo klaidos, nurodančios lauką, naudoja ValidationError ir code; kitos naudotojų klaidos naudoja CodedError. Visi nerastų išteklių atvejai naudoja bendrą egzistavimo neatskleidžiantį RESOURCE_NOT_FOUND atsakymą.
| Būsena | Kodas (-ai) | Turinys |
|---|---|---|
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" }; apima 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 taip pat gali grąžinti bendrą 403 INSUFFICIENT_SCOPE po turinio analizavimo, jei trūksta users:access, arba jei pateiktas RFID ir trūksta users:rfid. Vietinių naudotojų galiniai taškai išvardija visas būtinas prieigos sritis Galinių taškų žinyne.
Naudotojų klaidų kodai taikomi taip:
| Galinių taškų grupė | Naudotojo srities kodai, išskyrus 404, papildantys bendrus atsakymus |
|---|---|
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) |
| Naudotojo informacija, automobiliai, RFID / prieigos / ribų skaitymas | nėra srities kodo, išskyrus 404 |
| RFID kūrimas | CUSTOMER_CONTRACT_MISSING, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_RFID (422) |
| RFID atnaujinimas / trynimas | TAGLESS_USER_PROTECTED (409) |
| Prieigos pakeitimas | TAGLESS_USER_PROTECTED (409); NO_CHARGERS_AVAILABLE (422) |
| Prieigos panaikinimas | TAGLESS_USER_PROTECTED (409) |
| Ribos kūrimas / atnaujinimas | TAGLESS_USER_PROTECTED, LIMIT_ALREADY_EXISTS (409); INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE (422) |
| Ribos trynimas | TAGLESS_USER_PROTECTED (409) |
| Darbo srities kvietimo kūrimas | CUSTOMER_CONTRACT_MISSING, INVITATION_EMAIL_IN_USE, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL/INVALID_RFID (422); INVITATION_RESEND_THROTTLED (429), kai taikomas pristatymo laukimo intervalas |
| Darbo srities kvietimo persiuntimas | INVALID_EMAIL (422), INVITATION_RESEND_THROTTLED (429) |
| Darbo srities kvietimo atšaukimas | INVALID_EMAIL (422) |
| Įkroviklio vietinio naudotojo kūrimas esamam klientui | LOCAL_USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409) |
| Įkroviklio vietinio naudotojo kvietimas | LOCAL_USER_ALREADY_EXISTS, INVITATION_EMAIL_IN_USE, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL (422); INVITATION_RESEND_THROTTLED (429), kai taikomas pristatymo laukimo intervalas |
| Vietinio naudotojo kvietimo atšaukimas | INVALID_EMAIL (422) |
| Vietinio naudotojo atnaujinimas / trynimas | TAGLESS_USER_PROTECTED (409) |
Visi šių grupių nuosavybės ir nerastų išteklių rezultatai, įskaitant neregistruotą el. pašto adresą POST /users atveju, naudoja bendrą 404 RESOURCE_NOT_FOUND turinį.
Atsakymai be turinio ir pakartojimų atsakymai
Sėkmingas 204 atsakymas neturi turinio. Tai taikoma visoms dokumentuotoms trynimo operacijoms, kurioms nurodytas 204 empty. Užbaigtas idempotentinis pakartojimas nustato Idempotency-Replayed: true ir naudoja išsaugotą būseną bei turinį; 204 atveju HTTP atsakymas vis tiek lieka be turinio. API niekada negrąžina JSON sėkmės objekto dokumentuotai 204 operacijai.