Beschreibung der Schnittstelle
Automatische Übertragung von Stellenanzeigen
1. Schnittstellen-Beschreibung
Stellenanzeigen können durch eine REST-Schnittstelle automatisch übertragen werden. Um die Schnittstelle benutzen zu können, muss zunächst eine vertragliche Zusammenarbeit abgeschlossen werden. Für die vertraglichen Bedingungen kontaktieren Sie bitte unseren Vertrieb: Tel. +49 231 / 914488-77 oder senden Sie uns eine Nachricht.
Anschließend wird ein Benutzerkonto freigeschaltet, mit dem über eine REST-Schnittstelle die Stellenanzeige übertragen werden kann.
1.1. Die REST-Schnittstelle
Die Schnittstelle basiert aus einfachen HTTP-Post und -Get-Request-Aufrufen. Dabei werden - sofern notwendig - im Body des Requests die notwendigen Daten als JSON kodiert übertragen. Das Ergebnis liegt ebenfalls als JSON zurück. Es wird keine detailierte Fehlerbeschreibung zurückgeliefert, da in der Regel diese erfahrungsgemäß nicht ausgewertet werden. In dem folgenden Beispiel wird das Tool curl und jq eingesetzt. Es kann natürlich jeder beliebiger HTTP-Client in beliebiger Sprache verwendet werden.
1.2. Der Übertragungsworkflow
Zur Übertragung einer Anzeige sind mehrere Aufrufe notwendig. Im ersten Aufruf meldet man sich mit dem Schnittstellen-Account an. Diesen Account erhält man nach der vertraglichen Vereinbarung. Dazu gibt es auch ein Passwort. Mit den Anmeldedaten werden auch die Daten der Stellenanzeigen übertragen. Das ganze Paket wird als JSON in UTF-8 mit UNIX-LF übertragen. Optional kann man anschließend Anhänge (z.B. für HTML-Anzeigen die Bilder, CSS-Resourcen etc) sukzessiv hochladen. Liegen alle Informationen vor, so kann der Übertragungsworkflow durch einen abschließenden Request fertiggestellt werden. Die Anzeige liegt nun im System vor und wird für die Öffentlichung weiter verarbeitet.
2. Initialisierungsaufruf
Im ersten Auruf wird ein POST-Request mit dem Content-Type
vom Typ application/json
gesendet. D.h. im Body des Requests befindet sich ein JSON-Objekt.
Das JSON-Objekt hat folgenden Aufbau:
{ "account" : { "email" : "info@test-name.vivai.de", "pw" : "geheimes-passwort" }, "job" : { "title": "Facharzt für Dortmund", "ref": "Optionale Referenznummer", "message": "Optionale Nachrichten, Infos, Hinweise", "employer" : { "name" : "Name des Arbeitgebers" "address": { "street": "Straße des Arbeitgebers" "city" : "Ort des Arbeitgebers", "zip" : "PLZ des Arbeitergebers", "country": "DE" }, "contact" : { "fax" : "0231 / 914488-00", "telephone" : "0231 / 914488-77", "email" : "info@kliniken.de" } }, "contact" : { "name" : "Herr Mustermann", "contact" : { "fax" : "0231 / 914488-00", "telephone" : "0231 / 914488-77", "email" : "info@kliniken.de" } }, "location" : { "countryCode" : "DE", "zip" : "44137", "city" : "Dortmund" }, "description" : { "area" : "Ärztin/Arzt", "domain" : "Allgemeinmedizin", "level" : "Chefarzt", "hiringType" : "Befristete Stelle", "jobScope" : "Vollzeit", "plainText": "Dies ist nun die Beschreibung der Anzeige als reinen Text!", "firstDay" : "2017-01-20T12:00:00Z", "onlineApplicants" : true } } }
2.1. account
"account" : { "email" : "info@test-name.vivai.de", "pw" : "geheimes-passwort" }
Hier werden in den Feldern email
und pw
mit den bereitgestellten Daten gefüllt.
2.2. job
"title": "Facharzt für Dortmund", "ref": "Optionale Referenznummer", "message": "Optionale Nachrichten, Infos, Hinweise", "employer" : { }, "contact" : { }, "location" : { }, "description" : { }
Hier werden die einzeln Job-Informationen detailiert festgelegt:
title
: Stellenbezeichnungref
, optional: Referenz-Informationen, die z.B. bei Bewerbungen angegeben werden soll.message
, optional: Nachricht oder Hinweise an die Mitarbeiter, die die Anzeige weiterverarbeiten.employer
, optional: Arbeiter-Informationencontact
: Kontaktperson für diese Stellenanzeigelocation
: Einsatzort mit unterschiedlichen Ortsangabendescription
: Weitere Beschreibung der Stellenanzeige
2.2.1. employer
Hier können optional Angaben über den Arbeitgeber geliefert werden. In einigen Fällen ist dies jedoch nicht gewünscht, daher kann dieses Feld komplett weggelassen werden. Soll der Arbeitgeber angezeigt werden, dann wird der Arbeitergeber wie folgt angegeben:
{ "name" : "Name des Arbeitgebers" "address": { "street": "Straße des Arbeitgebers" "city" : "Ort des Arbeitgebers", "zip" : "PLZ des Arbeitergebers", "country": "DE" }, "contact" : { "fax" : "0231 / 914488-00", "telephone" : "0231 / 914488-77", "email" : "info@kliniken.de" } }
name
: Der Name des Arbeitgebersaddress
: Anschrift des Arbeitgeberscontact
: Kontaktdaten des Arbeitgebers
2.2.1.1. address
Beschreibung der Anschrift des Arbeitgebers:
street
: Straßecity
: Ortzip
: PLZcountry
: Ländercode, z.B. DE für Deutschland (Wikipedia)
2.2.1.2. contact
Kontaktdaten des Arbeitgebers. Diese Angaben können auch vollständig entfallen.
fax
, optional: Fax-Nummer des Arbeitgeberstelephone
, optional: Telefonnnummer des Arbeitgebersemail
, optional: E-Mail-Adresse des Arbeitgebers
2.2.2. contact
Die Kontaktperson der Stellenanzeige:
{ "name" : "Herr Mustermann", "contact" : { "fax" : "0231 / 914488-00", "telephone" : "0231 / 914488-77", "email" : "info@kliniken.de" } }
name
: Name der Kontaktpersoncontact
: Kontaktdaten
2.2.2.1. contact
Kontaktdaten der Kontaktperson. Diese Angaben können auch vollständig entfallen.
fax
, optional: Fax-Nummer der Kontaktpersontelephone
, optional: Telefonnnummer der Kontaktpersonemail
, optional: E-Mail-Adresse der Kontaktperson
2.2.3. Location
Beschreibung des Einsatzortes. Wird für mehrere Orte gesucht, dann wird das Feld
zip
frei gelassen und in city
werden die Orte, jeweils durch ein Komma
und Leerzeichen getrennt, eingetragen. Alternativ können auch die ersten Ziffern einer Postleitzahl
verwenden, um mehrere Orte zu erfassen. Die Orte, deren Postleitzahl mit der Eingabe beginnen,
werden als Einsatzort verwendet. Dann wird natürlich city
nicht befüllt.
{ "countryCode" : "DE", "zip" : "44137", "city" : "Dortmund" }
countryCode
: Ländercode (Wikipedia)zip
, optional: ‘44137’ oder auch ‘44’city
, optional: ‘Dortmund’ oder auch ‘Recklinghausen, Dorsten, Marl, Herne’
2.2.4. description
Eine detailierte Beschreibung der Stellenanzeige. Der individuelle Inhalt der Anzeige kann als reinen Text oder als HTML übertragen werden. Bei HTML werden in der Regel noch andere Ressourcen wie Bilder und CSS-Anweisungen benötigt. Diese können als Anhang hochgeladen werden. Das Hochladen erfolgt durch weitere Aufrufe des REST-Schnittstelle.
{ "area" : "Ärztin/Arzt", "domain" : "Allgemeinmedizin", "level" : "Chefarzt", "hiringType" : "Befristete Stelle", "jobScope" : "Vollzeit", "plainText": "Dies ist nun die Beschreibung der Anzeige als reinen Text!", "firstDay" : "2017-01-20T12:00:00Z", "onlineApplicants" : true } }
area
, optional: Berufsfelddomain
, optional: Berufsbereichlevel
, optional: HierarchiestufehiringType
, optional: AnstellungsformjobScope
, optional: StellenumfangfirstDay
, optional: Antrittsdatum, wird es weggelassen, ist das Antrittsdatum ‘sofort’, ansonsten wird ein Wert im folgenden Format erwartet: yyyy-MM-ddTHH:mm:ssZ, Beispiel: 2017-01-20T12:00:00ZonlineApplicants
, boolescher Wert: Online-Bewerbungen sind möglichplainText
, optional: Inhalt der Stellenanzeige als reinen Text oder als HTML-Text
Berufsfeld, Berufsbereich und Hierarchiestufe sind in Kliniken vorgegeben. Diese Angaben dienen nur als Information, da die korrekte Einordnung die Schnittstelle unnötigt verkompliziert. Diese Werte werden daher vom Mitarbeiter festgelegt.
2.2.4.1 hiringType
Folgende Werte sind möglich:
- “Keine Angaben”
- “Befristete Stelle”
- “Festanstellung”
- “Freie Mitarbeit”
- “Selbstständig”
- “Praktikum”
- “Ausbildungsplatz”
2.2.4.2 jobScope
Folgende Werte sind möglich:
- “Keine Angaben”
- “Aushilfe”
- “Teilzeit”
- “Vollzeit”
- “Vollzeit/Teilzeit”
In der Datei ‘data.json’ befindet sich nun der oben beschriebene JSON-Inhalt mit den gewünschten Daten. Dann erfolgt der Aufruf mit curl wie folgt:
curl -X POST -H "Content-Type:application/json" -d @data.json https://jobs.kliniken.de/api/job/create
Das Ergebnis ist im positiven Fall:
{ "result":"ok", "id":"58089674d3fa73a0a457b72c" }
Wir erhalten ein ok
im Feld result
und eine id
.
Diese ID wird nun für die folgenden REST-Aufrufe benötigt.
Wenn man die Schnittstelle zunächst testen möchte, dann kann man das machen, in dem man eine andere URL verwendet. In diesem Fall wird die Übertragung nicht weitergeleitet und verarbeitet. Die restlichen Aufrufe folgen in gewohnter Weise. Nur der erste Aufruf muss mit einer anderen URL aufgerufen werden:
curl -X POST -H "Content-Type:application/json" -d @data.json https://jobs.kliniken.de/api/job/test
3. Anhänge hochladen
Optional können Anhänge hochgeladen werden. Dazu werden die Dateien einzeln und nacheinander hochgeladen. Es werden nur Bilder, Texte und PDF-Dokumente unterstützt. Archive können nicht hochgeladen werden. Das Hochladen erfolgt in zwei Schritten. Im ersten Schritt der wird Upload mit Namen und Mime-Typ angekündigt und als Ergebnis wird eine weitere ID zurückgeliefert. Im zweiten Schritt wird die Datei hochgeladen.
3.1 Anhang ankündigen
Dazu wird ein JSON-Objekt mit dem folgenden Aufbau übermittelt:
{ "filename": "message.txt", "mimeType": "text/plain" }
filename
:Der Dateiname der Datei.mimeType
:Der Mime-Type der hochzuladenen Datei. (Übersicht)
In der Datei ‘attachment.json’ befindet sich nun der oben beschriebene JSON-Inhalt mit den gewünschten Daten. Dann erfolgt der Aufruf mit curl wie folgt. Wir geben die ID (58089674d3fa73a0a457b72c) zusätzlich zur URL an:
curl -X POST -H "Content-Type:application/json" -d @attachment.json https://jobs.kliniken.de/api/job/prepare-upload/58089674d3fa73a0a457b72c
Das Ergebnis ist im positiven Fall:
{ "result":"UFNUTUNWBN" }
Wir haben nun zwei IDs, mit denen wir nun die Ressource hochladen können:
3.2 Anhang hochladen
Die Datei ‘message.txt’ ist die angekündigte Ressource. Wir geben zusätzlich die beiden IDs (58089674d3fa73a0a457b72c und UFNUTUNWBN) in der URL an. Dann erfolgt der Aufruf mit curl wie folgt.
curl -X POST -H "Content-Type:text/plain" --data-binary @message.txt https://jobs.kliniken.de/api/job/upload/58089674d3fa73a0a457b72c/UFNUTUNWBN
Das Ergebnis ist im positiven Fall:
{ "result":"ok" }
Für weitere Anhänge werden beide Schritte nacheinander wiederholt! Natürlich gibt es für die angekündigten Ressourcen stets eine neue ID.
4. Abschluß
Wenn alle Ressourcen hochgeladen wurden, kann die Verarbeitung abgeschlossen werden. Damit ist die Stellenanzeige erfolgreich übertragen worden und befindet sich somit in weiterer Verarbeitung.
Wir geben die ID (58089674d3fa73a0a457b72c) zusätzlich zur URL an, um die Übertragung abzuschließen:
curl -X GET https://jobs.kliniken.de/api/job/publish/58089674d3fa73a0a457b72c
Das Ergebnis ist im positiven Fall:
{ "result":"ok" }
5 Fehlerfälle
Führt ein Aufruf zu einem beliebigen Fehler, dann wird dieser ohne nähere Angaben mit folgenden Ergebnis quitiert:
{ "result":"error" }
Beispiel als Shell-Script
#!/bin/bash # # curl: https://curl.haxx.se # jq: https://stedolan.github.io/jq/ # JOBID=$(curl -X POST -H "Content-Type:application/json" -d @data.json https://jobs.kliniken.de/api/job/create | jq -r '.id') ATTID=$(curl -X POST -H "Content-Type:application/json" -d @attachment.json https://jobs.kliniken.de/api/job/prepare-upload/$JOBID | jq -r '.result') curl -X POST -H "Content-Type:text/plain" --data-binary @message.txt https://jobs.kliniken.de/api/job/upload/$JOBID/$ATTID curl -X GET http://localhost:8086/api/job/publish/$JOBID echo $JOBID echo $ATTID
Zwei Beispiele zum Aufbau des JSON-Objektes:
{ "account" : { "email" : "info@test-name.vivai.de", "pw" : "geheimes-passwort" }, "job" : { "title": "Facharzt für Dortmund", "contact" : { "name" : "Herr Mustermann", } "location" : { "countryCode" : "DE" }, "description" : { "hiringType" : "Befristete Stelle", "jobScope" : "Vollzeit", "onlineApplicants" : true } } }
{ "account" : { "email" : "info@test-name.vivai.de", "pw" : "geheimes-passwort" }, "job" : { "title": "Facharzt für Dortmund", "employer" : { "name" : "Name des Arbeitgebers" "address": { "street": "Betenstraße 13-15" "city" : "Dortmund", "zip" : "44137", "country": "DE" }, }, "contact" : { "name" : "Herr Mustermann", }, "location" : { "countryCode" : "DE", "city" : "Dortmund, Marl, Recklinghausen" }, "description" : { "hiringType" : "Befristete Stelle", "jobScope" : "Vollzeit", "plainText": "Dies ist nun die Beschreibung der Anzeige als reinen Text!", "firstDay" : "2017-01-01T12:00:00Z", "onlineApplicants" : true } } }