GOV/Webservice: Unterschied zwischen den Versionen

aus GenWiki, dem genealogischen Lexikon zum Mitmachen.
< GOV
Zur Navigation springen Zur Suche springen
(→‎Client: + SAS 9.2)
Zeile 118: Zeile 118:
print response._out</python>
print response._out</python>


=== SAS 9.2 (SBCS) mit Axis 2 ===
=== SAS 9.2 (DBCS) mit Axis 2 ===


<pre>
<pre>
Zeile 141: Zeile 141:
run;
run;
</pre>
</pre>
Man erhält eine XML-Datei mit dem Ergebnis. Sind Unicode-Zeichen im Ergebnis enthalten, kommt kein Response. Dazu müsste man die DBCS Version verwenden.
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.


== SOAP-Nachrichten ==
== SOAP-Nachrichten ==

Version vom 7. August 2008, 20:32 Uhr

Über mehrere Webserivces erhält man praktische den gleichen Zugriff auf die Daten des GOV, wie ihn auch das Webfrontend bietet.

Dienste

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
  • ComplexService - als Suchergebnis werden Listen zurückgeliefert, die die Objekte selbst enthalten
  • ChangeService - mit diesem Dienst können Daten im GOV verändert werden

Lesezugriff

Die vom SimpleService und ComplexService zur Verfügung gestellten Funktionen sind (bis auf die Art des Rückgabewert) identisch, so daß 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
getName
getObject
lädt ein Ort-Objekt
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 Suche im Frontend)
searchDescendantsByName
searchDescendantsByName1
searchDescendantsByType1
searchRelatedByName

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.

  • 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
PHP 5 True.png Jzedlitz
Python ZSI 1.7.0 True.png bei mir hat es nur mit einfachen Rückgabewerten funktioniert Jzedlitz

Client

PHP 5

Mit PHP 5 ist ein Client für den GOV-Webservice ganz schnell geschrieben: <php><?php $soapclient = new SoapClient('http://gov.genealogy.net/services/ComplexService?wsdl'); $list =$soapclient->searchByName(utf8_encode('Heidkate')); /* Ausgabe des Arrays */

echo "

";
print_r($list);
echo "

";

?></php> Ja, das ist alles! :-)

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 http://gov.genealogy.net/services/ComplexService?wsdl

Ein kleiner Test-Client: <java>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");
   }

}</java>

Python ZSI 1.7.0

So richtig stabil scheint das noch nicht zu sein, mehr als einfache Rückgabewerte (einzelne Texte) habe ich nicht empfangen können.

Zunächst muß man sich Python Quellcode generieren: <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: <python>from SimpleServiceImpl_services import *

loc = SimpleServiceImplLocator() proxy = loc.getSimpleServiceImplPortType()

request = checkObjectIdRequestWrapper() request._itemId= "SCHERGJO54EJ" response = proxy.checkObjectId(request) print response._out</python>

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="http://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.

SOAP-Nachrichten

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

Axis 1.4

<xml><?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></xml>

PHP 5

<xml><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></xml>

Beispiele