Dokumentoplysninger

Gældende version og gyldighedsdato
DatoVersionGældende fraAnsvarlig
22..04.20201.2Den 22. april 2020Ulla Høeg Larsen

Indhold

Indledning

Dette notat beskriver kort webservicen tilhørende FGU-indberetningen til Datavarehuset (herefter Webservicen).

Webservicen er udviklet og driftes af Styrelsen for It og Læring. Indholdet er beskrevet i dokumentet "Indberetningsstruktur for FGU-indberetning til Datavarehuset".

I de følgende afsnit introduceres kald til webservicen, og i afsnit 6 findes en kort introduktion til nyttige værktøjer.

Kontakt Webservicen

Testmiljø

Webservicen findes i et testmiljø. Servicebeskrivelsen findes på denne adresse: https://et.integrationsplatformen.dk/services/DVH/FGU/v1.0?wsdl

Webservicen udstiller blandt andet en simpel HelloWorld-metode, der blot returnerer "Hello World". Det anbefales at foretage den første test mod denne metode.

Kald til webservicen er beskyttet af brugernavn og adgangskode. Se Bilag 2 for en guide til at sætte brugernavn og adgangskode i SoapUI.

Produktionsmiljø

Webservicen kaldes via STIL's integrationsplatform IP-Ung.

IP-Ung er en integrationsplatform, som understøtter udveksling af data mellem STIL's centrale systemer og eksterne systemer. IP-Ung anvendes af uddannelsesinstitutioner, myndigheder og organisationer på førskole-, grundskole-, ungdomsuddannelses-, voksen- og efteruddannelsesområdet.

Platformen tilbyder ensartede webservices for indberetning til og hentning af data fra STIL's centrale systemer inkl. autentificering, autorisering og logning af hændelser i forbindelse med dataudvekslingen. IP-Ung er en ren infrastrukturkomponent, og har ingen brugergrænseflade, ligesom den ikke opbevarer data. Platformen understøtter, at systemleverandører, blandt andet leverandører af studieadministrative systemer på de ovennævnte uddannelsesområder, kan udveksle data med STIL's systemer på en institutions vegne på en ensartet, transparent og sikker måde.

Yderligere oplysninger om tilslutning og tekniske detaljer kan findes på STIL's supportsite via https://viden.stil.dk/display/OFFintegrationsplatformen.

Servicebeskrivelsen findes på: https://integrationsplatformen.dk/services/DVH/FGU/v1.0?wsdl.

Webservicens Get-metoder

Webservicen udstiller en række Get-metoder, som kort beskrives nedenfor.

GetXmlSchema

Denne metode returnerer det aktuelle schema, som XML-data forventes at over-holde, når der overføres data fra de administrative systemer til Webservicen.
Det anbefales, at leverandøren altid sikrer sig, at XML-data overholder det schema, der udstilles via GetXmlSchema og validerer XML-data lokalt (i klienten) mod schemaet før overførelse til Webservicen.
GetXmlSchema returnerer schemaet i XML-format.

Validere data

ValidateXmlAgainstSchema

Denne metode validerer overførte XML-data mod det aktuelle schema. Der returneres et ValidateXmlAgainstSchemaResult som resultat af valideringen. Hvis valideringen ikke finder fejl, vil ErrorCount være 0. Ellers vil ErrorCount være større end 0, og der vil være en liste af ValidationError-elementer med fejlmeddelser. Fejlmeddelelserne er henvendt til udviklere og lister .Net fejlmeddelelsen samt den linje i XML-filen, der fejler i forhold til schemaet.
ValidateXmlAgainstSchema har alene til formål at teste XML-data mod det aktuelle schema og er en hjælp til udvikling af XML-eksport i de administrative systemer.
Se Bilag 1 for eksempel på XML-data, der overholder det aktuelle schema og returnerer et OK-svar.

Eksempel på OK-svar

Eksempel
<ValidateXmlAgainstSchemaResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ErrorCount>0</ErrorCount>
<Message>Data blev modtaget og valideret korrekt.</Message>
<ValidationErrors/>
</ValidateXmlAgainstSchemaResult>

