
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:

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:
laendername | stringLändername in deutscher Sprache |
destatisBEVCodeGebiet | integer($int32) nullable: trueDie Bezeichnung „Destatis BEV-Code“. Hier das Gebiet. |
destatisBEVCodeStaatsang | integer($int32) nullable: trueDie Bezeichnung „Destatis BEV-Code“. Hier die Staatsangehörigkeit. |
destatisBEVCodeStaat | integer($int32) nullable: trueDie Bezeichnung „Destatis BEV-Code“. Hier der Staat. |
iso316612 | string nullable: true2 stell. Länderkennzeichen gem. ISO31661 |
iso316613 | string nullable: true3 stell. Länderkennzeichen gem. ISO31661 |
iso31661num | integer($int32) nullable: trueNummerisches Länderkennzeichen gem. ISO31661 |
icao | string nullable: trueLänderkennzeichem gem. ICAO.int |
destatisAussenhandelsCode | string nullable: trueAussehnhandelscode gem. DESTATIS |
kfzKennzeichen | string nullable: trueKFZ Länderkennzeichen |
laenderzusatzAdressFeldPost | string nullable: trueLänderzusatz für den internationalen Postversand |
bankLKZ2 | string nullable: true2 stell LKZ gem der Bundesbank |
bankLKZnum | integer($int32) nullable: truenum LKZ gem der Bundesbank |
bankLandkuerzel | string nullable: trueLandkürzel gem der Bundesbank |
bankWaehrungcode | string nullable: trueWaehrungscode der Bundesbank |
datenquelle | string |
Autocomplete Response
laendername | string nullable: trueLaendername found by autocomplete operatio |
Fehlernachrichten
errorNo | integer($int32)Fehlernummer |
errorText | stringFehlertext in prosa |
errorTimestamp | stringZeitstempel zu dem der Fehler auftrat |
uniqueID | stringEindeutiger 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
