Vastaukset ja virheet

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:

  • validationErrors muuttuu arvoksi details.fields ja code arvoksi VALIDATION_FAILED, vaikka oletusrungolla olisi myös toimialuekoodi.
  • Oletusarvoinen ylimmän tason code säilytetään, kun validointikenttiä ei ole.
  • Muut ylimmän tason ominaisuudet paitsi error, message, validationErrors ja code siirtyvät kohtaan details; esimerkiksi raporttiviennin limit muuttuu arvoksi details.limit.
  • Ylimmän tason merkkijono error muuttuu arvoksi message. 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 (422 ja muut luokittelemattomat 4xx), RATE_LIMITED (429), EXTERNAL_PROVIDER_FAILED (502) sekä INTERNAL_ERROR (muut 5xx, myös 503).
  • requestId on täsmällinen X-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ä:

  1. työtilatunnuksen määritys ja todennus;
  2. isännän käytäntö ja tunnuksen/työtilan pyyntörajoitukset;
  3. nykyisten käyttöoikeuksien suodatus;
  4. jokaiselle muutokselle idempotenssin validointi/varaus;
  5. 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ä.

TilaMilloinTarkka runkoOlennaiset otsakkeet
401Puuttuva, 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
404Tunnus on kelvollinen mutta sen työtilan isännällä ei ole adminApiEnabled{ "error": "Not Found" }Cache-Control: no-store
429Tunnuksen tai työtilan pyyntökiintiö on käytetty loppuun{ "error": "Too many attempts. Please try again later." }Retry-After: <seconds>
503Työtilatunnuksen todennus ei ole tilapäisesti käytettävissä{ "error": "Admin API workspace-token configuration is unavailable", "code": "WORKSPACE_API_CONFIG_UNAVAILABLE" }—
503Isä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