Eksempel på Fejl-svar

Eksempel
<ValidateXmlAgainstSchemaResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCount>2</ErrorCount>
  <Message>Der er 2 valideringsfejl</Message>
  <ValidationErrors>
     <ExtendedValidationError>
        <ErrorHoldId i:nil="true"/>
        <ErrorLocation i:nil="true"/>
        <ErrorMessage>Linje: 11 udløser fejlen: \[The 'http://data.stil.dk/FguIndberetning/:PersonId' element is invalid - The value 'aaaaaaavvaaa' is invalid according to its datatype 'String' - The actual length is greater than the MaxLength value.\]</ErrorMessage>
        <ErrorPersonId i:nil="true"/>
        <ErrorType>XmlValidation</ErrorType>
     </ExtendedValidationError>
     <ExtendedValidationError>
        <ErrorHoldId i:nil="true"/>
        <ErrorLocation i:nil="true"/>
        <ErrorMessage>Linje: 10 udløser fejlen: \[The identity constraint 'http://data.stil.dk/FguIndberetning/:ElevKey' validation has failed. Either a key is missing or the existing key has an empty node.\]</ErrorMessage>
        <ErrorPersonId i:nil="true"/>
        <ErrorType>XmlValidation</ErrorType>
     </ExtendedValidationError>
  </ValidationErrors>
</ValidateXmlAgainstSchemaResult> 

Overføre data

UploadData

Denne metode anvendes til at overføre data, der skal indberettes. Der valideres mod det aktuelle schema, som ved anvendelse af metoden ValidateXmlAgainstSchema beskrevet i afsnit 4.1. Derudover foretages krydsvalideringer i indberetningen (fx startdatoer mod slutdatoer). Såfremt data er fejlfrie, gemmes data og erstatter evt. tidligere overførelser foretaget i indberetningsperioden.
Hvis valideringen ikke finder fejl, vil ErrorCount være 0. Ellers vil ErrorCount være større end 0, og der vil være en liste af ValidationError-elementer med fejlmeddelser.

Eksempel på OK-svar

Eksempel
<UploadDataResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ErrorCount>0</ErrorCount>
<Message>Data blev modtaget og valideret korrekt.</Message>
<ValidationErrors/>
</UploadDataResult>

Eksempel på Fejl-svar

Eksempel
<UploadDataResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCount>2</ErrorCount>
  <Message>Der er 2 valideringsfejl</Message>
  <ValidationErrors>
     <ExtendedValidationError>
        <ErrorHoldId i:nil="true"/>
        <ErrorLocation i:nil="true"/>
        <ErrorMessage>Linje: 11 udløser fejlen: \[The 'http://data.stil.dk/FguIndberetning/:PersonId' element is invalid - The value 'aaaaaaaaaaaa' is invalid according to its datatype 'String' - The actual length is greater than the MaxLength value.\]</ErrorMessage>
        <ErrorPersonId i:nil="true"/>
        <ErrorType>XmlValidation</ErrorType>
     </ExtendedValidationError>
     <ExtendedValidationError>
        <ErrorHoldId i:nil="true"/>
        <ErrorLocation i:nil="true"/>
        <ErrorMessage>Linje: 10 udløser fejlen: \[The identity constraint 'http://data.stil.dk/FguIndberetning/:ElevKey' validation has failed. Either a key is missing or the existing key has an empty node.\]</ErrorMessage>
        <ErrorPersonId i:nil="true"/>
        <ErrorType>XmlValidation</ErrorType>
     </ExtendedValidationError>
  </ValidationErrors>
</UploadDataResult>

Udviklingsværktøjer

Webservicen er udviklet i .Net-frameworket og kan umiddelbart tilgås i Visual Studio ved at tilføje WSDL som service reference.
Følgende gratis udviklingsværktøjer kan anbefales til test og debug:

Bilag 2 og 3 er eksempler på hhv. soap request og tilhørende soap response, når XML-data i bilag 1 anvendes.

