GOV/Webservice: Unterschied zwischen den Versionen

aus GenWiki, dem genealogischen Lexikon zum Mitmachen.
< GOV
Zur Navigation springen Zur Suche springen
K (→‎Kompatibilität: + Axis 2.0)
(Straffung)
 
(43 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Über mehrere Webserivces erhält man praktische den gleichen Zugriff auf die Daten des GOV, wie ihn auch das Webfrontend bietet.
[[GOV|GOV-Hauptseite]] > [[GOV/Projekt]] > '''GOV-Webservice'''


== Dienste ==
{{Projektbox GOV}}
Welche Dienste werden von den Webservices zur Verfügung gestellt? Es gibt drei verschiedenen Webserivces:
 
* SimpleService - als Suchergebnis werden Listen mit GOV-Kennungen zurückgeliefert
== Zweck ==
* ComplexService - als Suchergebnis werden Listen zurückgeliefert, die die Objekte selbst enthalten
Über Webservices erhält man einen maschinellen Zugriff auf die Daten des GOV, der inhaltlich dem Zugriff über das Webfrontend entspricht. Mit Webservices kann beispielsweise ein geübter Programmierer die Informationen aus GOV in ein genealogisches Programm einbinden. Für das Programm [[webtrees]] ist beispielsweise ein entsprechendes [[Webtrees Handbuch/Anleitung für Webmaster/Erweiterungsmodule|Erweiterungsmodul]] verfügbar ("[[Webtrees Handbuch/Anleitung für Webmaster/Erweiterungsmodule/vesta gov4webtrees|vesta gov4webtrees]]").
 
Die GOV-Webservices erfordern keine Authentifizierung.
 
== Lizenz ==
{|cellspacing="8" cellpadding="0" style="width:80%; clear:both; margin:0.5em auto; background-color:#f9f9f9; border:2px solid #e0e0e0;"
| style="width:90px;text-align:center;" | [[Image:CC some rights reserved.svg|90px|Creative Commons License]]<br/>[[Image:Cc-by new white.svg|24px|Creative Commons Attribution icon]][[Datei:Cc-sa_white.svg|24px|Creative Share Alike icon]]
| Das GOV darf unter den Bedingungen der [http://creativecommons.org/licenses/by-sa/4.0/deed.de Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 4.0 International (CC BY-SA 4.0)] Lizenz verwendet werden.
|}
 
== REST API ==
Mit einem einfachen Web-Aufruf kann man per REST<ref>{{Wikipedia-Link|Representational State Transfer}}</ref> in JSON<ref>{{Wikipedia-Link|JSON}}</ref> dargestellte Informationen zu einer GOV-ID abfragen.
* ''information=position&<GOV-ID>'' liefert die geografische Position einen Ortes: http://gov.genealogy.net/api?information=position&id=SCHERGJO54EJ
* ''information=name&<GOV-ID>'' liefert den Namen zu einer GOV-ID: http://gov.genealogy.net/api?information=name&id=SCHERGJO54EJ
* Bei Orten mit Namen in mehreren Sprachen kann zusätzlich mit dem ''lang''-Parameter die gewünschte Sprache angegeben werden: http://gov.genealogy.net/api?information=name&id=KETORFJO70XW&lang=pol
* ''information=data'' liefert die kompletten Informationen in JSON: http://gov.genealogy.net/api?information=data&id=SCHERGJO54EJ
 
Formale Dokumentation aller Parameter nach dem '=' in ''information='' siehe https://gov-dev.genealogy.net/swagger-ui/index.html.
 
== SOAP API ==
Es gibt drei SOAP-Webservices<ref>:{{Wikipedia-Link|SOAP}}</ref>
* SimpleService - als Suchergebnis werden Listen mit GOV-Kennungen zurück geliefert
* ComplexService - als Suchergebnis werden Listen zurück geliefert, die die Objekte selbst enthalten
* ChangeService - mit diesem Dienst können Daten im GOV verändert werden
* ChangeService - mit diesem Dienst können Daten im GOV verändert werden
Unter Listen sind hier XML-Strukturen zu verstehen, die mit beschreibenden Tags versehen sind. Die Bedeutung der Tags entspricht der englischen Bedeutung der korrespondierenden [[GOV/Quicktext|Quicktext]]-Elemente.
Weitere Dokumentation im genealogy.net Forum: http://forum.genealogy.net/?page=Thread&postID=389371


=== Lesezugriff ===
=== Lesezugriff ===
Die vom SimpleService und ComplexService zur Verfügung gestellten Funktionen sind (bis auf die Art des Rückgabewert) identisch, so dass sie hier gemeinsam beschrieben werden.
Die vom SimpleService und ComplexService zur Verfügung gestellten Funktionen sind (bis auf die Art des Rückgabewertes) identisch, so dass sie hier gemeinsam beschrieben werden.
;checkObjectId: prüft, ob eine Objektkennung gültig ist. Wenn die abgefragte Objektkennung durch eine andere ersetzt wurde, wird die neue Kennung zurückgeliefert. Wird ein leerer String zurückgeliefert, ist die Objektkennung ungültig.
;checkObjectId: prüft, ob eine Objektkennung gültig ist. Wenn die abgefragte Objektkennung durch eine andere ersetzt wurde, wird die neue Kennung zurückgeliefert. Wird ein leerer String zurückgeliefert, ist die Objektkennung ungültig.
;getArchive: lädt ein Archiv-Objekt
;getArchive: lädt ein Archiv-Objekt
;getChildObjects
;getChildObjects: untergeordnete Objekte
;getNameAtDate: Name eines Objektes zu einem anzugebenden Datum in einer anzugebenden Sprache
;getNameAtDate: Name eines Objektes zu einem anzugebenden Datum in einer anzugebenden Sprache
;getObject: lädt ein Ort-Objekt
;getObject: lädt ein Ort-Objekt
;getObjectByExternalId: Suche nach Objekt(en) mit Systemkürzel der externen Kennung und Referenznummer
;getParentObjectWithTypeAtDate:
;getPositions:
;getRecordsForObject
;getRecordsForObject
;getSource: lädt ein Quellen-Objekt
;getSource: lädt ein Quellen-Objekt
Zeile 19: Zeile 48:
;lookupObject: für FOKO
;lookupObject: für FOKO
;searchByBoundingBox: sucht Orte, die innerhalb einer geographischen Region liegen. Parameter: Breite der einen Ecke, Breite der anderen Ecke, Länge der einen Ecke, Länge der anderen Ecke
;searchByBoundingBox: sucht Orte, die innerhalb einer geographischen Region liegen. Parameter: Breite der einen Ecke, Breite der anderen Ecke, Länge der einen Ecke, Länge der anderen Ecke
;searchByName: Suche Orte anhand ihres Namens (wie die Suche im Frontend)
;searchByName: Suche Orte anhand ihres Namens (wie die einfache Suche im Frontend)
;searchDescendantsByName
;searchByNameAndType:
;searchDescendantsByName1
;searchDescendantsByName: Suche nach untergeordneten Objekten nach Name zu einer übergeordenten ID
;searchDescendantsByType1
;searchDescendantsByNameLanguage:
;searchRelatedByName
;searchDescendantsByType: Suche nach untergeordneten Objekten nach Typ zu einem übergeordneten Namen
Die Beschreibung der Funktionen (wsdl:message) mit ihren Parametern (wsdl:part) wird beim Aufruf des jeweiligen Services im Browser angezeigt.
;searchDescendantsByTypeAtDate:
;searchRelatedByName: Suche nach über-/untergeordneten Objekten nach Name
Die Beschreibung der Funktionen (wsdl:message) mit ihren Parametern (wsdl:part) wird beim Aufruf des jeweiligen Services im Browser angezeigt, z.B. https://gov.genealogy.net/services/ComplexService?wsdl


== Schreibzugriff ==
=== Schreibzugriff ===
Der Schreibzugriff ist relativ übersichtlich, der beinhaltet drei Operationen zum Speichern von Orten, Quellen und Archiven. Als erster Parameter wird das zu speichernde Objekt übergeben, der zweite und dritte Parameter sind Benutzernamen und Paßwort des Bearbeiters.
Der Schreibzugriff beinhaltet Operationen zum Speichern von Orten, Quellen und Archiven. Als erster Parameter wird das zu speichernde Objekt übergeben, der zweite und dritte Parameter sind Benutzername und Passwort des Bearbeiters.
* saveObject
* saveObject
* saveSource
* saveSource
* saveArchive
* saveArchive


== Kompatibilität ==
=== Kompatibilität ===
Mit folgenden Frameworks wurde der GOV-Webserivce getestet:
Mit folgenden Frameworks wurde der GOV-Webserivce getestet:


Zeile 60: Zeile 91:
  | [[Benutzer:PLingnau|PLingnau]]
  | [[Benutzer:PLingnau|PLingnau]]
  |-
  |-
  |PHP 5
  |PHP 5 und 7
  |[[Bild:True.png]]
  |[[Bild:True.png]]
  |
  |
Zeile 71: Zeile 102:
  | bei mir hat es nur mit einfachen Rückgabewerten funktioniert
  | bei mir hat es nur mit einfachen Rückgabewerten funktioniert
  | [[Benutzer:Jzedlitz|Jzedlitz]]
  | [[Benutzer:Jzedlitz|Jzedlitz]]
|-
|Python 3.9 Suds
|[[Bild:True.png]]
|
| nur das Lesen getestet.
| [[Benutzer:PLingnau|PLingnau]]
  |}
  |}


