Risponsi u żbalji

Kuntratt tar-risponsi u l-iżbalji tal-API tal-amministrazzjoni

Dan il-fajl jikkompleta l-kuntratt tar-risponsi għal kull endpoint f'Referenza tal-endpoints. Aqra r-ringiela tal-endpoint għall-body tas-suċċess tiegħu u t-tabelli hawn taħt għal kull body mhux ta' suċċess kondiviża jew speċifika għall-endpoint. B'mod predefinit, l-iżbalji jużaw diversi strutturi ta' kompatibbiltà; min jagħmel is-sejħa jista' jagħżel envelope universali wieħed.

Envelope strutturat fakultattiv tal-iżbalji

Ibgħat dan il-header tat-talba lil kwalunkwe endpoint:

X-Error-Format: envelope

Il-paragun tal-valur ineħħi l-ispazji mit-truf u ma jagħmilx distinzjoni bejn ittri kbar u żgħar. B'dak il-valur eżatt, kull rispons JSON bi status ta' 400 jew aktar jiġi kkonvertit għal:

ErrorEnvelope = {
  error: {
    code: string,
    message: string,
    details: Record<string, unknown>,
    requestId: string
  }
}

Eżempju ta' konverżjoni ta' body ta' validazzjoni predefinita:

{
  "error": {
    "code": "VALIDATION_FAILED",
    "message": "Invalid request",
    "details": {
      "fields": {
        "name": ["String must contain at least 1 character(s)"]
      }
    },
    "requestId": "integration-42"
  }
}

Ir-regoli tal-konverżjoni huma eżatti:

  • validationErrors isir details.fields, u code isir VALIDATION_FAILED anke meta l-body predefinita kellha wkoll kodiċi tad-dominju.
  • Jinżamm code predefinit fl-ogħla livell meta ma jkunx hemm oqsma ta' validazzjoni.
  • Proprjetajiet oħra fl-ogħla livell ħlief error, message, validationErrors u code jitmexxew f'details; pereżempju, limit tal-esportazzjoni tar-rapport isir details.limit.
  • error tat-tip string fl-ogħla livell isir message. Jekk ma jeżistix, jintuża l-istatus ta' riżerva.
  • Il-kodiċijiet ta' riżerva huma AUTH_REQUIRED (401), PERMISSION_DENIED (403), RESOURCE_NOT_FOUND (404), CONFLICT (409), VALIDATION_FAILED (422 u 4xx oħra mhux klassifikati), RATE_LIMITED (429), EXTERNAL_PROVIDER_FAILED (502) u INTERNAL_ERROR (5xx oħra, inkluż 503).
  • requestId huwa l-header eżatt tar-rispons X-Request-Id. ID tat-talba pprovdut minn min jagħmel is-sejħa jintuża biss meta jaqbel ma' [A-Za-z0-9._:-]{1,128} wara li jitneħħew l-ispazji mit-truf; inkella s-server jiġġenera UUID.

Din it-trasformazzjoni ma tbiddilx l-istatus jew il-headers mhux tal-body. Tapplika wkoll għal ripetizzjonijiet idempotenti skont il-header X-Error-Format tat-talba ripetuta. Risponsi ta' suċċess binarji jibqgħu binarji; l-iżbalji JSON tagħhom jitqiegħdu f'envelope. It-tabelli li jifdal juru l-bodies predefiniti; l-applikazzjoni tar-regoli ta' hawn fuq tagħti l-body l-oħra possibbli tar-rispons għal kull ringiela.

Notazzjoni tar-risponsi

ValidationError = {
  validationErrors: Record<string, string[]>,
  code?: string
}

CodedError = {
  error: string,
  code: string,
  // a route may add fields explicitly listed below
}

PlainError = { error: string }