Eksempler på datavalideringer

Indberetningen indeholder et antal datavalideringer, som er oplistet i indberetningsstrukturdokumentet. Herunder nogle eksempler på fejlmeddelelser ihht. disse:

Entitet

Fejlmeddelelse

Elev

Afgangsårsag ('') må ikke være tom, når der findes en Slutdato ('2019-09-12')


Personens køn (1) stemmer ikke med sidste ciffer i PersonId (6)

Skoleperiode

Slutdato ('2020-01-02') for skoleperioden skal ligge indenfor start- ('2019-08-01') og slutdato ('2019-12-31') for eleven


Startdato ('2019-08-01') må ikke være den samme som slutdato ('2019-08-01') for skoleperioderne BA og US

Fravær

Dato ('2019-08-12') for fraværet skal ligge indenfor start- ('2019-08-27') og slutdato ('2019-10-09') for eleven

Praktikophold

Startdato ('2019-08-01') for praktikopholdet må ikke ligge efter Slutdato ('2019-11-01') for eleven


Der må ikke være flere praktikophold på samme elev med samme startdato ('2019-08-01')


Startdato ('2019-09-01') må ikke ligge efter Slutdato ('2019-08-01')

Bilag 1: Eksempel på valid XML-data

Eksempel
<Indberetning xsi:schemaLocation="http://data.stil.dk/FguIndberetning/ FguIndberetningV1.2.xsd" xmlns="http://data.stil.dk/FguIndberetning/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
               <Version>1.2</Version>
               <SystemVersion>a</SystemVersion>
               <JournalNummer>a</JournalNummer>
               <IndberetningsAar>000000</IndberetningsAar>
               <IndberettendeEnhed>100000</IndberettendeEnhed>
               <KontaktPerson>Ulla</KontaktPerson>
               <KontaktEmail>uhl@stil.dk</KontaktEmail>
               <ElevListe>
                  <Elev>
                     <PersonId>0000000000</PersonId>
                     <Foedselsdato>1910-01-01</Foedselsdato>
                     <Koen>2</Koen>
                     <Uddannelse>a</Uddannelse>
                     <Startdato>2022-01-01</Startdato>
                     <Slutdato>2023-04-01</Slutdato>
                     <StartniveauDansk>E</StartniveauDansk>
                     <StartniveauMatematik>I</StartniveauMatematik>
                     <SlutniveauEGU>1</SlutniveauEGU>
                     <SlutniveauPGU>1</SlutniveauPGU>
                     <Afgangsaarsag>111</Afgangsaarsag>
                     <SkoleperiodeListe>
                        <Skoleperiode>
                           <Startdato>2022-01-01</Startdato>
                           <SkoleperiodeKode>BA</SkoleperiodeKode>
                           <Slutdato>2022-01-05</Slutdato>
                           <Undervisningssted>100000</Undervisningssted>
                           <UddannelsesVersion>1</UddannelsesVersion>
                           <SpecialeKode>2</SpecialeKode>
                        </Skoleperiode>
                        <Skoleperiode>
                           <Startdato>2022-01-05</Startdato>
                           <SkoleperiodeKode>FL</SkoleperiodeKode>
                           <Slutdato>2022-01-09</Slutdato>
                           <Undervisningssted>100000</Undervisningssted>
                           <UddannelsesVersion>1</UddannelsesVersion>
                           <SpecialeKode>0</SpecialeKode>
                        </Skoleperiode>
                        <Skoleperiode>
                           <Startdato>2022-03-01</Startdato>
                           <SkoleperiodeKode>KF</SkoleperiodeKode>
                           <Slutdato>2022-03-05</Slutdato>
                           <Undervisningssted>200000</Undervisningssted>
                           <UddannelsesVersion>1</UddannelsesVersion>
                           <SpecialeKode>1</SpecialeKode>
                        </Skoleperiode>
                        <Skoleperiode>
                           <Startdato>2022-04-05</Startdato>
                           <SkoleperiodeKode>ÅP</SkoleperiodeKode>
                           <Slutdato xsi:nil="true"/>
                           <Undervisningssted>200000</Undervisningssted>
                           <UddannelsesVersion>1</UddannelsesVersion>
                           <SpecialeKode>0</SpecialeKode>
                        </Skoleperiode>
                     </SkoleperiodeListe>
                     <PraktikopholdListe>
                        <Praktikophold>
                           <CVRnummer>1</CVRnummer>
                           <Startdato>2022-01-01</Startdato>
                           <Undervisningssted>100000</Undervisningssted>
                           <Slutdato>2023-01-03</Slutdato>
                           <Pnummer>0</Pnummer>
                        </Praktikophold>
                     </PraktikopholdListe>
                     <FravaerListe>
                        <Fravaer>
                           <Dato>2023-01-01</Dato>
                           <Undervisningssted>100000</Undervisningssted>
                           <MinutterLovligt>61</MinutterLovligt>
                           <MinutterUlovligt>300</MinutterUlovligt>
                           <MinutterIalt>361</MinutterIalt>
                        </Fravaer>
                        <Fravaer>
                           <Dato>2023-01-01</Dato>
                           <Undervisningssted>100001</Undervisningssted>
                           <MinutterLovligt>61</MinutterLovligt>
                           <MinutterUlovligt>300</MinutterUlovligt>
                           <MinutterIalt>450</MinutterIalt>
                        </Fravaer>
                     </FravaerListe>
                  </Elev>
                  <Elev>
                     <PersonId>0000000002</PersonId>
                     <Foedselsdato>1910-01-01</Foedselsdato>
                     <Koen>2</Koen>
                     <Uddannelse>a</Uddannelse>
                     <Startdato>2022-01-01</Startdato>
                     <Slutdato xsi:nil="true"/>
                     <StartniveauDansk>E</StartniveauDansk>
                     <StartniveauMatematik>I</StartniveauMatematik>
                     <SlutniveauEGU>1</SlutniveauEGU>
                     <SlutniveauPGU>1</SlutniveauPGU>
                     <Afgangsaarsag xsi:nil="true"/>
                     <SkoleperiodeListe>
                        <Skoleperiode>
                           <Startdato>2022-01-01</Startdato>
                           <SkoleperiodeKode>BA</SkoleperiodeKode>
                           <Slutdato>2022-01-05</Slutdato>
                           <Undervisningssted>100000</Undervisningssted>
                           <UddannelsesVersion>1</UddannelsesVersion>
                           <SpecialeKode>2</SpecialeKode>
                        </Skoleperiode>
                        <Skoleperiode>
                           <Startdato>2022-01-05</Startdato>
                           <SkoleperiodeKode>FL</SkoleperiodeKode>
                           <Slutdato>2022-01-09</Slutdato>
                           <Undervisningssted>100000</Undervisningssted>
                           <UddannelsesVersion>1</UddannelsesVersion>
                           <SpecialeKode>0</SpecialeKode>
                        </Skoleperiode>
                        <Skoleperiode>
                           <Startdato>2022-03-01</Startdato>
                           <SkoleperiodeKode>KF</SkoleperiodeKode>
                           <Slutdato>2022-03-05</Slutdato>
                           <Undervisningssted>200000</Undervisningssted>
                           <UddannelsesVersion>1</UddannelsesVersion>
                           <SpecialeKode>1</SpecialeKode>
                        </Skoleperiode>
                        <Skoleperiode>
                           <Startdato>2022-04-05</Startdato>
                           <SkoleperiodeKode>ÅP</SkoleperiodeKode>
                           <Slutdato xsi:nil="true"/>
                           <Undervisningssted>200000</Undervisningssted>
                           <UddannelsesVersion>1</UddannelsesVersion>
                           <SpecialeKode>0</SpecialeKode>
                        </Skoleperiode>
                     </SkoleperiodeListe>
                     <PraktikopholdListe>
                        <Praktikophold>
                           <CVRnummer>1</CVRnummer>
                           <Startdato>2022-01-01</Startdato>
                           <Undervisningssted>100000</Undervisningssted>
                           <Slutdato>2023-01-03</Slutdato>
                           <Pnummer>0</Pnummer>
                        </Praktikophold>
                     </PraktikopholdListe>
                     <FravaerListe>
                        <Fravaer>
                           <Dato>2023-01-01</Dato>
                           <Undervisningssted>100000</Undervisningssted>
                           <MinutterLovligt>360</MinutterLovligt>
                           <MinutterUlovligt>0</MinutterUlovligt>
                           <MinutterIalt>360</MinutterIalt>
                        </Fravaer>
                        <Fravaer>
                           <Dato>2023-01-01</Dato>
                           <Undervisningssted>100001</Undervisningssted>
                           <MinutterLovligt>60</MinutterLovligt>
                           <MinutterUlovligt>0</MinutterUlovligt>
                           <MinutterIalt>60</MinutterIalt>
                        </Fravaer>
                     </FravaerListe>
                  </Elev>
               </ElevListe>
            </Indberetning>