== Client ==
=== Client ===
=== PHP 5 ===
==== PHP 5 ====
Mit PHP 5 ist ein Client für den GOV-Webservice ganz schnell geschrieben:
Mit PHP 5 ist ein Client für den SOAP-Webservice ganz schnell geschrieben:
<php><?php
<syntaxhighlight lang="php"><?php
$soapclient = new SoapClient('http://gov.genealogy.net/services/ComplexService?wsdl');
$soapclient = new SoapClient('https://gov.genealogy.net/services/ComplexService?wsdl');
$list =$soapclient->searchByName(utf8_encode('Heidkate'));
$list =$soapclient->searchByName(utf8_encode('Heidkate'));
/* Ausgabe des Arrays */
/* Ausgabe des Arrays */
Zeile 83: Zeile 120:
print_r($list);
print_r($list);
echo "</pre>";
echo "</pre>";
?></php>
?></syntaxhighlight>
Ja, das ist alles! :-)
 
==== PHP 7 ====
Falls der SOAP-Client nicht automatisch installiert ist, muss ein Paket nachinstalliert werden:
<source lang="bash">sudo apt-get install php-soap</source>
 
Aufgrund der besseren Unicode-Unterstützung ist der Aufruf noch etwas einfacher geworden:
<syntaxhighlight lang="php"><?php
$soapclient = new SoapClient('https://gov.genealogy.net/services/ComplexService?wsdl');
$list =$soapclient->searchByName('Heidkate');
/* Ausgabe des Arrays */
echo "<pre>";
print_r($list);
echo "</pre>";
?></syntaxhighlight>


