1. Indledning
Dette dokument beskriver hvordan elektronisk kommunikation med Datahub 3 skal varetages.
Eksemplerne her indeholder ikke de korrekte informationer for de forskellige miljøer.
De kan findes her. Datahub 3 preprod - Edi Kommunikation
Begge dokumentformater afleveres via den samme kanal til DataHub 3. Kaldet til DataHub fortæller hvilken type data der bliver sendt og vil blive valideret på baggrund af dette.
2. Kommunikation
Kommunikationskanalen til CIM er baseret på http protokollen. Der gøres brug af standard http verber, http-headers og status koder når der sendes et datasæt til DataHub.
2.1 HTTP kommunikation
De forskellige http-verber benyttes til at udtrykke hvad man ønsker at udfører i DataHub.
2.1.1 HTTP POST
Hvis man vil aflevere et datasæt til DataHub dannes forespørgslen som en POST. Selve doku- mentet skrives i body på HTTP forespørgslen. Ved hjælp af http header værdier beskrives ind- holdet. For at sende i CIM XML sættes Content-Type til application/xml, ved CIM JSON er vær- dien application/json.
For at indikere hvilket format man ønsker svaret leveret i sættes Accept. Her kan man vælge imellem application/xml og application/json. Undlades værdien bliver der som default sendt et svar via application/json.
Hvis indholdet overholder de gældende regler, vil der blive returneret 202 Accepted fra Data- Hub. Når dette returneres, vil der ikke være noget indhold med i svaret. Ved eventuelle sup- port henvendelser kan man referere til værdien der findes i http-headeren CorrelationId, denne kan bruges til at spore forespørgslen i DataHub.
POST /v1.0/cim/RequestEndOfSupply HTTP/1.1
Host: api.itlev.datahub.dk
Authorization: Bearer <bearer-token>
Accept: application/json
Content-Type: application/xml
Content-Length: <content-length-of-request>
<? xml version=”1.0” encoding=”UTF-8” ?>
...
HTTP/1.1 202 Accepted
CorrelationId: c3105ac6-7a60-48e1-8c15-8df11dcc4ee4
2.1.2 HTTP GET
Når man vil hente data ud fra DataHub dannes der en GET-forespørgsel. For at indikere det for- mat man ønsker svaret returneret i sættes Accept headeren. DataHub vil forsøge at leve op til den ønskede værdi. Der understøttes umiddelbart to værdier application/xml og applica- tion/json. DataHub vil i svaret indikere det faktiske indholds format ved at sætte Content-Type til enten application/xml eller application/json.
Serveren vil svare tilbage med det indhold der er fundet på forespørgslen. Hvis der er et doku- ment, vil statuskoden være 200 OK, hvis der ikke er fundet noget indhold, vil statuskoden være 204 No Content.
GET /v1.0/cim/timeseries HTTP/1.1
Host: api.itlev.datahub.dk Authorization: Bearer <bearer-token>
Accept: application/xml
Svar uden indhold:
HTTP/1.1 204 No Content
CorrelationId: c3105ac6-7a60-48e1-8c15-8df11dcc4ee4
Svar med indhold:
HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: <content-length-of-response>
CorrelationId: c3105ac6-7a60-48e1-8c15-8df11dcc4ee4
MessageId: <id-of-message>
<? Xml version=”1.0” encoding=”UTF-8” ?>
...
2.1.3 HTTP DELETE
Skal der fjernes noget indhold fra DataHub benyttes en DELETE-forespørgsel. Serveren kan svare tilbage med to forskellige statuskoder, 200 OK hvis det lykkedes at gennemføre fore- spørgslen. Ved fejl se fejlbeskeder i sektion 2.3. Ved at sætte Accept kan man indikere hvilket format man ønsker svaret returneret i.
DELETE /v1.0/cim/deqeueue/<id-of-message> HTTP/1.1
Host: api.itlev.datahub.dk
Authorization: Bearer <bearer-token>
Accept: application/json
Positiv tilbagemelding:
HTTP/1.1 200 OK
CorrelationId: c3105ac6-7a60-48e1-8c15-8df11dcc4ee4
Negativ tilbagemelding:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: <content-length-of-response>
CorrelationId: c3105ac6-7a60-48e1-8c15-8df11dcc4ee4
{
”error”: {
”code”: ”BadArgument”,
”message”: ”Unknown message-id”,
”target”: ”message-id”,
”innererror”: {
”code”: ”MessageIdNotKnown”,
”message-id”: ”<id-of-message>”
}
}
}
2.2 Sikkerhed
For at kommunikere med CIM kanalen er en krypteret forbindelse påkrævet. DataHub udstiller en HTTPS-adresse hvor alt kommunikation skal foregå.
Udover den krypterede forbindelse gør DataHub brug af OAuth til at sikre identiteten af aktø- ren. Dette sker ved at aktøren medsender et bearer token for hvert kald. For at hente et token – se afsnit 2.6.
Bearer token skrives i et http-header, Authorization, hvor det prefixes med Bearer.
POST /v1.0/cim/RequestEndOfSupply
HTTP/1.1 Host: api.itlev.datahub.dk
Authorization: Bearer <bearer-token>
Content-Type: application/xml
Content-Length: <content-length-of-request>
<?xml version=”1.0” encoding=”UTF-8”?>
<RequestEndOfSupply_MarketDocument>
...
</RequestEndOfSupply_MarketDocument>
2.3 Validering af forespørgsler
Der bliver foretager flere valideringer når en forespørgsel håndteres af DataHub. Hver af disse valideringer kan resultere i forskellige fejl koder.
HTTP kode | Navn | Beskrivelse |
400 | Bad Request | DataHub kan ikke gennemføre forespørgslen |
401 | Unauthorized | Der er ikke sendt et gyldigt bearer token |
403 | Forbidden | Det medsendte token er ikke gyldigt til den pågældende adresse |
413 | Payload Too Large | Dokumentet er for stort |
415 | Unsupported Media Type | Hvis den medsendte Content-Type ikke er godkendt |
Hvis der er en fejl ved forespørgslen, bliver fejlen beskrevet ved hjælp af en ”fejl” datastruktur.
Se nedenstående tabeller. Strukturen kan returneres enten som XML eller JSON alt efter hvad klienten har indikeret i Accept header feltet. Hvis feltet ikke er medsendt, vil der som standard blive svaret i JSON.
Attribut | Type | Påkrævet | Beskrivelse |
error | Error | Ja | Objekt der beskriver fejlen |
ErrorResponse : object
Attribut | Type | Påkrævet | Beskrivelse |
code | String | Ja | Fejlkode der entydigt identificere fejlen |
message | String | Ja | Fejltekst |
target | String | Nej | Felt navn der har fejlet validering |
details | Error[] | Nej | En liste af fejl der kan uddybe hvad der er fejlet |
innererror | InnerError | Nej | Et objekt der beskriver i flere detaljer hvad der er fejlet |
Error : object
Attribut | Type | Påkrævet | Beskrivelse |
code | String | Nej | Fejlkode |
innererror | InnerError | Nej | Mulighed for at inkludere underligende fejl |
custom-attribut | Any | Nej | Eventuelle attributter der ikke er defineret i dette dokument |
InnerError : object
Eksempel (JSON) | Eksempel (XML) |
{ ”code”: ”BadArgument”, ”message”: ”Message-id previously used”, ”innererror”: { ”code”: ”MessageIdPreviousUsed”, ”message-id”: ”gs8u033bqn”, ”used-on”: ”2018-05-16T15:32:12Z” } } } | <Error> <Code>BadArgument</Code> <Message>Message-id previously used</Message> <InnerError> <Code>MessageIdPreviousUsed</Code> <Message-id>gs8u033bqn</Message-Id> <Used-on>2018-05-16T15:32:12Z</Used-on> </InnerError> </Error>
|
2.4 HTTP endpoints
Der udstilles en adresse til hvert af de dokumenttyper man kan udveksle med DataHub.
HTTP verb | RSM | Path |
POST | 001 | /v1.0/cim/requestchangeofsupplier |
POST | 003 | /v1.0/cim/requestreallocatechangeofsupplier |
POST | 003 | /v1.0/cim/confirmreallocatechangeofsupplier |
POST | 003 | /v1.0/cim/rejectreallocatechangeofsupplier |
POST | 005 | /v1.0/cim/requestendofsupply |
POST | 006 | /v1.0/cim/requestaccountingpointcharacteristics |
POST | 012 | /v1.0/cim/notifyvalidatedmeasuredata |
POST | 015 | /v1.0/cim/requestvalidatedmeasuredata |
POST | 016 | /v1.0/cim/requestaggregatedmeasuredata |
POST | 017 | /v1.0/cim/requestwholesalesettlement |
POST | 020 | /v1.0/cim/requestservice |
POST | 021 | /v1.0/cim/requestchangeofaccountingpointcharacteristics |
POST | 024 | /v1.0/cim/requestcancellation |
POST | 027 | /v1.0/cim/requestchangecustomercharacteristics |
POST | 028 | /v1.0/cim/characteristicsofacustomeratanap |
POST | 030 | /v1.0/cim/requestchangebillingmasterdata |
POST | 032 | /v1.0/cim/requestbillingmasterdata |
POST | 033 | /v1.0/cim/requestchangeofpricelist [1] |
POST | 035 | /v1.0/cim/requestpricelist |
DELETE | n/a | /v1.0/cim/dequeue/{id-of-message} [2] |
GET | n/a | /v1.0/cim/aggregations |
GET | n/a | /v1.0/cim/all |
GET | n/a | /v1.0/cim/masterdata |
GET | n/a | /ping |
2.5 Identifikation af besked type
For at hente et dokument fra DataHub sker det via en GET-kanal. Hver kanal kan returnere én eller flere dokumenttyper. Den pågældende dokumenttype kan læses fra http-headeren MessageType. For en komplet liste af dokumenttyper der kan modtages, kan dette ses i appendix – Dokumenttype og deres relation til kø’er
2.6 Azure B2C – Oauth
OAuth 2.0 [RFC 6749] er et rammeværk, der muliggør tredjeparts adgang til beskyttet HTTP endpoints. Den OAuth metode der benyttes i DataHub 3 er Client Credentials Grant, som er en metode der oftest benyttes til server-til-server kommunikation.
Nedenstående diagram viser forløbet, når en aktør trækker en JWT token og benytter denne til at kalde DataHubs API i forbindelse med aktørtesten, der påbegyndes i februar 2022. Nedenstående kald tager udgangspunkt i ping-endpoint'et i ovenstående tabel.
Bearer token trækkes via et POST:
Path: 20e7a6b4-86e0-4e7a-a34d-6dc5a75d1982/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com/
Content-Type: application/x-www-form-urlencoded
Content-Length: 185
grant_type=client_credentials&client_id=client_id_provided_by_energinet&scope=54ff4628-ddb1-41ad-9fb0-60286da90d87%2F.default&client_secret=client_secret_provided_by_energinet
HTTP-kaldets body skal bestå af følgende key-value pairs.
Key | Value |
grant_type | client_credentials |
client_id | <aktørspecifikt ID der udleveres af Energinet> |
scope | 65877f1b-1aef-42b3-adc7-3009608f27a3/.default |
client_secret | <aktørspecifik kode der udleveres af Energinet> |
Positiv tilbagemelding:
{
"token_type": "Bearer",
"expires_in": 3599,
"ext_expires_in": 3599,
"access_token": " <bearer-token>"
}
Negativ tilbagemelding
{
"error": <Fejlkode til at klassifisere fejltyper og reagere på dem>,
"error_description": <Fejlmeddelelse til at identificere root cause>,
"error_codes": [<Liste af STS-specifikke fejlkoder>],
"timestamp": <Tidspunktet for hvornår fejlen opstod>,
"trace_id": <Unikt ID for forespørgslen til fejlfinding>,
"correlation_id": <Unikt ID for forespørgslen>,
"error_uri": <link til hvor information om fejltypen findes>
}