error u t-test tal-messaġġi tal-validazzjoni huma deskrittivi, mhux identifikatur stabbli għall-programmi. Iddistingwi l-każijiet skont code meta preżenti. Il-validazzjoni tat-talba tirritorna 422 ValidationError; il-validazzjoni ta' oġġett sħiħ tista' tipproduċi { "validationErrors": {} } meta ma jiġi identifikat ebda qasam individwali. JSON invalidu u żbalji mhux mistennija jirritornaw il-500 PlainError globali muri hawn taħt.

L-eżempji JSON kollha juru l-istruttura eżatta tal-body. It-test muri bħala <message> huwa l-messaġġ ta' validazzjoni jew operazzjoni rritornat u huwa string JSON, mhux valur litterali bejn parentesi angolari.

Ordni tal-ipproċessar tat-talbiet

It-talbiet jiġu pproċessati f'din l-ordni:

  1. konfigurazzjoni u awtentikazzjoni tat-tokens tal-ispazju tax-xogħol;
  2. politika tal-host u limiti tar-rata tat-token/ispazju tax-xogħol;
  3. filtrazzjoni tad-drittijiet attwali;
  4. għal kull mutazzjoni, validazzjoni/claim tal-idempotenza;
  5. kontrolli tal-ambiti tal-endpoint, validazzjoni tat-talba u l-operazzjoni mitluba.

Għaldaqstant, mutazzjoni b'token validu iżda b'ambiti insuffiċjenti xorta trid tibgħat Idempotency-Key. Rispons komplut ta' mutazzjoni 403, 404, 409 jew 422 jista' jiġi ripetut għall-istess ċavetta/talba.

Risponsi tal-awtentikazzjoni, il-politika u l-limitu tar-rata

Dawn ir-risponsi jistgħu jseħħu fuq kull endpoint reġistrat /v2/admin qabel l-ipproċessar speċifiku għall-endpoint.

StatusMetaBody eżattaHeaders rilevanti
401Token tal-ispazju tax-xogħol nieqes, duplikat, magħqud b'virgoli, mhux Bearer, malformat, mhux magħruf, skadut, revokat jew invalidu b'xi mod ieħor{ "error": "Unauthorized", "code": "INVALID_WORKSPACE_TOKEN" }WWW-Authenticate: Bearer, Cache-Control: no-store
404It-token huwa validu iżda l-host tal-ispazju tax-xogħol tiegħu m'għandux adminApiEnabled{ "error": "Not Found" }Cache-Control: no-store
429Il-kwota tat-talbiet għal kull token jew spazju tax-xogħol ġiet eżawrita{ "error": "Too many attempts. Please try again later." }Retry-After: <seconds>
503L-awtentikazzjoni tat-tokens tal-ispazju tax-xogħol temporanjament mhix disponibbli{ "error": "Admin API workspace-token configuration is unavailable", "code": "WORKSPACE_API_CONFIG_UNAVAILABLE" }—
503Tfittxija tal-politika tal-host jew awtorizzazzjoni tad-drittijiet attwali tfalli{ "error": "Workspace authorization is temporarily unavailable", "code": "WORKSPACE_AUTHORIZATION_UNAVAILABLE" }—

L-aċċess API huwa inkluż f'kull pjan. Id-diżattivazzjoni tas-setting adminApiEnabled tal-host tal-ispazju tax-xogħol tirritorna 404; it-telf ta' dritt għal funzjoni addizzjonali jneħħi biss l-ambiti affettwati. Iċ-ċaħda tal-ambitu li tirriżulta tuża r-rispons hawn taħt, mhux fluss ta' tiġdid tat-token.

Żbalji tal-ambiti, l-idempotenza, il-parsing, is-sjieda u mhux mistennija