=== Axis 1.3, Axis 1.4 ===
==== Axis 1.3, Axis 1.4 ====
WSDL2Java hat Probleme mit dem Element-Namen "last-modification". Komischerweise funktioniert es richtig, wenn man WSDL2Java die Option "-w" mitgibt.
WSDL2Java hat Probleme mit dem Element-Namen "last-modification". Komischerweise funktioniert es richtig, wenn man WSDL2Java die Option "-w" mitgibt.


Generieren der Java-Klassen:  
Generieren der Java-Klassen:  
  java org.apache.axis.wsdl.WSDL2Java -w http://gov.genealogy.net/services/ComplexService?wsdl
  java org.apache.axis.wsdl.WSDL2Java -w https://gov.genealogy.net/services/ComplexService?wsdl


Ein kleiner Test-Client:
Ein kleiner Test-Client:
<java>import net.genealogy.gov.ws.ComplexService_PortType;
<syntaxhighlight lang="java">import net.genealogy.gov.ws.ComplexService_PortType;
import net.genealogy.gov.ws.ComplexService_ServiceLocator;
import net.genealogy.gov.ws.ComplexService_ServiceLocator;


Zeile 103: Zeile 153:
         cs.searchByName("Heidkate");
         cs.searchByName("Heidkate");
     }
     }
}</java>
}</syntaxhighlight>


