Adminisztrációs API válasz- és hibaszerződése
Ez a fájl egészíti ki a Végpontreferencia összes végpontjának válaszszerződését. A sikertörzset a végpont sorában, minden közös vagy végpontspecifikus sikertelen törzset az alábbi táblázatokban talál. A hibák alapértelmezetten több kompatibilitási formát használnak; a hívók egységes univerzális burkolót választhatnak.
Opcionális strukturált hibaburkoló
Bármely végponton elküldheti ezt a kérésfejlécet:
X-Error-Format: envelope
Az összehasonlítás a szélső szóközök nélkül, kis- és nagybetűk megkülönböztetése nélkül történik. Ennél a pontos értéknél minden 400 vagy magasabb állapotú JSON-válasz így alakul át:
ErrorEnvelope = {
error: {
code: string,
message: string,
details: Record<string, unknown>,
requestId: string
}
}
Példa egy alapértelmezett érvényesítési törzs átalakítására:
{
"error": {
"code": "VALIDATION_FAILED",
"message": "Invalid request",
"details": {
"fields": {
"name": ["String must contain at least 1 character(s)"]
}
},
"requestId": "integration-42"
}
}
Az átalakítási szabályok pontosak:
- A(z)
validationErrorsértékbőldetails.fields, a(z)codeértékbőlVALIDATION_FAILEDlesz akkor is, ha az alapértelmezett törzs tartománykódot is tartalmazott. - Érvényesítési mezők hiányában a rendszer megtartja az alapértelmezett legfelső szintű
codeértéket. - A(z)
error,message,validationErrorséscodekivételével minden más legfelső szintű tulajdonság a(z)detailsalá kerül; például a jelentésexportlimitértékébőldetails.limitlesz. - A karakterlánc típusú legfelső szintű
errorértékbőlmessagelesz. Ha nincs ilyen, az állapothoz tartozó tartalékérték érvényesül. - A tartalékkódok:
AUTH_REQUIRED(401),PERMISSION_DENIED(403),RESOURCE_NOT_FOUND(404),CONFLICT(409),VALIDATION_FAILED(422és más besorolatlan4xx),RATE_LIMITED(429),EXTERNAL_PROVIDER_FAILED(502) ésINTERNAL_ERROR(más5xx, beleértve a(z)503esetet). - A(z)
requestIda pontosX-Request-Idválaszfejléc. A hívó által megadott kérésazonosítót csak akkor használja a rendszer, ha a szélső szóközök eltávolítása után megfelel a(z)[A-Za-z0-9._:-]{1,128}mintának; máskülönben a szerver UUID-t generál.
Az átalakítás nem módosítja az állapotot vagy a nem törzshöz tartozó fejléceket. Az idempotens újrajátszásokra is érvényes az újrajátszási kérés X-Error-Format fejléce szerint. A bináris sikerválaszok binárisak maradnak; JSON-hibáik burkolót kapnak. A további táblázatok az alapértelmezett törzseket mutatják; a fenti szabályok alkalmazásával megkapjuk minden sor másik lehetséges választörzsét.
Válaszjelölések
ValidationError = {
validationErrors: Record<string, string[]>,
code?: string
}
CodedError = {
error: string,
code: string,
// a route may add fields explicitly listed below
}
PlainError = { error: string }
A(z) error és az érvényesítési üzenet szövege leíró jellegű, nem stabil programozott megkülönböztető. Ha van code, az alapján ágaztasson el. A kérésérvényesítés 422 ValidationError választ ad; teljes objektum érvényesítése { "validationErrors": {} } értéket eredményezhet, ha nincs azonosított egyedi mező. Az érvénytelen JSON és váratlan hibák az alább látható globális 500 PlainError választ adják.
Minden JSON-példa pontos törzsszerkezetet mutat. A(z) <message> formában megadott szöveg a visszaadott érvényesítési vagy műveleti üzenet, és JSON-karakterlánc, nem szó szerinti, csúcsos zárójelbe tett érték.
Kérések feldolgozási sorrendje
A kérések feldolgozási sorrendje:
- munkaterület-tokenek beállítása és hitelesítése;
- gazdaházirend és token-/munkaterület-sebességkorlátok;
- aktuális csomagjogosultságok szűrése;
- minden módosításnál idempotencia-ellenőrzés/foglalás;
- végponthatókör-ellenőrzés, kérésérvényesítés és a kért művelet.
Ezért az érvényes, de elégtelen hatókörű tokennel küldött módosításhoz is kötelező a(z) Idempotency-Key. A befejezett 403, 404, 409 vagy 422 módosítás válasza ugyanahhoz a kulcshoz/kéréshez újrajátszható.
Hitelesítési, házirend- és sebességkorlátozási válaszok
Ezek a válaszok minden regisztrált /v2/admin végponton előfordulhatnak a végpontspecifikus feldolgozás előtt.
| Állapot | Mikor | Pontos törzs | Kapcsolódó fejlécek |
|---|---|---|---|
401 | Hiányzó, ismételt, vesszővel összekapcsolt, nem Bearer, hibás formátumú, ismeretlen, lejárt, visszavont vagy más okból érvénytelen munkaterület-token | { "error": "Unauthorized", "code": "INVALID_WORKSPACE_TOKEN" } | WWW-Authenticate: Bearer, Cache-Control: no-store |
404 | A token érvényes, de a munkaterület gazdáján nincs engedélyezve a(z) adminApiEnabled | { "error": "Not Found" } | Cache-Control: no-store |
429 | Kimerült a tokenenkénti vagy munkaterületenkénti kéréskeret | { "error": "Too many attempts. Please try again later." } | Retry-After: <seconds> |
503 | A munkaterület-token hitelesítése átmenetileg nem érhető el | { "error": "Admin API workspace-token configuration is unavailable", "code": "WORKSPACE_API_CONFIG_UNAVAILABLE" } | — |
503 | A gazdaházirend lekérése vagy az aktuális csomagjogosultság ellenőrzése sikertelen | { "error": "Workspace authorization is temporarily unavailable", "code": "WORKSPACE_AUTHORIZATION_UNAVAILABLE" } | — |
Az API-hozzáférés minden csomagban benne van. A munkaterület gazdájának adminApiEnabled beállítását kikapcsolva 404 a válasz; egy további funkciójogosultság elvesztése csak az érintett hatóköröket távolítja el. Az így keletkező hatókörmegtagadás az alábbi választ használja, nem tokenfrissítési folyamatot.
Hatókör-, idempotencia-, feldolgozási, tulajdonlási és váratlan hibák
| Erre vonatkozik | Állapot | Pontos törzs | Fejlécek/megjegyzések |
|---|---|---|---|
| Minden útvonal hitelesítés után | 403 | { "error": "Insufficient workspace-token scope", "code": "INSUFFICIENT_SCOPE" } | Akkor érkezik, ha bármely szükséges hatókör hiányzik. |
| Minden módosítás | 400 | { "error": "Idempotency-Key is required for this operation", "code": "IDEMPOTENCY_KEY_REQUIRED" } | Nincs megadva kulcs. |
| Minden módosítás | 400 | { "error": "Exactly one Idempotency-Key is required", "code": "INVALID_IDEMPOTENCY_KEY" } | Ismételt vagy vesszővel összekapcsolt fejléc. |
| Minden módosítás | 400 | { "error": "Idempotency-Key must contain 1 to 255 visible characters", "code": "INVALID_IDEMPOTENCY_KEY" } | Üres, túl hosszú vagy vezérlőkaraktert tartalmaz. |
| Minden módosítás | 409 | { "error": "Idempotency-Key was already used with a different request", "code": "IDEMPOTENCY_CONFLICT" } | Azonos token/metódus/útvonal/kulcs, eltérő URL vagy törzs. |
| Minden módosítás | 409 | { "error": "Request is already processing", "code": "IDEMPOTENT_REQUEST_PROCESSING" } | Retry-After: 5. |
| Minden módosítás | 409 | { "error": "Previous request outcome is unknown; verify its effects before attempting the operation again", "code": "IDEMPOTENCY_OUTCOME_UNKNOWN" } | Az előző feldolgozási foglalás lejárt, a kapcsolat megszakadt, vagy a kérés 5xx eredménnyel fejeződött be. |
| Minden módosítás | 503 | { "error": "Idempotency storage unavailable", "code": "IDEMPOTENCY_UNAVAILABLE" } | Az API nem tudja ellenőrizni vagy menteni az idempotenciarekordot. |
| Bármely végpont érvénytelen lekérdezés-/törzs-/útvonalsémával | 422 | { "validationErrors": { "<field>": ["<message>"] } } | Több mező/üzenet is szerepelhet. A hívók nem adhatnak meg cpoId értéket; a munkaterület mindig a tokenből származik. |
| Bármely hiányzó beágyazott munkaterület-erőforrás vagy más munkaterülethez tartozó azonosító | 404 | { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" } | Következetesen ezt használja a rendszer, hacsak az alábbi táblázat másként nem jelzi. |
| Bármely végpont váratlan hibával | 500 | { "error": "Something went wrong" } | Módosításoknál ugyanazon kulcs későbbi újrapróbálása 409 IDEMPOTENCY_OUTCOME_UNKNOWN választ ad. |
Az erőforrásútvonal-azonosítóknak pozitív számoknak kell lenniük. A nem pozitív vagy nem numerikus :siteId, :chargerId, :portId, :tariffId, :profileId, :assignmentId, :userId, :rfidId, :accessId, :limitId vagy :localUserId érték 422 ValidationError választ ad, nem 400 választ.
Helyszín- és teljesítménykezelési hibák
| Végpontok | Állapot | Pontos törzs |
|---|---|---|
| Helyszín létrehozása/frissítése; munkaterületmező-érvényesítés | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
DELETE /v2/admin/sites/:siteId, ha a helyszínnek függőségei vannak | 409 | { "error": "<message>", "code": "SITE_NOT_EMPTY" } |
GET /v2/admin/sites/geocode érvénytelen normalizált keresés | 400 | { "error": "<message>", "code": "INVALID_GEOCODE_QUERY" } |
| Ugyanez, a szolgáltató korlátozott várólistája megtelt | 429 | { "error": "<message>", "code": "GEOCODING_BUSY" }; tartalmazza a(z) Retry-After értéket, ha a geokódoló megadja |
| Ugyanez, szolgáltatói időtúllépés/hiba vagy váratlan geokódolóhiba | 502 | { "error": "<message>", "code": "GEOCODING_UNAVAILABLE" }; váratlan hiba esetén Address search is temporarily unavailable |
PUT /v2/admin/sites/:siteId/power-management érvénytelen topológiai/tartománykonfiguráció | 422 | { "error": "<message>", "code": "INVALID_POWER_MANAGEMENT_CONFIGURATION" } |
| Ugyanez, OCPP-elutasítás/időtúllépés, versenyhelyzet vagy egyeztetési ütközés | 409 | { "error": "<message>", "code": "POWER_MANAGEMENT_CONFLICT" } |
Töltőhibák
A(z) mapChargerErrors() a töltő létrehozásához/frissítéséhez, hitelesítő adataihoz, csatlakozóbeállításaihoz, nyilvános listázásához, QR-tartalom feloldásához, konfigurációmódosításhoz/újratöltéshez, firmware-indításhoz, mind a négy alapvető parancshoz és az összesített ütemezés kéréséhez használatos.
| Végpontok | Állapot | Pontos törzs |
|---|---|---|
| Bármely fenti művelet tartományérvényesítési hibával | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Bármely fenti művelet állapot-, egyediség-, offline/OCPP-, számlázási, Tagless-, csatlakozó- vagy készenléti ütközéssel | 409 | { "error": "<message>", "code": "CHARGER_CONFLICT" } |
GET /chargers/:chargerId/sessions, érvénytelen alapértelmezett/kifejezett időtartomány | 422 | { "validationErrors": { "from": ["from must be before or equal to to"] } } vagy { "validationErrors": { "from": ["Session range cannot exceed 90 days"] } } |
Az egyszerű olvasási műveletek csak a közös 401/403/404/429/500/503 válaszokat és a(z) 422 lekérdezés-/útvonalérvényesítést adják. A töltőtörlés a közös 500 PlainError választ adhatja, ha konkrétabb hibaválasz nélkül sikertelen.
Jelentéshibák
| Végpontok | Állapot | Pontos törzs |
|---|---|---|
Adat-/exporttartomány, ahol from >= to | 422 | { "validationErrors": { "range": ["from must be earlier than to"] } } |
| 90 napnál hosszabb adat-/exporttartomány | 422 | { "validationErrors": { "range": ["Report ranges cannot exceed 90 days"] } } |
| Érvénytelen átlátszatlan adat-/mérési kurzor | 422 | { "validationErrors": { "cursor": ["<message>"] } } |
GET /reports/export, az eredmény több mint 2 000 sor | 422 | { "error": "<message>", "code": "REPORT_EXPORT_ROW_LIMIT", "limit": 2000 } |
POST /reports/send, nincs mentett ütemezés | 409 | { "error": "A workspace report schedule must be saved before sending", "code": "REPORT_SCHEDULE_REQUIRED" } |
| Ugyanez, a levélküldő elutasít vagy hibázik | 502 | { "error": "Report delivery failed", "code": "REPORT_DELIVERY_FAILED" } |
| Hiányzó, tulajdonban lévő ütemezési/mérési erőforrás | 404 | közös RESOURCE_NOT_FOUND törzs |
A sikeres export bináris; minden exporthiba JSON marad.
Tarifahibák
| Végpontok | Állapot | Pontos törzs |
|---|---|---|
| Létrehozás/frissítés/összetevők/piaci ár/hozzárendelés tartományérvényesítése | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Tarifatörlési vagy hozzárendelési állapot-/függőségi/egyediségütközés | 409 | { "error": "<message>", "code": "TARIFF_CONFLICT" } |
| Tarifa, ajánlattételi zóna, töltő, csatlakozó, tarifahozzárendelés vagy más beágyazott erőforrás tulajdonlási hiánya | 404 | közös RESOURCE_NOT_FOUND törzs |
Töltésiprofil-hibák
| Végpontok | Állapot | Pontos törzs |
|---|---|---|
| Létrehozás/frissítés/ütemezés/hozzárendelés tartományérvényesítése | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| A profilra védett használat hivatkozik | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_IN_USE" } |
| OCPP-szinkronizálási, hozzárendelési, párhuzamossági vagy egyéb profilütközés | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_CONFLICT" } |
| Profil, töltő, csatlakozó, hozzárendelés vagy más beágyazott erőforrás tulajdonlási hiánya | 404 | közös RESOURCE_NOT_FOUND törzs |
Felhasználói tartományhibák
A mezőt azonosító felhasználóérvényesítési hibák ValidationError és code értéket használnak; más felhasználói hibák CodedError típust használnak. Minden hiányzóerőforrás-eset a közös, felderítést megakadályozó RESOURCE_NOT_FOUND választ használja.
| Állapot | Kód(ok) | Törzs |
|---|---|---|
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" }; tartalmazza: 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" } |
A(z) POST /users/invitations a törzs feldolgozása után a közös 403 INSUFFICIENT_SCOPE választ is adhatja, ha a(z) users:access hiányzik, vagy ha RFID-t adtak meg, és a(z) users:rfid hiányzik. A helyifelhasználó-végpontok minden szükséges hatókört felsorolnak a Végpontreferenciában.
A felhasználói hibakódok alkalmazása:
| Végpontcsalád | Nem 404-es felhasználói tartománykódok a közös válaszokon felül |
|---|---|
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) |
| Felhasználói részletek, járművek, RFID-/hozzáférés-/korlátolvasások | nincs nem 404-es tartománykód |
| RFID létrehozása | CUSTOMER_CONTRACT_MISSING, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_RFID (422) |
| RFID frissítése/törlése | TAGLESS_USER_PROTECTED (409) |
| Hozzáférés cseréje | TAGLESS_USER_PROTECTED (409); NO_CHARGERS_AVAILABLE (422) |
| Hozzáférés visszavonása | TAGLESS_USER_PROTECTED (409) |
| Korlát létrehozása/frissítése | TAGLESS_USER_PROTECTED, LIMIT_ALREADY_EXISTS (409); INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE (422) |
| Korlát törlése | TAGLESS_USER_PROTECTED (409) |
| Munkaterületi meghívás létrehozása | CUSTOMER_CONTRACT_MISSING, INVITATION_EMAIL_IN_USE, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL/INVALID_RFID (422); INVITATION_RESEND_THROTTLED (429), ha kézbesítési várakozási idő érvényes |
| Munkaterületi meghívás újraküldése | INVALID_EMAIL (422), INVITATION_RESEND_THROTTLED (429) |
| Munkaterületi meghívás visszavonása | INVALID_EMAIL (422) |
| Töltő helyi felhasználójának létrehozása meglévő ügyfélhez | LOCAL_USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409) |
| Töltő helyi felhasználójának meghívása | LOCAL_USER_ALREADY_EXISTS, INVITATION_EMAIL_IN_USE, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL (422); INVITATION_RESEND_THROTTLED (429), ha kézbesítési várakozási idő érvényes |
| Helyi felhasználó meghívásának visszavonása | INVALID_EMAIL (422) |
| Helyi felhasználó frissítése/törlése | TAGLESS_USER_PROTECTED (409) |
Az ezekben a csoportokban előforduló minden tulajdonlási és hiányzóerőforrás-eredmény, beleértve a(z) POST /users végponton a nem regisztrált e-mail-címet is, a közös 404 RESOURCE_NOT_FOUND törzset használja.
Törzs nélküli és újrajátszott válaszok
A sikeres 204 válasz nem tartalmaz törzset. Ez minden olyan dokumentált törlésre érvényes, amely 204 empty választ sorol fel. A befejezett idempotens újrajátszás beállítja a(z) Idempotency-Replayed: true értéket, és a tárolt állapotot/törzset használja; 204 esetén a HTTP-válasz törzs nélküli marad. Az API soha nem ad JSON-sikerobjektumot dokumentált 204 művelethez.