Japplika għalStatusBody eżattaHeaders/noti
Kull rotta wara l-awtentikazzjoni403{ "error": "Insufficient workspace-token scope", "code": "INSUFFICIENT_SCOPE" }Irritornat meta jkun nieqes kwalunkwe ambitu meħtieġ.
Kull mutazzjoni400{ "error": "Idempotency-Key is required for this operation", "code": "IDEMPOTENCY_KEY_REQUIRED" }Ma ġiet ipprovduta ebda ċavetta.
Kull mutazzjoni400{ "error": "Exactly one Idempotency-Key is required", "code": "INVALID_IDEMPOTENCY_KEY" }Header duplikat jew magħqud b'virgoli.
Kull mutazzjoni400{ "error": "Idempotency-Key must contain 1 to 255 visible characters", "code": "INVALID_IDEMPOTENCY_KEY" }Vojt, twil wisq jew fih karattru ta' kontroll.
Kull mutazzjoni409{ "error": "Idempotency-Key was already used with a different request", "code": "IDEMPOTENCY_CONFLICT" }L-istess token/metodu/path/ċavetta, URL jew body differenti.
Kull mutazzjoni409{ "error": "Request is already processing", "code": "IDEMPOTENT_REQUEST_PROCESSING" }Retry-After: 5.
Kull mutazzjoni409{ "error": "Previous request outcome is unknown; verify its effects before attempting the operation again", "code": "IDEMPOTENCY_OUTCOME_UNKNOWN" }Il-lease tal-ipproċessar preċedenti skada, il-konnessjoni ngħalqet jew it-talba tlestiet b'5xx.
Kull mutazzjoni503{ "error": "Idempotency storage unavailable", "code": "IDEMPOTENCY_UNAVAILABLE" }L-API ma jistax jiċċekkja jew jissejvja r-rekord tal-idempotenza.
Kwalunkwe endpoint bi skema query/body/path invalida422{ "validationErrors": { "<field>": ["<message>"] } }Jista' jkun hemm diversi oqsma/messaġġi. Min jagħmel is-sejħa ma jistax jipprovdi cpoId; l-ispazju tax-xogħol dejjem jiġi mit-token.
Kwalunkwe riżorsa nested tal-ispazju tax-xogħol li ma tinstabx jew ID minn spazju ieħor404{ "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" }Użat b'mod konsistenti sakemm tabella hawn taħt ma tgħidx mod ieħor.
Kwalunkwe endpoint bi ħsara mhux mistennija500{ "error": "Something went wrong" }Għall-mutazzjonijiet, prova mill-ġdid bl-istess ċavetta aktar tard tirritorna 409 IDEMPOTENCY_OUTCOME_UNKNOWN.

L-IDs tal-path tar-riżorsi jridu jkunu numri pożittivi. :siteId, :chargerId, :portId, :tariffId, :profileId, :assignmentId, :userId, :rfidId, :accessId, :limitId jew :localUserId mhux pożittiv jew mhux numeriku jirritorna 422 ValidationError, mhux 400.

Żbalji tas-siti u tal-ġestjoni tal-qawwa

EndpointsStatusBody eżatta
Ħolqien/aġġornament ta' sit; validazzjoni tal-qasam tal-ispazju tax-xogħol422{ "validationErrors": { "<field>": ["<message>"] } }
DELETE /v2/admin/sites/:siteId meta s-sit ikollu dipendenzi409{ "error": "<message>", "code": "SITE_NOT_EMPTY" }
GET /v2/admin/sites/geocode tfittxija normalizzata invalida400{ "error": "<message>", "code": "INVALID_GEOCODE_QUERY" }
L-istess, kju limitat tal-fornitur mimli429{ "error": "<message>", "code": "GEOCODING_BUSY" }; jinkludi Retry-After meta pprovdut mill-ġeokodifikatur
L-istess, timeout/ħsara tal-fornitur jew żball mhux mistenni tal-ġeokodifikatur502{ "error": "<message>", "code": "GEOCODING_UNAVAILABLE" }; żball mhux mistenni juża Address search is temporarily unavailable
PUT /v2/admin/sites/:siteId/power-management konfigurazzjoni tat-topoloġija/dominju invalida422{ "error": "<message>", "code": "INVALID_POWER_MANAGEMENT_CONFIGURATION" }
L-istess, rifjut/timeout OCPP, kunflitt konkorrenti jew ta' rikonċiljazzjoni409{ "error": "<message>", "code": "POWER_MANAGEMENT_CONFLICT" }