Bilag 2: Eksempel på SoapUI request

Eksempel
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:fgud="http://www.stil.dk/FguDvh">
   <soap:Header/>
   <soap:Body>
      <fgud:UploadData>
         <fgud:xml> \[…Indsæt XML som i Bilag 1…\]
         </ fgud:xml>
      </ fgud:ValidateXmlAgainstSchema>
   </soapenv:Body>
</soapenv:Envelope>
\\
Da webservicens kald er beskyttet af brugernavn og adgangskode, skal disse sættes i SoapUI via knappen Auth:
!worddavca27b7cfbaaa060999eedb060429f21c.png|height=82,width=351!
\\
Vælg "Add New Authorization…" og typen "Basic" i den efterfølgende dialogboks.
!worddav0141ec5969d22f3a65d0881d19176798.png|height=319,width=476!
\\
Angiv brugernavn og adgangskode, og markér "Authenticate pre-emptively" i fanebladet "Auth".
!worddav43762cfeb58083b0cf5d01145ae391b0.png|height=226,width=506!
\\
I fanebladet "WS-A" sættes flueben i "Add default wsa:To".
!worddav8d3f31f2bbb928854b6ed44b34679637.png|height=274,width=506!
\\
I "Request Properties" sættes de to egenskaber "WSS-PasswordType" og "WSS TimeToLive". PasswordType sættes til PasswordText, mens TimeToLive sættes tilpas højt (her 2000 millisekunder).
!worddave4f070bfdc726235353f45b333cb271e.png|height=156,width=506!
\\
*Alternativt* kan brugernavn og adgangskode sættes for alle webservice-kald ved at højreklikke på WSDL interfacet og vælge "Show Interface Viewer". Herefter udfyldes oplysningerne i fanebladet "Service Endpoints".
!worddav0d92fa904a95e6d82d25a6132852fd0a.png|height=88,width=608!
\\
I fanebladet "WS-A" sættes fortsat flueben i "Add default wsa:To" for det enkelte kald.
!worddav8d3f31f2bbb928854b6ed44b34679637.png|height=274,width=506!
\\

Bilag 3: Eksempel på SoapUI response

Eksempel
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<a:Action s:mustUnderstand="1">http://www.stil.dk/FguDvh/IUploadService/UploadDataResponse</a:Action>
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<u:Timestamp u:Id="_0">
<u:Created>2019-02-12T12:37:35.828Z</u:Created>
<u:Expires>2019-02-12T12:42:35.828Z</u:Expires>
</u:Timestamp>
</o:Security>
</s:Header>
<s:Body>
<UploadDataResponse xmlns="http://www.stil.dk/FguDvh">
<UploadDataResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ErrorCount>0</ErrorCount>
<Message>Data blev modtaget og valideret korrekt.</Message>
<ValidationErrors/>
</UploadDataResult>
</UploadDataResponse>
</s:Body>
</s:Envelope>
  • Ingen etiketter