Atsakymai ir klaidos

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:

  • validationErrors tampa details.fields, o code tampa VALIDATION_FAILED, net jei numatytajame turinyje buvo ir srities kodas.
  • Kai nėra tikrinamų laukų, išlaikoma numatytoji aukščiausio lygio code reikšmė.
  • Kitos aukščiausio lygio savybės, išskyrus error, message, validationErrors ir code, perkeliamos į details; pavyzdžiui, ataskaitos eksporto limit tampa details.limit.
  • Aukščiausio lygio eilutės tipo error tampa message. 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 (422 ir kiti neklasifikuoti 4xx), RATE_LIMITED (429), EXTERNAL_PROVIDER_FAILED (502) ir INTERNAL_ERROR (kiti 5xx, įskaitant 503).
  • requestId yra tiksli X-Request-Id atsakymo 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:

  1. darbo srities prieigos raktų konfigūracija ir autentifikavimas;
  2. paslaugos teikėjo taisyklės ir prieigos rakto / darbo srities užklausų dažnio ribos;
  3. filtravimas pagal esamas teises;
  4. kiekvienai duomenų keitimo operacijai — idempotentiškumo tikrinimas / rakto rezervavimas;
  5. 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ūsenaKadaTikslus turinysSusijusios antraštės
401Trū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
404Prieigos raktas galioja, bet jo darbo srities paslaugos teikėjas neturi adminApiEnabled{ "error": "Not Found" }Cache-Control: no-store
429Išnaudota prieigos rakto arba darbo srities užklausų kvota{ "error": "Too many attempts. Please try again later." }Retry-After: <seconds>
503Darbo srities prieigos rakto autentifikavimas laikinai nepasiekiamas{ "error": "Admin API workspace-token configuration is unavailable", "code": "WORKSPACE_API_CONFIG_UNAVAILABLE" }—
503Nepavyksta 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

TaikomaBūsenaTikslus turinysAntraštės / pastabos
Kiekvienas maršrutas po autentifikavimo403{ "error": "Insufficient workspace-token scope", "code": "INSUFFICIENT_SCOPE" }Grąžinama, kai trūksta bet kurios būtinos prieigos srities.
Kiekviena duomenų keitimo operacija400{ "error": "Idempotency-Key is required for this operation", "code": "IDEMPOTENCY_KEY_REQUIRED" }Raktas nepateiktas.
Kiekviena duomenų keitimo operacija400{ "error": "Exactly one Idempotency-Key is required", "code": "INVALID_IDEMPOTENCY_KEY" }Pasikartojanti arba kableliais sujungta antraštė.
Kiekviena duomenų keitimo operacija400{ "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 operacija409{ "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 operacija409{ "error": "Request is already processing", "code": "IDEMPOTENT_REQUEST_PROCESSING" }Retry-After: 5.
Kiekviena duomenų keitimo operacija409{ "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 operacija503{ "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 schema422{ "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 ID404{ "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 sutrikimas500{ "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škaiBūsenaTikslus turinys
Vietos kūrimas / atnaujinimas; darbo srities laukų tikrinimas422{ "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ška400{ "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 klaida502{ "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ūracija422{ "error": "<message>", "code": "INVALID_POWER_MANAGEMENT_CONFIGURATION" }
Tas pats, OCPP atmetimas / laukimo laiko pabaiga, lygiagrečių operacijų lenktynės arba suderinimo konfliktas409{ "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škaiBūsenaTikslus turinys
Bet kuri pirmiau nurodyta operacija su srities taisyklių tikrinimo klaida422{ "validationErrors": { "<field>": ["<message>"] } }
Bet kuri pirmiau nurodyta operacija su būsenos, unikalumo, darbo be ryšio/OCPP, atsiskaitymo, veikimo be žymos, jungties arba pasirengimo konfliktu409{ "error": "<message>", "code": "CHARGER_CONFLICT" }
GET /chargers/:chargerId/sessions, netinkamas numatytasis arba aiškiai nurodytas laiko intervalas422{ "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škaiBūsenaTikslus turinys
Duomenų / eksporto intervalas, kuriame from >= to422{ "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ų žymeklis422{ "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ščio409{ "error": "A workspace report schedule must be saved before sending", "code": "REPORT_SCHEDULE_REQUIRED" }
Tas pats, laiškų siuntimo sistema atmeta arba neveikia502{ "error": "Report delivery failed", "code": "REPORT_DELIVERY_FAILED" }
Nėra priklausančio tvarkaraščio / matavimų ištekliaus404bendras RESOURCE_NOT_FOUND turinys

Sėkmingas eksportas yra dvejetainis; visos eksporto klaidos lieka JSON formato.

Tarifų klaidos

Galiniai taškaiBūsenaTikslus turinys
Kūrimo / atnaujinimo / komponentų / rinkos kainos / priskyrimo srities taisyklių tikrinimas422{ "validationErrors": { "<field>": ["<message>"] } }
Tarifo trynimo arba priskyrimo būsenos / priklausomybių / unikalumo konfliktas409{ "error": "<message>", "code": "TARIFF_CONFLICT" }
Nerastas priklausantis tarifas, prekybos zona, įkroviklis, jungtis, tarifo priskyrimas arba kitas įdėtasis išteklius404bendras RESOURCE_NOT_FOUND turinys

Įkrovimo profilių klaidos

Galiniai taškaiBūsenaTikslus turinys
Kūrimo / atnaujinimo / tvarkaraščio / priskyrimo srities taisyklių tikrinimas422{ "validationErrors": { "<field>": ["<message>"] } }
Profilis naudojamas apsaugotoje vietoje409{ "error": "<message>", "code": "CHARGING_PROFILE_IN_USE" }
OCPP sinchronizavimo, priskyrimo, lygiagretumo arba kitas profilio konfliktas409{ "error": "<message>", "code": "CHARGING_PROFILE_CONFLICT" }
Nerastas priklausantis profilis, įkroviklis, jungtis, priskyrimas arba kitas įdėtasis išteklius404bendras 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ūsenaKodas (-ai)Turinys
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" }; apima 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 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 /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)
Naudotojo informacija, automobiliai, RFID / prieigos / ribų skaitymasnėra srities kodo, išskyrus 404
RFID kūrimasCUSTOMER_CONTRACT_MISSING, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_RFID (422)
RFID atnaujinimas / trynimasTAGLESS_USER_PROTECTED (409)
Prieigos pakeitimasTAGLESS_USER_PROTECTED (409); NO_CHARGERS_AVAILABLE (422)
Prieigos panaikinimasTAGLESS_USER_PROTECTED (409)
Ribos kūrimas / atnaujinimasTAGLESS_USER_PROTECTED, LIMIT_ALREADY_EXISTS (409); INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE (422)
Ribos trynimasTAGLESS_USER_PROTECTED (409)
Darbo srities kvietimo kūrimasCUSTOMER_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 persiuntimasINVALID_EMAIL (422), INVITATION_RESEND_THROTTLED (429)
Darbo srities kvietimo atšaukimasINVALID_EMAIL (422)
Įkroviklio vietinio naudotojo kūrimas esamam klientuiLOCAL_USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409)
Įkroviklio vietinio naudotojo kvietimasLOCAL_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šaukimasINVALID_EMAIL (422)
Vietinio naudotojo atnaujinimas / trynimasTAGLESS_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.