KoskeeTilaTarkka runkoOtsakkeet/huomiot
Jokainen reitti todennuksen jälkeen403{ "error": "Insufficient workspace-token scope", "code": "INSUFFICIENT_SCOPE" }Palautetaan, kun jokin vaadittu käyttöalue puuttuu.
Jokainen muutos400{ "error": "Idempotency-Key is required for this operation", "code": "IDEMPOTENCY_KEY_REQUIRED" }Avainta ei annettu.
Jokainen muutos400{ "error": "Exactly one Idempotency-Key is required", "code": "INVALID_IDEMPOTENCY_KEY" }Toistuva tai pilkulla yhdistetty otsake.
Jokainen muutos400{ "error": "Idempotency-Key must contain 1 to 255 visible characters", "code": "INVALID_IDEMPOTENCY_KEY" }Tyhjä, liian pitkä tai sisältää ohjausmerkin.
Jokainen muutos409{ "error": "Idempotency-Key was already used with a different request", "code": "IDEMPOTENCY_CONFLICT" }Sama tunnus/metodi/polku/avain, eri URL tai runko.
Jokainen muutos409{ "error": "Request is already processing", "code": "IDEMPOTENT_REQUEST_PROCESSING" }Retry-After: 5.
Jokainen muutos409{ "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 muutos503{ "error": "Idempotency storage unavailable", "code": "IDEMPOTENCY_UNAVAILABLE" }API ei voi tarkistaa tai tallentaa idempotenssitietuetta.
Mikä tahansa endpoint, jonka kysely-/runko-/polkuskeema on virheellinen422{ "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 tunniste404{ "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 virhe500{ "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

EndpointitTilaTarkka runko
Kohteen luonti/päivitys; työtilan kenttävalidointi422{ "validationErrors": { "<field>": ["<message>"] } }
DELETE /v2/admin/sites/:siteId, kun kohteella on riippuvuuksia409{ "error": "<message>", "code": "SITE_NOT_EMPTY" }
GET /v2/admin/sites/geocode virheellinen normalisoitu haku400{ "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 virhe502{ "error": "<message>", "code": "GEOCODING_UNAVAILABLE" }; odottamaton virhe käyttää Address search is temporarily unavailable
PUT /v2/admin/sites/:siteId/power-management virheellinen topologia-/toimialuemääritys422{ "error": "<message>", "code": "INVALID_POWER_MANAGEMENT_CONFIGURATION" }
Sama, OCPP-hylkäys/aikakatkaisu, samanaikaisuuskilpailu tai täsmäytysristiriita409{ "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ä.

EndpointitTilaTarkka runko
Mikä tahansa yllä oleva toiminto, jossa toimialueen validointi epäonnistuu422{ "validationErrors": { "<field>": ["<message>"] } }
Mikä tahansa yllä oleva toiminto, jossa on tilaan, yksilöllisyyteen, offline/OCPP:hen, laskutukseen, Taglessiin, liittimeen tai valmiuteen liittyvä ristiriita409{ "error": "<message>", "code": "CHARGER_CONFLICT" }
GET /chargers/:chargerId/sessions, virheellinen oletus-/nimenomainen aikaväli422{ "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

EndpointitTilaTarkka runko
Tietojen/viennin ajanjakso, jossa from >= to422{ "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 kursori422{ "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 ajastusta409{ "error": "A workspace report schedule must be saved before sending", "code": "REPORT_SCHEDULE_REQUIRED" }
Sama, sähköpostipalvelu hylkää/epäonnistuu502{ "error": "Report delivery failed", "code": "REPORT_DELIVERY_FAILED" }
Omistettu ajastus-/mittausresurssi puuttuu404yhteinen RESOURCE_NOT_FOUND-runko

Onnistunut vienti on binäärinen; kaikki vientivirheet pysyvät JSONina.

Tariffivirheet

EndpointitTilaTarkka runko
Luonnin/päivityksen/komponenttien/markkinahintojen/määrityksen toimialuevalidointi422{ "validationErrors": { "<field>": ["<message>"] } }
Tariffin poiston tai määrityksen tila-/riippuvuus-/yksilöllisyysristiriita409{ "error": "<message>", "code": "TARIFF_CONFLICT" }
Tariffin, tarjousalueen, laturin, liittimen, tariffimäärityksen tai muun sisäkkäisen resurssin omistus ei täsmää404yhteinen RESOURCE_NOT_FOUND-runko

Latausprofiilien virheet

EndpointitTilaTarkka runko
Luonnin/päivityksen/ajastuksen/määrityksen toimialuevalidointi422{ "validationErrors": { "<field>": ["<message>"] } }
Suojattu käyttö viittaa profiiliin409{ "error": "<message>", "code": "CHARGING_PROFILE_IN_USE" }
OCPP-synkronoinnin, määrityksen, samanaikaisuuden tai muun profiilin ristiriita409{ "error": "<message>", "code": "CHARGING_PROFILE_CONFLICT" }
Profiilin, laturin, liittimen, määrityksen tai muun sisäkkäisen resurssin omistus ei täsmää404yhteinen 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.

TilaKoodi(t)Runko
400INVALID_USER_CURSOR{ "validationErrors": { "cursor": ["The user-list cursor is invalid for the selected status"] }, "code": "INVALID_USER_CURSOR" }
409USER_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>" }
422INVALID_EMAIL, INVALID_RFID, INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE{ "validationErrors": { "<field>": ["<message>"] }, "code": "<listed code>" }
422NO_CHARGERS_AVAILABLE{ "error": "No chargers are available", "code": "NO_CHARGERS_AVAILABLE" }
429INVITATION_RESEND_THROTTLED{ "error": "Invitation resend is temporarily unavailable", "code": "INVITATION_RESEND_THROTTLED" }; sisältää Retry-After
503USER_CURSOR_UNAVAILABLE{ "error": "User pagination is temporarily unavailable", "code": "USER_CURSOR_UNAVAILABLE" }
404RESOURCE_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 /usersINVALID_USER_CURSOR (400), USER_CURSOR_UNAVAILABLE (503)
POST /usersUSER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409)
PATCH /users/:userIdTAGLESS_USER_PROTECTED (409)
DELETE /users/:userIdTAGLESS_USER_PROTECTED, PROTECTED_WORKSPACE_USER, USER_RELATED_DATA (409)
Käyttäjän tietojen, ajoneuvojen, RFID:n/käyttöoikeuksien/rajojen lukuei muuta toimialuekoodia kuin 404
RFID:n luontiCUSTOMER_CONTRACT_MISSING, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_RFID (422)
RFID:n päivitys/poistoTAGLESS_USER_PROTECTED (409)
Käyttöoikeuksien korvaaminenTAGLESS_USER_PROTECTED (409); NO_CHARGERS_AVAILABLE (422)
Käyttöoikeuden peruminenTAGLESS_USER_PROTECTED (409)
Rajan luonti/päivitysTAGLESS_USER_PROTECTED, LIMIT_ALREADY_EXISTS (409); INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE (422)
Rajan poistoTAGLESS_USER_PROTECTED (409)
Työtilakutsun luontiCUSTOMER_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ähetysINVALID_EMAIL (422), INVITATION_RESEND_THROTTLED (429)
Työtilakutsun peruminenINVALID_EMAIL (422)
Laturin paikallisen käyttäjän luonti olemassa olevalle asiakkaalleLOCAL_USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409)
Laturin paikallisen käyttäjän kutsuLOCAL_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 peruminenINVALID_EMAIL (422)
Paikallisen käyttäjän päivitys/poistoTAGLESS_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.