=== Python ZSI 1.7.0 ===
==== Python Zeep ====
So richtig stabil scheint das noch nicht zu sein, mehr als einfache Rückgabewerte (einzelne Texte) habe ich nicht empfangen können.
Für Python gibt es den SOAP-Client [https://python-zeep.readthedocs.io/en/master/ Zeep]. Unter Ubuntu lässt er sich so installieren:
<syntaxhighlight lang="bash">sudo apt-get install python3-zeep</syntaxhighlight>


Zunächst muß man sich Python Quellcode generieren:
Der Aufruf sieht dann folgendermaßen aus:
<bash>wsdl2py -u http://gov.genealogy.net/services/SimpleService?wsdl</bash>
Dadurch bekommt man zwei Dateien:
* SimpleServiceImpl_services.py
* SimpleServiceImpl_services_types.py


Ein Client (hier zum Überprüfen einer GOV-Kennung) sieht dann z.B. so aus:
<syntaxhighlight lang="python">
<python>from SimpleServiceImpl_services import *
from zeep import Client
client = Client('https://gov.genealogy.net/services/ComplexService?wsdl')
result = client.service.getObject('SCHERGJO54EJ')
print(result)
</syntaxhighlight>


loc = SimpleServiceImplLocator()
Möchte man eine Liste von Zahlen als Parameter übertragen, dann geht das so.
proxy = loc.getSimpleServiceImplPortType()


request = checkObjectIdRequestWrapper()
<syntaxhighlight lang="python">
request._itemId= "SCHERGJO54EJ"
from zeep import Client
response = proxy.checkObjectId(request)
client = Client('http://gov.genealogy.net/services/SimpleService?wsdl')
print response._out</python>
emptyArrayPlaceholder = client.get_type('{http://gov.genealogy.net/ws}ArrayOfInt')
interesting_types = emptyArrayPlaceholder()
interesting_types['int'].append(32)
interesting_types['int'].append(36)
interesting_types['int'].append(53)
result = client.service.getParentObjectWithTypeAtDate('SCHERGJO54EJ',interesting_types,2418703)
print(result)</syntaxhighlight>


=== SAS 9.2 (DBCS) mit Axis 2 ===
==== Python Suds mit SQLite ====
Man kann GOV-Einträge als JSON in SQlite speichern und alle Details per SQL auswerten.
* [[GOV/Webservice/Python-suds]]


<pre>
==== SAS 9.2 (DBCS) mit Axis 2 ====
FILENAME REQUEST temp;
<pre>FILENAME REQUEST temp;
FILENAME RESPONSE 'C:\temp\simpleTest_RESPONSE.xml';
FILENAME RESPONSE 'C:\temp\simpleTest_RESPONSE.xml';


Zeile 144: Zeile 202:
proc soap in=REQUEST  
proc soap in=REQUEST  
           out=RESPONSE
           out=RESPONSE
           url="http://gov.genealogy.net/services/ComplexService#wsdl"
           url="https://gov.genealogy.net/services/ComplexService#wsdl"
     ;
     ;
run;
run;</pre>
</pre>
Man erhält eine XML-Datei mit dem Ergebnis. Sind Unicode-Zeichen im Ergebnis enthalten, kommt nur ein Response, wenn man mit der Version "English (DBCS)" arbeitet und die zugehörige SAS9.CFG mit dem Eintrag  
Man erhält eine XML-Datei mit dem Ergebnis. Sind Unicode-Zeichen im Ergebnis enthalten, kommt nur ein Response, wenn man mit der Version "English (DBCS)" arbeitet und die zugehörige SAS9.CFG mit dem Eintrag  
  -ENCODING "UTF-8"  
  -ENCODING "UTF-8"  
Zeile 155: Zeile 212:
auskommentiert. Somit erhält man immer einen Response in UTF-8.
auskommentiert. Somit erhält man immer einen Response in UTF-8.


== SOAP-Nachrichten ==
==== Oracle Express Edition ====
Zum Debuggen habe ich hier die übertragenen SOAP-Nachrichten eingefügt, wie sie von verschiedenen Webservice-Frameworks generiert werden.
* Installation von Oracle Express Edition 11g (XE), Oracle Application Express mit APEX_WEB_SERVICE 4.02
* ACLs definieren
* Der WebService Client kann mit einer PL/SQL Funktion geschrieben werden:
 
<syntaxhighlight lang="sql">
CREATE OR REPLACE FUNCTION gov_searchByName (p_name  IN  CHAR)
  RETURN VARCHAR
AS
  l_envelope  CLOB;
  l_xml      XMLTYPE;
  l_result    VARCHAR2(32767);
BEGIN
 
  l_envelope := '<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<soap:Body>
    <searchByName xmlns="http://gov.genealogy.net/ws">
      <placename xmlns="">' || p_name || '</placename>
    </searchByName>
</soap:Body>
</soap:Envelope>';
 
  -- Request abschicken und XML-Response holen
  l_xml := APEX_WEB_SERVICE.make_request(
    p_url      => 'https://gov.genealogy.net/services/SimpleService',
    p_envelope => l_envelope
  );
 
  -- XML ausgeben (Trace)
  DBMS_OUTPUT.put_line('l_xml=' || l_xml.getClobVal());
 
  -- XML-Ergebnis parsen
  l_result := APEX_WEB_SERVICE.parse_xml(
    p_xml  => l_xml,
    p_xpath => '*',
    p_ns    => 'xmlns:ns2="http://gov.genealogy.net/data'
  );
 
  RETURN l_result;
END;
/
</syntaxhighlight>
 
Aufruf der Funktion:
SET SERVEROUTPUT On;
SELECT gov_searchByName ('Heidkate') FROM dual;
 
* weitere Beispiele: [[GOV/Webservice/Oracle| hier]]
 
=== SOAP-Nachrichten ===
Zum Debuggen sind hier die übertragenen SOAP-Nachrichten eingefügt, wie sie von verschiedenen Webservice-Frameworks generiert werden.


=== Axis 1.4 ===
==== Axis 1.4 ====
<xml><?xml version="1.0" encoding="utf-8"?>
<syntaxhighlight lang="xml"><?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
Zeile 168: Zeile 277:
     </searchByName>
     </searchByName>
   </soapenv:Body>
   </soapenv:Body>
</soapenv:Envelope></xml>
</soapenv:Envelope></syntaxhighlight>


=== PHP 5 ===
==== PHP 5 ====
<xml><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
<syntaxhighlight lang="xml"><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://gov.genealogy.net/ws">
xmlns:ns1="http://gov.genealogy.net/ws">
   <SOAP-ENV:Body>
   <SOAP-ENV:Body>
Zeile 178: Zeile 287:
     </ns1:searchByName>
     </ns1:searchByName>
   </SOAP-ENV:Body>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope></xml>
</SOAP-ENV:Envelope></syntaxhighlight>


== Beispiele ==
=== Beispiele ===
* Position eines Ortes auslesen:
* Position eines Ortes auslesen:
** [[GOV/Webservice/PHP#Position_ausgeben|PHP]]
** [[GOV/Webservice/PHP#Position_ausgeben|PHP]]
** [[GOV/Webservice/NET#Position_ausgeben|.NET]]
* Position eines Ortes setzen:
* Position eines Ortes setzen:
** [[GOV/Webservice/Java#Position_setzen|Java]]
** [[GOV/Webservice/Java#Position_setzen|Java]]
Zeile 189: Zeile 299:
** [[GOV/Webservice/PHP#GOV-Kennung prüfen|PHP]]
** [[GOV/Webservice/PHP#GOV-Kennung prüfen|PHP]]
** [[GOV/Webservice/Python-ZSI#GOV-Kennung prüfen|Python ZSI]]
** [[GOV/Webservice/Python-ZSI#GOV-Kennung prüfen|Python ZSI]]
** [[GOV/Webservice/NET#GOV-Kennung prüfen|.NET]]
=== Allgemeine Hinweise ===
* Der Firewall auf dem Rechner mit dem Java-WDSL-Client muss entsprechend konfiguriert sein, um den Datenverkehr zuzulassen, z.B. als Ausnahme in Form einer vertrauenswürdigen Anwendung.
* Zur Programmierung ist eine passende Modellierung des nicht relationalen [[GOV/Datenmodell|Datenmodells]] und der [[GOV/Objekttypen|Objekttypen]] in der jeweiligen Programmiersprache notwendig.
== Einzelnachweise ==
<references />


[[Kategorie:GOV-Intern]]
[[Kategorie:GOV-Intern]]

Aktuelle Version vom 4. November 2023, 18:12 Uhr

GOV-Hauptseite > GOV/Projekt > GOV-Webservice

Projekt GOV
hier: GOV/Webservice

GOV-Datenbankabfrage:

Infoseiten zum Projekt:

Datenerfassung:

Kontakt:

Kategorien:


Zweck

Über Webservices erhält man einen maschinellen Zugriff auf die Daten des GOV, der inhaltlich dem Zugriff über das Webfrontend entspricht. Mit Webservices kann beispielsweise ein geübter Programmierer die Informationen aus GOV in ein genealogisches Programm einbinden. Für das Programm webtrees ist beispielsweise ein entsprechendes Erweiterungsmodul verfügbar ("vesta gov4webtrees").

Die GOV-Webservices erfordern keine Authentifizierung.

Lizenz

Creative Commons License
Creative Commons Attribution iconCreative Share Alike icon
Das GOV darf unter den Bedingungen der Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 4.0 International (CC BY-SA 4.0) Lizenz verwendet werden.

REST API

Mit einem einfachen Web-Aufruf kann man per REST[1] in JSON[2] dargestellte Informationen zu einer GOV-ID abfragen.

Formale Dokumentation aller Parameter nach dem '=' in information= siehe https://gov-dev.genealogy.net/swagger-ui/index.html.

SOAP API

Es gibt drei SOAP-Webservices[3]

  • SimpleService - als Suchergebnis werden Listen mit GOV-Kennungen zurück geliefert
  • ComplexService - als Suchergebnis werden Listen zurück geliefert, die die Objekte selbst enthalten
  • ChangeService - mit diesem Dienst können Daten im GOV verändert werden

Unter Listen sind hier XML-Strukturen zu verstehen, die mit beschreibenden Tags versehen sind. Die Bedeutung der Tags entspricht der englischen Bedeutung der korrespondierenden Quicktext-Elemente.

Weitere Dokumentation im genealogy.net Forum: http://forum.genealogy.net/?page=Thread&postID=389371

Lesezugriff

Die vom SimpleService und ComplexService zur Verfügung gestellten Funktionen sind (bis auf die Art des Rückgabewertes) identisch, so dass sie hier gemeinsam beschrieben werden.

checkObjectId
prüft, ob eine Objektkennung gültig ist. Wenn die abgefragte Objektkennung durch eine andere ersetzt wurde, wird die neue Kennung zurückgeliefert. Wird ein leerer String zurückgeliefert, ist die Objektkennung ungültig.
getArchive
lädt ein Archiv-Objekt
getChildObjects
untergeordnete Objekte
getNameAtDate
Name eines Objektes zu einem anzugebenden Datum in einer anzugebenden Sprache
getObject
lädt ein Ort-Objekt
getObjectByExternalId
Suche nach Objekt(en) mit Systemkürzel der externen Kennung und Referenznummer
getParentObjectWithTypeAtDate
getPositions
getRecordsForObject
getSource
lädt ein Quellen-Objekt
listTopLevelObjects
Liste aller Orte, die keinem anderen Objekt zugeordnet sind
lookupObject
für FOKO
searchByBoundingBox
sucht Orte, die innerhalb einer geographischen Region liegen. Parameter: Breite der einen Ecke, Breite der anderen Ecke, Länge der einen Ecke, Länge der anderen Ecke
searchByName
Suche Orte anhand ihres Namens (wie die einfache Suche im Frontend)
searchByNameAndType
searchDescendantsByName
Suche nach untergeordneten Objekten nach Name zu einer übergeordenten ID
searchDescendantsByNameLanguage
searchDescendantsByType
Suche nach untergeordneten Objekten nach Typ zu einem übergeordneten Namen
searchDescendantsByTypeAtDate
searchRelatedByName
Suche nach über-/untergeordneten Objekten nach Name

Die Beschreibung der Funktionen (wsdl:message) mit ihren Parametern (wsdl:part) wird beim Aufruf des jeweiligen Services im Browser angezeigt, z.B. https://gov.genealogy.net/services/ComplexService?wsdl

Schreibzugriff

Der Schreibzugriff beinhaltet Operationen zum Speichern von Orten, Quellen und Archiven. Als erster Parameter wird das zu speichernde Objekt übergeben, der zweite und dritte Parameter sind Benutzername und Passwort des Bearbeiters.

  • saveObject
  • saveSource
  • saveArchive

Kompatibilität

Mit folgenden Frameworks wurde der GOV-Webserivce getestet:

Framework und Version getestet vollständig getestet Bemerkungen Benutzer
Axis 1.1 True.png mit Java 1.4 Jzedlitz
Axis 1.4 True.png beim Klassen-Generieren Option "-w" Jzedlitz
Axis 2.0 True.png PLingnau
PHP 5 und 7 True.png Jzedlitz
Python ZSI 1.7.0 True.png bei mir hat es nur mit einfachen Rückgabewerten funktioniert Jzedlitz
Python 3.9 Suds True.png nur das Lesen getestet. PLingnau

Client

PHP 5

Mit PHP 5 ist ein Client für den SOAP-Webservice ganz schnell geschrieben:

<?php
$soapclient = new SoapClient('https://gov.genealogy.net/services/ComplexService?wsdl');
$list =$soapclient->searchByName(utf8_encode('Heidkate'));
/* Ausgabe des Arrays */
echo "<pre>";
print_r($list);
echo "</pre>";
?>

PHP 7

Falls der SOAP-Client nicht automatisch installiert ist, muss ein Paket nachinstalliert werden:

sudo apt-get install php-soap

Aufgrund der besseren Unicode-Unterstützung ist der Aufruf noch etwas einfacher geworden:

<?php
$soapclient = new SoapClient('https://gov.genealogy.net/services/ComplexService?wsdl');
$list =$soapclient->searchByName('Heidkate');
/* Ausgabe des Arrays */
echo "<pre>";
print_r($list);
echo "</pre>";
?>

Axis 1.3, Axis 1.4

WSDL2Java hat Probleme mit dem Element-Namen "last-modification". Komischerweise funktioniert es richtig, wenn man WSDL2Java die Option "-w" mitgibt.

Generieren der Java-Klassen:

java org.apache.axis.wsdl.WSDL2Java -w https://gov.genealogy.net/services/ComplexService?wsdl

Ein kleiner Test-Client:

import net.genealogy.gov.ws.ComplexService_PortType;
import net.genealogy.gov.ws.ComplexService_ServiceLocator;

public class Client {
    public static void main(String[] args) throws Exception {
        ComplexService_PortType cs = new ComplexService_ServiceLocator()
                .getComplexService();

        cs.searchByName("Heidkate");
    }
}

Python Zeep

Für Python gibt es den SOAP-Client Zeep. Unter Ubuntu lässt er sich so installieren:

sudo apt-get install python3-zeep

Der Aufruf sieht dann folgendermaßen aus:

from zeep import Client
client = Client('https://gov.genealogy.net/services/ComplexService?wsdl')
result = client.service.getObject('SCHERGJO54EJ')
print(result)

Möchte man eine Liste von Zahlen als Parameter übertragen, dann geht das so.

from zeep import Client
client = Client('http://gov.genealogy.net/services/SimpleService?wsdl')
emptyArrayPlaceholder = client.get_type('{http://gov.genealogy.net/ws}ArrayOfInt')
interesting_types = emptyArrayPlaceholder()
interesting_types['int'].append(32)
interesting_types['int'].append(36)
interesting_types['int'].append(53)
result = client.service.getParentObjectWithTypeAtDate('SCHERGJO54EJ',interesting_types,2418703)
print(result)

Python Suds mit SQLite

Man kann GOV-Einträge als JSON in SQlite speichern und alle Details per SQL auswerten.

SAS 9.2 (DBCS) mit Axis 2

FILENAME REQUEST temp;
FILENAME RESPONSE 'C:\temp\simpleTest_RESPONSE.xml';

data _null_;
   file request;
   input;
   put _infile_;
   datalines4;
   <searchByName xmlns="http://gov.genealogy.net/ws">
      <placename xmlns="">Heidkate</placename>
    </searchByName>
;;;;
run;

proc soap in=REQUEST 
          out=RESPONSE
          url="https://gov.genealogy.net/services/ComplexService#wsdl"
    ;
run;

Man erhält eine XML-Datei mit dem Ergebnis. Sind Unicode-Zeichen im Ergebnis enthalten, kommt nur ein Response, wenn man mit der Version "English (DBCS)" arbeitet und die zugehörige SAS9.CFG mit dem Eintrag

-ENCODING "UTF-8" 

versieht und darin die Einträge

-DBCSTYPE PCMS 
-DBCSLANG JAPANESE

auskommentiert. Somit erhält man immer einen Response in UTF-8.

Oracle Express Edition

  • Installation von Oracle Express Edition 11g (XE), Oracle Application Express mit APEX_WEB_SERVICE 4.02
  • ACLs definieren
  • Der WebService Client kann mit einer PL/SQL Funktion geschrieben werden:
CREATE OR REPLACE FUNCTION gov_searchByName (p_name  IN  CHAR)
  RETURN VARCHAR
AS
  l_envelope  CLOB;
  l_xml       XMLTYPE;
  l_result    VARCHAR2(32767);
BEGIN

  l_envelope := '<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<soap:Body>
    <searchByName xmlns="http://gov.genealogy.net/ws">
      <placename xmlns="">' || p_name || '</placename>
    </searchByName>
</soap:Body>
</soap:Envelope>';

  -- Request abschicken und XML-Response holen
  l_xml := APEX_WEB_SERVICE.make_request(
    p_url      => 'https://gov.genealogy.net/services/SimpleService',
    p_envelope => l_envelope
  );

  -- XML ausgeben (Trace)
  DBMS_OUTPUT.put_line('l_xml=' || l_xml.getClobVal());

  -- XML-Ergebnis parsen
  l_result := APEX_WEB_SERVICE.parse_xml(
    p_xml   => l_xml,
    p_xpath => '*',
    p_ns    => 'xmlns:ns2="http://gov.genealogy.net/data'
  );

  RETURN l_result;
 END;
 /

Aufruf der Funktion:

SET SERVEROUTPUT On;
SELECT gov_searchByName ('Heidkate') FROM dual;

SOAP-Nachrichten

Zum Debuggen sind hier die übertragenen SOAP-Nachrichten eingefügt, wie sie von verschiedenen Webservice-Frameworks generiert werden.

Axis 1.4

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <searchByName xmlns="http://gov.genealogy.net/ws">
      <placename xmlns="">Heidkate</placename>
    </searchByName>
  </soapenv:Body>
</soapenv:Envelope>

PHP 5

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://gov.genealogy.net/ws">
  <SOAP-ENV:Body>
    <ns1:searchByName>
      <placename>Heidkate</placename>
    </ns1:searchByName>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Beispiele

Allgemeine Hinweise

  • Der Firewall auf dem Rechner mit dem Java-WDSL-Client muss entsprechend konfiguriert sein, um den Datenverkehr zuzulassen, z.B. als Ausnahme in Form einer vertrauenswürdigen Anwendung.
  • Zur Programmierung ist eine passende Modellierung des nicht relationalen Datenmodells und der Objekttypen in der jeweiligen Programmiersprache notwendig.

Einzelnachweise

  1. Artikel Representational State Transfer. In: Wikipedia, Die freie Enzyklopädie.
  2. Artikel JSON. In: Wikipedia, Die freie Enzyklopädie.
  3. :Artikel SOAP. In: Wikipedia, Die freie Enzyklopädie.