Kleines Länderdatentool

Erwartete Lesezeit: 9 minuten

Nachdem ich in letzter Zeit kaum zum „Basteln“ gekommen bin hab ich mir ein kleines Tool zum Lesen von Länderdaten gebaut.
Die zugehörigen Daten hab ich aus verschiedenen Quellen zusammengesucht, die meisten stammen vom Statistischen Bundesamt.

Was macht das Tool?

Aktuell kann man via Rest-Call mit dem Ländernamen , dem ISO3361-2 , ISO3361-3 bzw. dem KFZ-Länderkennzeichen suchen. (Weitere Abfragen in Vorbereitung) .
Die Anwendung verfügt zusätzlich über einen Endpunkt für eine Autocomplete-Funktion.

Datenmodell ?

Aktuell werden die folgende Daten im System abgebildet:

Kleines Länderdatentool
Entity

Wo bekomme ich das Tool her ?

Das ganze Projekt findet Ihr in meinem öffentlichen Github Repository unter https://github.com/MOderkerk/lkzprovider .

Von dort könnt Ihr euch den SourceCode klonen oder die fertige Anwendung unter
https://github.com/MOderkerk/lkzprovider/packages/501823 herunterladen.

Gestartet wird die Anwendung z.B. via java -jar lkzprovider-<version>.jar .

Als weitere Möglichkeit kann man via Maven herunterladen:

<dependency>
  <groupId>de.oderkerk.tools</groupId>
  <artifactId>lkzprovider</artifactId>
  <version>1.0.1</version>
</dependency>

mvn install

Endpunkte

Über die folgenden Endpunkte sind die Funktionalitäten erreichbar :

GET ​/api​/lkz​/kfz​/{kfz} – Read with kfz countrycode

GET​/api​/lkz​/iso3​/{isokz} – Read with Iso316613

GET​/api​/lkz​/iso2​/{isokz} – Read with Iso316612

GET/api​/lkz​/autocomplete​/{laendernameInput} – Read laendername for autocompletion

GET/api​/lkz​/landname​/{laendername} – Read with laendername

Swagger UI für den Zugriff auf die api: /swagger-ui.html

OpenApi 3.0.1 Spec: /v3/api-docs

Responses

Standard Ergebnisresponse mit Länderdaten:

laendernamestringLändername in deutscher Sprache
destatisBEVCodeGebietinteger($int32)
nullable: true
Die Bezeichnung „Destatis BEV-Code“. Hier das Gebiet.
destatisBEVCodeStaatsanginteger($int32)
nullable: true
Die Bezeichnung „Destatis BEV-Code“. Hier die Staatsangehörigkeit.
destatisBEVCodeStaatinteger($int32)
nullable: true
Die Bezeichnung „Destatis BEV-Code“. Hier der Staat.
iso316612string
nullable: true
2 stell. Länderkennzeichen gem. ISO31661
iso316613string
nullable: true
3 stell. Länderkennzeichen gem. ISO31661
iso31661numinteger($int32)
nullable: true
Nummerisches Länderkennzeichen gem. ISO31661
icaostring
nullable: true
Länderkennzeichem gem. ICAO.int
destatisAussenhandelsCodestring
nullable: true
Aussehnhandelscode gem. DESTATIS
kfzKennzeichenstring
nullable: true
KFZ Länderkennzeichen
laenderzusatzAdressFeldPoststring
nullable: true
Länderzusatz für den internationalen Postversand
bankLKZ2string
nullable: true
2 stell LKZ gem der Bundesbank
bankLKZnuminteger($int32)
nullable: true
num LKZ gem der Bundesbank
bankLandkuerzelstring
nullable: true
Landkürzel gem der Bundesbank
bankWaehrungcodestring
nullable: true
Waehrungscode der Bundesbank
datenquellestring

Autocomplete Response

laendernamestring
nullable: true
Laendername found by autocomplete operatio

Fehlernachrichten

errorNointeger($int32)Fehlernummer
errorTextstringFehlertext in prosa
errorTimestampstringZeitstempel zu dem der Fehler auftrat
uniqueIDstringEindeutiger Schlüssel für die Analyse von Fehlern

}

Konfigurationsmöglichkeiten