Żbalji taċ-ċarġers

mapChargerErrors() jintuża għall-ħolqien/aġġornament taċ-ċarġers, kredenzjali, settings tal-konnetturi, elenkar pubbliku, riżoluzzjoni tal-payload QR, mutazzjoni/aġġornament tal-konfigurazzjoni, bidu tal-firmware, l-erba' kmandi bażiċi kollha u t-talba tal-iskeda komposta.

EndpointsStatusBody eżatta
Kwalunkwe operazzjoni ta' hawn fuq bi żball ta' validazzjoni tad-dominju422{ "validationErrors": { "<field>": ["<message>"] } }
Kwalunkwe operazzjoni ta' hawn fuq b'kunflitt tal-istat, l-uniċità, offline/OCPP, il-fatturazzjoni, Tagless, il-konnettur jew il-prontezza409{ "error": "<message>", "code": "CHARGER_CONFLICT" }
GET /chargers/:chargerId/sessions, firxa tal-ħin predefinita/espliċita invalida422{ "validationErrors": { "from": ["from must be before or equal to to"] } } jew { "validationErrors": { "from": ["Session range cannot exceed 90 days"] } }

Operazzjonijiet sempliċi tal-qari jirritornaw biss ir-risponsi kondiviżi 401/403/404/429/500/503 flimkien mal-validazzjoni query/path 422. It-tħassir ta' ċarġer jista' jirritorna l-500 PlainError kondiviż jekk ifalli mingħajr rispons ta' żball aktar speċifiku.

Żbalji tar-rapporti

EndpointsStatusBody eżatta
Firxa tad-data/esportazzjoni fejn from >= to422{ "validationErrors": { "range": ["from must be earlier than to"] } }
Firxa tad-data/esportazzjoni ta' aktar minn 90 jum422{ "validationErrors": { "range": ["Report ranges cannot exceed 90 days"] } }
Cursor opak invalidu għad-data/kejl422{ "validationErrors": { "cursor": ["<message>"] } }
GET /reports/export, ir-riżultat jaqbeż 2,000 ringiela422{ "error": "<message>", "code": "REPORT_EXPORT_ROW_LIMIT", "limit": 2000 }
POST /reports/send, ebda skeda salvata409{ "error": "A workspace report schedule must be saved before sending", "code": "REPORT_SCHEDULE_REQUIRED" }
L-istess, il-mailer jirrifjuta/ifalli502{ "error": "Report delivery failed", "code": "REPORT_DELIVERY_FAILED" }
Riżorsa tal-iskeda/kejl taħt is-sjieda assenti404body kondiviża RESOURCE_NOT_FOUND

L-esportazzjoni li tirnexxi hija binarja; l-iżbalji kollha tal-esportazzjoni jibqgħu JSON.

Żbalji tat-tariffi

EndpointsStatusBody eżatta
Validazzjoni tad-dominju għall-ħolqien/aġġornament/komponenti/prezzijiet tas-suq/assenjazzjonijiet422{ "validationErrors": { "<field>": ["<message>"] } }
Kunflitt ta' stat/dipendenza/uniċità fit-tħassir tat-tariffa jew fl-assenjazzjoni409{ "error": "<message>", "code": "TARIFF_CONFLICT" }
Tariffa, żona tal-offerti, ċarġer, konnettur, assenjazzjoni ta' tariffa jew riżorsa nested oħra mhux taħt is-sjieda404body kondiviża RESOURCE_NOT_FOUND

Żbalji tal-profili tal-iċċarġjar

EndpointsStatusBody eżatta
Validazzjoni tad-dominju għall-ħolqien/aġġornament/skeda/assenjazzjonijiet422{ "validationErrors": { "<field>": ["<message>"] } }
Il-profil huwa referenzjat minn użu protett409{ "error": "<message>", "code": "CHARGING_PROFILE_IN_USE" }
Kunflitt ta' sinkronizzazzjoni OCPP, assenjazzjoni, konkorrenza jew profil ieħor409{ "error": "<message>", "code": "CHARGING_PROFILE_CONFLICT" }
Profil, ċarġer, konnettur, assenjazzjoni jew riżorsa nested oħra mhux taħt is-sjieda404body kondiviża RESOURCE_NOT_FOUND

