Admin API:n vastaus- ja virhesopimus
Tämä tiedosto täydentää jokaisen Endpoint-viitteen endpointin vastaussopimuksen. Lue onnistumisrunko endpointin riviltä ja kaikki yhteiset tai endpoint-kohtaiset epäonnistumisrungot alla olevista taulukoista. Oletusarvoisesti virheillä on useita yhteensopivuusrakenteita; kutsuja voi valita yhden yleiskääreen.
Valinnainen rakenteinen virhekääre
Lähetä tämä pyyntöotsake mille tahansa endpointille:
X-Error-Format: envelope
Arvovertailussa poistetaan reunavälit eikä kirjainkoolla ole merkitystä. Tällä täsmällisellä arvolla jokainen JSON-vastaus, jonka tila on 400 tai suurempi, muunnetaan muotoon:
ErrorEnvelope = {
error: {
code: string,
message: string,
details: Record<string, unknown>,
requestId: string
}
}
Oletusvalidointirungon muunnosesimerkki:
{
"error": {
"code": "VALIDATION_FAILED",
"message": "Invalid request",
"details": {
"fields": {
"name": ["String must contain at least 1 character(s)"]
}
},
"requestId": "integration-42"
}
}
Muunnossäännöt ovat täsmälliset:
validationErrorsmuuttuu arvoksidetails.fieldsjacodearvoksiVALIDATION_FAILED, vaikka oletusrungolla olisi myös toimialuekoodi.- Oletusarvoinen ylimmän tason
codesäilytetään, kun validointikenttiä ei ole. - Muut ylimmän tason ominaisuudet paitsi
error,message,validationErrorsjacodesiirtyvät kohtaandetails; esimerkiksi raporttivienninlimitmuuttuu arvoksidetails.limit. - Ylimmän tason merkkijono
errormuuttuu arvoksimessage. Jos sitä ei ole, käytetään tilan vara-arvoa. - Varakoodit ovat
AUTH_REQUIRED(401),PERMISSION_DENIED(403),RESOURCE_NOT_FOUND(404),CONFLICT(409),VALIDATION_FAILED(422ja muut luokittelemattomat4xx),RATE_LIMITED(429),EXTERNAL_PROVIDER_FAILED(502) sekäINTERNAL_ERROR(muut5xx, myös503). requestIdon täsmällinenX-Request-Id-vastausotsake. Kutsujan antamaa pyyntötunnistetta käytetään vain, jos se vastaa[A-Za-z0-9._:-]{1,128}reunavälien poiston jälkeen; muutoin palvelin luo UUID:n.
Muunnos ei muuta tilaa eikä runkoon liittymättömiä otsakkeita. Se koskee myös idempotentteja toistoja toistopyynnön X-Error-Format-otsakkeen mukaan. Binääriset onnistumisvastaukset pysyvät binäärisinä; niiden JSON-virheet kääritään. Muut taulukot näyttävät oletusrungot; yllä olevilla säännöillä saadaan jokaisen rivin toinen mahdollinen vastausrunko.
Vastausmerkinnät
ValidationError = {
validationErrors: Record<string, string[]>,
code?: string
}
CodedError = {
error: string,
code: string,
// a route may add fields explicitly listed below
}
PlainError = { error: string }
error ja validointiviestin teksti ovat kuvailevia, eivät vakaita ohjelmallisia erottimia. Haarauta arvon code mukaan, kun se on mukana. Pyyntövalidointi palauttaa 422 ValidationError; koko objektin validointi voi tuottaa { "validationErrors": {} }, kun yksittäistä kenttää ei tunnisteta. Virheellinen JSON ja odottamattomat virheet palauttavat alla esitetyn globaalin 500 PlainError-vastauksen.
Kaikki JSON-esimerkit esittävät rungon tarkan rakenteen. <message>-tekstinä esitetty arvo on palautettu validointi- tai toimintoviesti ja JSON-merkkijono, ei kirjaimellinen kulmasulkeissa oleva arvo.
Pyyntöjen käsittelyjärjestys
Pyynnöt käsitellään tässä järjestyksessä:
- työtilatunnuksen määritys ja todennus;
- isännän käytäntö ja tunnuksen/työtilan pyyntörajoitukset;
- nykyisten käyttöoikeuksien suodatus;
- jokaiselle muutokselle idempotenssin validointi/varaus;
- endpointin käyttöaluetarkistukset, pyynnön validointi ja pyydetty toiminto.
Siksi myös muutos, jonka tunnus on kelvollinen mutta käyttöalueiltaan riittämätön, edellyttää Idempotency-Key. Valmis 403-, 404-, 409- tai 422-muutosvastaus voidaan toistaa samalla avaimella ja pyynnöllä.
Todennus-, käytäntö- ja pyyntörajoitusvastaukset
Nämä vastaukset voivat esiintyä jokaisessa rekisteröidyssä /v2/admin-endpointissa ennen endpoint-kohtaista käsittelyä.
| Tila | Milloin | Tarkka runko | Olennaiset otsakkeet |
|---|---|---|---|
401 | Puuttuva, toistuva, pilkulla yhdistetty, muu kuin Bearer, väärin muodostettu, tuntematon, vanhentunut, peruttu tai muuten virheellinen työtilatunnus | { "error": "Unauthorized", "code": "INVALID_WORKSPACE_TOKEN" } | WWW-Authenticate: Bearer, Cache-Control: no-store |
404 | Tunnus on kelvollinen mutta sen työtilan isännällä ei ole adminApiEnabled | { "error": "Not Found" } | Cache-Control: no-store |
429 | Tunnuksen tai työtilan pyyntökiintiö on käytetty loppuun | { "error": "Too many attempts. Please try again later." } | Retry-After: <seconds> |
503 | Työtilatunnuksen todennus ei ole tilapäisesti käytettävissä | { "error": "Admin API workspace-token configuration is unavailable", "code": "WORKSPACE_API_CONFIG_UNAVAILABLE" } | — |
503 | Isännän käytäntöjen haku tai nykyisten käyttöoikeuksien valtuutus epäonnistuu | { "error": "Workspace authorization is temporarily unavailable", "code": "WORKSPACE_AUTHORIZATION_UNAVAILABLE" } | — |
API-käyttö sisältyy jokaiseen tilaukseen. Työtilan isännän adminApiEnabled-asetuksen poistaminen käytöstä palauttaa 404; lisätoiminnon käyttöoikeuden menettäminen poistaa vain kyseiset käyttöalueet. Seurauksena oleva käyttöalueen esto käyttää alla olevaa vastausta, ei tunnuksen uusimismenettelyä.
Käyttöalue, idempotenssi, jäsentäminen, omistus ja odottamattomat virheet
| Koskee | Tila | Tarkka runko | Otsakkeet/huomiot |
|---|---|---|---|
| Jokainen reitti todennuksen jälkeen | 403 | { "error": "Insufficient workspace-token scope", "code": "INSUFFICIENT_SCOPE" } | Palautetaan, kun jokin vaadittu käyttöalue puuttuu. |
| Jokainen muutos | 400 | { "error": "Idempotency-Key is required for this operation", "code": "IDEMPOTENCY_KEY_REQUIRED" } | Avainta ei annettu. |
| Jokainen muutos | 400 | { "error": "Exactly one Idempotency-Key is required", "code": "INVALID_IDEMPOTENCY_KEY" } | Toistuva tai pilkulla yhdistetty otsake. |
| Jokainen muutos | 400 | { "error": "Idempotency-Key must contain 1 to 255 visible characters", "code": "INVALID_IDEMPOTENCY_KEY" } | Tyhjä, liian pitkä tai sisältää ohjausmerkin. |
| Jokainen muutos | 409 | { "error": "Idempotency-Key was already used with a different request", "code": "IDEMPOTENCY_CONFLICT" } | Sama tunnus/metodi/polku/avain, eri URL tai runko. |
| Jokainen muutos | 409 | { "error": "Request is already processing", "code": "IDEMPOTENT_REQUEST_PROCESSING" } | Retry-After: 5. |
| Jokainen muutos | 409 | { "error": "Previous request outcome is unknown; verify its effects before attempting the operation again", "code": "IDEMPOTENCY_OUTCOME_UNKNOWN" } | Aiempi käsittelyvaraus vanheni, yhteys suljettiin tai pyyntö päättyi virheeseen 5xx. |
| Jokainen muutos | 503 | { "error": "Idempotency storage unavailable", "code": "IDEMPOTENCY_UNAVAILABLE" } | API ei voi tarkistaa tai tallentaa idempotenssitietuetta. |
| Mikä tahansa endpoint, jonka kysely-/runko-/polkuskeema on virheellinen | 422 | { "validationErrors": { "<field>": ["<message>"] } } | Kenttiä/viestejä voi olla useita. Kutsujat eivät voi antaa cpoId; työtila tulee aina tunnuksesta. |
| Mikä tahansa puuttuva sisäkkäinen työtilaresurssi tai toisen työtilan tunniste | 404 | { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" } | Käytetään johdonmukaisesti, ellei alla oleva taulukko toisin mainitse. |
| Mikä tahansa endpoint, jossa tapahtuu odottamaton virhe | 500 | { "error": "Something went wrong" } | Muutoksissa saman avaimen uudelleenyritys myöhemmin palauttaa 409 IDEMPOTENCY_OUTCOME_UNKNOWN. |
Resurssipolkujen tunnisteiden on oltava positiivisia lukuja. Ei-positiivinen tai ei-numeerinen :siteId, :chargerId, :portId, :tariffId, :profileId, :assignmentId, :userId, :rfidId, :accessId, :limitId tai :localUserId palauttaa 422 ValidationError, ei 400.
Kohteiden ja tehonhallinnan virheet
| Endpointit | Tila | Tarkka runko |
|---|---|---|
| Kohteen luonti/päivitys; työtilan kenttävalidointi | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
DELETE /v2/admin/sites/:siteId, kun kohteella on riippuvuuksia | 409 | { "error": "<message>", "code": "SITE_NOT_EMPTY" } |
GET /v2/admin/sites/geocode virheellinen normalisoitu haku | 400 | { "error": "<message>", "code": "INVALID_GEOCODE_QUERY" } |
| Sama, palveluntarjoajan rajattu jono on täynnä | 429 | { "error": "<message>", "code": "GEOCODING_BUSY" }; sisältää Retry-After, kun geokooderi toimittaa sen |
| Sama, palveluntarjoajan aikakatkaisu/virhe tai odottamaton geokooderin virhe | 502 | { "error": "<message>", "code": "GEOCODING_UNAVAILABLE" }; odottamaton virhe käyttää Address search is temporarily unavailable |
PUT /v2/admin/sites/:siteId/power-management virheellinen topologia-/toimialuemääritys | 422 | { "error": "<message>", "code": "INVALID_POWER_MANAGEMENT_CONFIGURATION" } |
| Sama, OCPP-hylkäys/aikakatkaisu, samanaikaisuuskilpailu tai täsmäytysristiriita | 409 | { "error": "<message>", "code": "POWER_MANAGEMENT_CONFLICT" } |
Laturien virheet
mapChargerErrors() käytetään laturin luonnissa/päivityksessä, tunnistetiedoissa, liitinasetuksissa, julkisessa listauksessa, QR-sisällön ratkaisussa, määrityksen muutoksessa/uudelleenlatauksessa, laiteohjelmiston käynnistyksessä, kaikissa neljässä peruskomennossa ja yhdistelmäaikataulupyynnössä.
| Endpointit | Tila | Tarkka runko |
|---|---|---|
| Mikä tahansa yllä oleva toiminto, jossa toimialueen validointi epäonnistuu | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Mikä tahansa yllä oleva toiminto, jossa on tilaan, yksilöllisyyteen, offline/OCPP:hen, laskutukseen, Taglessiin, liittimeen tai valmiuteen liittyvä ristiriita | 409 | { "error": "<message>", "code": "CHARGER_CONFLICT" } |
GET /chargers/:chargerId/sessions, virheellinen oletus-/nimenomainen aikaväli | 422 | { "validationErrors": { "from": ["from must be before or equal to to"] } } tai { "validationErrors": { "from": ["Session range cannot exceed 90 days"] } } |
Tavalliset lukutoiminnot palauttavat vain yhteiset 401/403/404/429/500/503-vastaukset ja 422-kysely-/polkuvalidoinnin. Laturin poisto voi palauttaa yhteisen 500 PlainError-vastauksen, jos poisto epäonnistuu ilman tarkempaa virhevastausta.
Raporttivirheet
| Endpointit | Tila | Tarkka runko |
|---|---|---|
Tietojen/viennin ajanjakso, jossa from >= to | 422 | { "validationErrors": { "range": ["from must be earlier than to"] } } |
| Tietojen/viennin ajanjakso yli 90 päivää | 422 | { "validationErrors": { "range": ["Report ranges cannot exceed 90 days"] } } |
| Tietojen/mittausten virheellinen läpinäkymätön kursori | 422 | { "validationErrors": { "cursor": ["<message>"] } } |
GET /reports/export, tulos ylittää 2 000 riviä | 422 | { "error": "<message>", "code": "REPORT_EXPORT_ROW_LIMIT", "limit": 2000 } |
POST /reports/send, ei tallennettua ajastusta | 409 | { "error": "A workspace report schedule must be saved before sending", "code": "REPORT_SCHEDULE_REQUIRED" } |
| Sama, sähköpostipalvelu hylkää/epäonnistuu | 502 | { "error": "Report delivery failed", "code": "REPORT_DELIVERY_FAILED" } |
| Omistettu ajastus-/mittausresurssi puuttuu | 404 | yhteinen RESOURCE_NOT_FOUND-runko |
Onnistunut vienti on binäärinen; kaikki vientivirheet pysyvät JSONina.
Tariffivirheet
| Endpointit | Tila | Tarkka runko |
|---|---|---|
| Luonnin/päivityksen/komponenttien/markkinahintojen/määrityksen toimialuevalidointi | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Tariffin poiston tai määrityksen tila-/riippuvuus-/yksilöllisyysristiriita | 409 | { "error": "<message>", "code": "TARIFF_CONFLICT" } |
| Tariffin, tarjousalueen, laturin, liittimen, tariffimäärityksen tai muun sisäkkäisen resurssin omistus ei täsmää | 404 | yhteinen RESOURCE_NOT_FOUND-runko |
Latausprofiilien virheet
| Endpointit | Tila | Tarkka runko |
|---|---|---|
| Luonnin/päivityksen/ajastuksen/määrityksen toimialuevalidointi | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Suojattu käyttö viittaa profiiliin | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_IN_USE" } |
| OCPP-synkronoinnin, määrityksen, samanaikaisuuden tai muun profiilin ristiriita | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_CONFLICT" } |
| Profiilin, laturin, liittimen, määrityksen tai muun sisäkkäisen resurssin omistus ei täsmää | 404 | yhteinen RESOURCE_NOT_FOUND-runko |
Käyttäjätoimialueen virheet
Kentän yksilöivät käyttäjävalidointivirheet käyttävät ValidationError ja code; muut käyttäjävirheet käyttävät CodedError. Kaikki puuttuvan resurssin tapaukset käyttävät yhteistä RESOURCE_NOT_FOUND-vastausta, joka ei paljasta resurssin olemassaoloa.
| Tila | Koodi(t) | Runko |
|---|---|---|
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" }; sisältää 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 voi myös palauttaa yhteisen 403 INSUFFICIENT_SCOPE-vastauksen rungon jäsentämisen jälkeen, jos users:access puuttuu tai jos RFID annettiin ja users:rfid puuttuu. Paikalliskäyttäjäendpointit luettelevat kaikki vaaditut käyttöalueet Endpoint-viitteessä.
Käyttäjävirhekoodit ovat käytössä seuraavasti:
| Endpoint-ryhmä | Yhteisten vastausten lisäksi muut kuin 404-koodit käyttäjätoimialueella |
|---|---|
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) |
| Käyttäjän tietojen, ajoneuvojen, RFID:n/käyttöoikeuksien/rajojen luku | ei muuta toimialuekoodia kuin 404 |
| RFID:n luonti | CUSTOMER_CONTRACT_MISSING, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_RFID (422) |
| RFID:n päivitys/poisto | TAGLESS_USER_PROTECTED (409) |
| Käyttöoikeuksien korvaaminen | TAGLESS_USER_PROTECTED (409); NO_CHARGERS_AVAILABLE (422) |
| Käyttöoikeuden peruminen | TAGLESS_USER_PROTECTED (409) |
| Rajan luonti/päivitys | TAGLESS_USER_PROTECTED, LIMIT_ALREADY_EXISTS (409); INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE (422) |
| Rajan poisto | TAGLESS_USER_PROTECTED (409) |
| Työtilakutsun luonti | CUSTOMER_CONTRACT_MISSING, INVITATION_EMAIL_IN_USE, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL/INVALID_RFID (422); INVITATION_RESEND_THROTTLED (429), kun toimituksen odotusaika on voimassa |
| Työtilakutsun uudelleenlähetys | INVALID_EMAIL (422), INVITATION_RESEND_THROTTLED (429) |
| Työtilakutsun peruminen | INVALID_EMAIL (422) |
| Laturin paikallisen käyttäjän luonti olemassa olevalle asiakkaalle | LOCAL_USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409) |
| Laturin paikallisen käyttäjän kutsu | LOCAL_USER_ALREADY_EXISTS, INVITATION_EMAIL_IN_USE, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL (422); INVITATION_RESEND_THROTTLED (429), kun toimituksen odotusaika on voimassa |
| Paikallisen käyttäjän kutsun peruminen | INVALID_EMAIL (422) |
| Paikallisen käyttäjän päivitys/poisto | TAGLESS_USER_PROTECTED (409) |
Kaikki omistus- ja puuttuvan resurssin tulokset näissä ryhmissä, mukaan lukien rekisteröimätön sähköposti toiminnossa POST /users, käyttävät yhteistä 404 RESOURCE_NOT_FOUND-runkoa.
Rungottomat ja toistetut vastaukset
Onnistuneessa 204-vastauksessa ei ole runkoa. Tämä koskee jokaista dokumentoitua poistoa, jossa mainitaan 204 empty. Valmis idempotentti toisto asettaa Idempotency-Replayed: true ja käyttää tallennettua tilaa/runkoa; tapauksessa 204 HTTP-vastaus pysyy rungottomana. API ei koskaan palauta JSON-onnistumisobjektia dokumentoidulle 204-toiminnolle.