In der folgenden Application.properties Datei kann man als Anwender entscheiden, ob man eine in Memory Datenbank (Empfehlung) oder eine dateibasierte Datenbank nutzen möchte. Des weiteren könne hier die LogLevel eingestellt werden. Falls Ihr einen SpringBoot Admin nutzen wollt , könnt ihr diesen hier Administrieren.

################################################################################################
##  A U S W A H L   H S Q L M O D U S D E R   D A T E N B A N K 
################################################################################################
## Dateibasiert
#spring.datasource.url=jdbc:hsqldb:file:/lkzdb/lkzdb
## Arbeitsspeicherbasiert
spring.datasource.url=jdbc:hsqldb:mem:lkzdb

################################################################################################
##                  L O G G I N G 
################################################################################################
## Loglevel Config
logging.level.root=error
logging.level.de.oderkerk.tools.lkz=error
logging.level.de.oderkerk.tools.lkz.LkzProviderApplication=info

## Log pattern configuration
# Slf4jMDCFilter.UUID ist eine Log-Variable die eine eindeutige Request ID ausgibt. Diese ID wird in Fehlermeldungen und
# als Response Header zurückgegeben um ein Tracing , sofern ein entsprechendes Loglevel (error nur fehlerlogs , debug mehr infos)
# eingestellt ist 
logging.pattern.console=[%-5p]|%d{ISO8601}[%X{Slf4jMDCFilter.UUID}]%logger{26}|%m%ex%n
logging.pattern.file=[%-5p]|%d{ISO8601}[%X{Slf4jMDCFilter.UUID}]%logger{26}|%m%ex%n
logging.file.name=./target/lkzprovider.log
logging.file.max-size=15MB
logging.file.max-history=3
logging.file.total-size-cap=100MB
logging.register-shutdown-hook=true
logging.exception-conversion-word=%ex

################################################################################################
## Falls Ihr eine Spring Boot atmin nutzt könnt ihr hier die Enstellungen configurieren
################################################################################################
spring.boot.admin.client.url=http://localhost:8081
## Client ein und aussschalten
spring.boot.admin.client.enabled=false
## Anzeige im Dashboard
spring.boot.admin.client.instance.name="Odins LKZ Provider"
## Tag zum Darstellen der Umgebung (Beispiel Test/SYSTEST/PROD oder Server 1, Server 2 ). Die Werte liegen bei dir ;)
spring.boot.admin.client.instance.metadata.tags.environment=PROD
management.endpoint.shutdown.enabled=false
management.endpoint.health.enabled=true
management.endpoint.health.show-details=always
management.endpoint.info.enabled=true
management.endpoint.metrics.enabled=true
management.endpoints.web.exposure.include=* 

################################################################################################
## A B    H I E R     N I C H T     Ä N D E R N  
############################################################################################### 
odin.slf4jfilter.request_header=X-Header-Token
spring.application.name=Odins LKZ Provider
spring.datasource.initialization-mode=always
spring.datasource.username=sa 
spring.datasource.password= 
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.HSQLDialect
spring.jpa.show-sql=false
spring.datasource.sql-script-encoding=UTF-8
spring.data.rest.detection-strategy=visibility

Beispielrequests und Responses

Suche über Ländername

Request:

curl -X GET "http://localhost:8080/api/lkz/landname/Deutschland" -H  "accept: */*"

Response

{
  "laendername": "Deutschland",
  "destatisBEVCodeGebiet": 0,
  "destatisBEVCodeStaatsang": 0,
  "destatisBEVCodeStaat": 0,
  "iso316612": "DE",
  "iso316613": "DEU",
  "iso31661num": 276,
  "icao": "D",
  "destatisAussenhandelsCode": "DE",
  "kfzKennzeichen": "D",
  "laenderzusatzAdressFeldPost": "GERMANY",
  "bankLKZ2": null,
  "bankLKZnum": null,
  "bankLandkuerzel": null,
  "bankWaehrungcode": "EUR",
  "datenquelle": "DatenQuelle: https://www.destatis.de Stand 12.11.2020"
}

Suche über ISO2

Request:

curl -X GET "http://localhost:8080/api/lkz/iso2/VE" -H  "accept: */*"

Response:

{
  "laendername": "Venezuela",
  "destatisBEVCodeGebiet": 367,
  "destatisBEVCodeStaatsang": 367,
  "destatisBEVCodeStaat": 367,
  "iso316612": "VE",
  "iso316613": "VEN",
  "iso31661num": 862,
  "icao": "VEN",
  "destatisAussenhandelsCode": "VE",
  "kfzKennzeichen": "YV",
  "laenderzusatzAdressFeldPost": "VENEZUELA",
  "bankLKZ2": "VE",
  "bankLKZnum": 484,
  "bankLandkuerzel": "Venezu",
  "bankWaehrungcode": "VEF",
  "datenquelle": "DatenQuelle: https://www.destatis.de Stand 12.11.2020"
}

Suche über ISO3

Request:

curl -X GET "http://localhost:8080/api/lkz/iso3/USA" -H  "accept: */*"

Response:

{
  "laendername": "Vereinigte Staaten",
  "destatisBEVCodeGebiet": 368,
  "destatisBEVCodeStaatsang": 368,
  "destatisBEVCodeStaat": 368,
  "iso316612": "US",
  "iso316613": "USA",
  "iso31661num": 840,
  "icao": "USA",
  "destatisAussenhandelsCode": "US",
  "kfzKennzeichen": "USA",
  "laenderzusatzAdressFeldPost": "UNITED STATES OF AMERICA",
  "bankLKZ2": "US",
  "bankLKZnum": 400,
  "bankLandkuerzel": "USA",
  "bankWaehrungcode": "USD",
  "datenquelle": "DatenQuelle: https://www.destatis.de Stand 12.11.2020"
}

Suche über KFZ Länderkennzeichen

Request:

curl -X GET "http://localhost:8080/api/lkz/kfz/F" -H  "accept: */*"

Response:

[
  {
    "laendername": "Frankreich",
    "destatisBEVCodeGebiet": 129,
    "destatisBEVCodeStaatsang": 129,
    "destatisBEVCodeStaat": 129,
    "iso316612": "FR",
    "iso316613": "FRA",
    "iso31661num": 250,
    "icao": "FRA",
    "destatisAussenhandelsCode": "FR",
    "kfzKennzeichen": "F",
    "laenderzusatzAdressFeldPost": "FRANCE",
    "bankLKZ2": "FR",
    "bankLKZnum": 1,
    "bankLandkuerzel": "Frankr",
    "bankWaehrungcode": "EUR",
    "datenquelle": "DatenQuelle: https://www.destatis.de Stand 12.11.2020"
  },
  {
    "laendername": "Französisch-Guayana",
    "destatisBEVCodeGebiet": 315,
    "destatisBEVCodeStaatsang": 129,
    "destatisBEVCodeStaat": 129,
    "iso316612": "GF",
    "iso316613": "GUF",
    "iso31661num": 254,
    "icao": "GUF",
    "destatisAussenhandelsCode": "FR",
    "kfzKennzeichen": "F",
    "laenderzusatzAdressFeldPost": "FRANCE",
    "bankLKZ2": "FR",
    "bankLKZnum": 1,
    "bankLandkuerzel": "Frankr",
    "bankWaehrungcode": "EUR",
    "datenquelle": "DatenQuelle: https://www.destatis.de Stand 12.11.2020"
  },
  {
    "laendername": "Französisch-Polynesien",
    "destatisBEVCodeGebiet": 528,
    "destatisBEVCodeStaatsang": 129,
    "destatisBEVCodeStaat": 129,
    "iso316612": "PF",
    "iso316613": "PYF",
    "iso31661num": 258,
    "icao": "PYF",
    "destatisAussenhandelsCode": "PF",
    "kfzKennzeichen": "F",
    "laenderzusatzAdressFeldPost": "FRENCH POLYNESIA",
    "bankLKZ2": "PF",
    "bankLKZnum": 822,
    "bankLandkuerzel": "F Poly",
    "bankWaehrungcode": "XPF",
    "datenquelle": "DatenQuelle: https://www.destatis.de Stand 12.11.2020"
  },
  {
    "laendername": "Französische Süd- und Antarktisgebiete",
    "destatisBEVCodeGebiet": 542,
    "destatisBEVCodeStaatsang": 129,
    "destatisBEVCodeStaat": 129,
    "iso316612": "TF",
    "iso316613": "ATF",
    "iso31661num": 260,
    "icao": "ATF",
    "destatisAussenhandelsCode": "TF",
    "kfzKennzeichen": "F",
    "laenderzusatzAdressFeldPost": "FRANCE",
    "bankLKZ2": "TF",
    "bankLKZnum": 894,
    "bankLandkuerzel": "F Sued",
    "bankWaehrungcode": "EUR",
    "datenquelle": "DatenQuelle: https://www.destatis.de Stand 12.11.2020"
  },
  {
    "laendername": "Neukaledonien",
    "destatisBEVCodeGebiet": 513,
    "destatisBEVCodeStaatsang": 129,
    "destatisBEVCodeStaat": 129,
    "iso316612": "NC",
    "iso316613": "NCL",
    "iso31661num": 540,
    "icao": "NCL",
    "destatisAussenhandelsCode": "NC",
    "kfzKennzeichen": "F",
    "laenderzusatzAdressFeldPost": "NEW CALEDONIA",
    "bankLKZ2": "NC",
    "bankLKZnum": 809,
    "bankLandkuerzel": "Neukal",
    "bankWaehrungcode": "XPF",
    "datenquelle": "DatenQuelle: https://www.destatis.de Stand 12.11.2020"
  },
  {
    "laendername": "Réunion",
    "destatisBEVCodeGebiet": 214,
    "destatisBEVCodeStaatsang": 129,
    "destatisBEVCodeStaat": 129,
    "iso316612": "RE",
    "iso316613": "REU",
    "iso31661num": 638,
    "icao": "REU",
    "destatisAussenhandelsCode": "FR",
    "kfzKennzeichen": "F",
    "laenderzusatzAdressFeldPost": "FRANCE",
    "bankLKZ2": "FR",
    "bankLKZnum": 1,
    "bankLandkuerzel": "Frankr",
    "bankWaehrungcode": "EUR",
    "datenquelle": "DatenQuelle: https://www.destatis.de Stand 12.11.2020"
  },
  {
    "laendername": "St. Martin (französischer Teil)",
    "destatisBEVCodeGebiet": 331,
    "destatisBEVCodeStaatsang": 129,
    "destatisBEVCodeStaat": 129,
    "iso316612": "MF",
    "iso316613": "MAF",
    "iso31661num": 663,
    "icao": "MAF",
    "destatisAussenhandelsCode": "FR",
    "kfzKennzeichen": "F",
    "laenderzusatzAdressFeldPost": "FRANCE",
    "bankLKZ2": "FR",
    "bankLKZnum": 1,
    "bankLandkuerzel": "Frankr",
    "bankWaehrungcode": "EUR",
    "datenquelle": "DatenQuelle: https://www.destatis.de Stand 12.11.2020"
  },
  {
    "laendername": "St. Pierre und Miquelon",
    "destatisBEVCodeGebiet": 338,
    "destatisBEVCodeStaatsang": 129,
    "destatisBEVCodeStaat": 129,
    "iso316612": "PM",
    "iso316613": "SPM",
    "iso31661num": 666,
    "icao": "SPM",
    "destatisAussenhandelsCode": "PM",
    "kfzKennzeichen": "F",
    "laenderzusatzAdressFeldPost": "FRANCE",
    "bankLKZ2": "PM",
    "bankLKZnum": 408,
    "bankLandkuerzel": "Pierre",
    "bankWaehrungcode": "EUR",
    "datenquelle": "DatenQuelle: https://www.destatis.de Stand 12.11.2020"
  },
  {
    "laendername": "Wallis und Futuna",
    "destatisBEVCodeGebiet": 520,
    "destatisBEVCodeStaatsang": 129,
    "destatisBEVCodeStaat": 129,
    "iso316612": "WF",
    "iso316613": "WLF",
    "iso31661num": 876,
    "icao": "WLF",
    "destatisAussenhandelsCode": "WF",
    "kfzKennzeichen": "F",
    "laenderzusatzAdressFeldPost": "FRANCE",
    "bankLKZ2": "WF",
    "bankLKZnum": 811,
    "bankLandkuerzel": "Wallis",
    "bankWaehrungcode": "XPF",
    "datenquelle": "DatenQuelle: https://www.destatis.de Stand 12.11.2020"
  }
]

Erste lokale Performance Messungen

Kleines Länderdatentool