Żbalji tad-dominju tal-utent

Żbalji ta' validazzjoni tal-utent li jidentifikaw qasam jużaw ValidationError flimkien ma' code; żbalji oħra tal-utent jużaw CodedError. Il-każijiet kollha ta' riżorsi nieqsa jużaw ir-rispons kondiviż RESOURCE_NOT_FOUND li ma jiżvelax ir-riżorsi.

StatusKodiċi/KodiċijietBody
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" }; jinkludi 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 jista' wkoll jirritorna l-403 INSUFFICIENT_SCOPE kondiviż wara l-parsing tal-body jekk users:access ikun nieqes, jew jekk ġie pprovdut RFID u users:rfid ikun nieqes. L-endpoints tal-utenti lokali jelenkaw kull ambitu meħtieġ f'Referenza tal-endpoints.

Il-kodiċijiet tal-iżbalji tal-utent japplikaw kif ġej:

Familja ta' endpointsKodiċijiet tad-dominju tal-utent mhux 404 flimkien mar-risponsi kondiviżi
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)
Dettall tal-utent, vetturi, qari RFID/aċċess/limituebda kodiċi tad-dominju mhux 404
Ħolqien RFIDCUSTOMER_CONTRACT_MISSING, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_RFID (422)
Aġġornament/tħassir RFIDTAGLESS_USER_PROTECTED (409)
Sostituzzjoni tal-aċċessTAGLESS_USER_PROTECTED (409); NO_CHARGERS_AVAILABLE (422)
Revoka tal-aċċessTAGLESS_USER_PROTECTED (409)
Ħolqien/aġġornament tal-limituTAGLESS_USER_PROTECTED, LIMIT_ALREADY_EXISTS (409); INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE (422)
Tħassir tal-limituTAGLESS_USER_PROTECTED (409)
Ħolqien ta' stedina tal-ispazju tax-xogħolCUSTOMER_CONTRACT_MISSING, INVITATION_EMAIL_IN_USE, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL/INVALID_RFID (422); INVITATION_RESEND_THROTTLED (429) meta japplika perjodu ta' stennija għat-twassil
Bgħit mill-ġdid ta' stedina tal-ispazju tax-xogħolINVALID_EMAIL (422), INVITATION_RESEND_THROTTLED (429)
Kanċellazzjoni ta' stedina tal-ispazju tax-xogħolINVALID_EMAIL (422)
Ħolqien ta' utent lokali taċ-ċarġer għal klijent eżistentiLOCAL_USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409)
Stedina ta' utent lokali taċ-ċarġerLOCAL_USER_ALREADY_EXISTS, INVITATION_EMAIL_IN_USE, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL (422); INVITATION_RESEND_THROTTLED (429) meta japplika perjodu ta' stennija għat-twassil
Kanċellazzjoni ta' stedina ta' utent lokaliINVALID_EMAIL (422)
Aġġornament/tħassir ta' utent lokaliTAGLESS_USER_PROTECTED (409)

L-eżiti kollha tas-sjieda u tar-riżorsi nieqsa f'dawk il-familji, inkluża email mhux reġistrata fuq POST /users, jużaw il-body kondiviża 404 RESOURCE_NOT_FOUND.

Risponsi mingħajr body u ta' ripetizzjoni

Rispons ta' suċċess 204 ma jkollux body. Dan japplika għal kull tħassir dokumentat li jelenka 204 empty. Ripetizzjoni idempotenti kompluta tissettja Idempotency-Replayed: true u tuża l-istatus/body maħżuna; għal 204, ir-rispons HTTP jibqa' mingħajr body. L-API qatt ma jirritorna oġġett JSON ta' suċċess għal operazzjoni dokumentata 204.