binding error 0x805564
| From: | Paul Mitchell | Date: | Wed, 25 Jan 2012 19:07:16 +0000 |
| Subject: | binding error 0x805564 | ||
| Groups: | php.test | ||
| Request: | Send a blank email to php-test+get-916@lists.php.net to get a copy of this message | ||
===========================================================
WSDL
===========================================================
WDSL-Server:
<?php
// ab php5.3 deprecated Warnings abschalten
ini_set ('error_reporting', E_ALL & ~E_DEPRECATED);
// PEAR::SOAP einbinden
require_once "SOAP/Server.php";
$skiptrace =& PEAR::getStaticProperty(
'PEAR_Error', 'skiptrace');$skiptrace = true; // Service-Klasse programmieren class MeinZeitService { // __dispatch_map definiren public $__dispatch_map = array (); // Ein- und Ausgabeparameter in // __dispatch_map definieren public function __construct() {
$this->__dispatch_map["jetzt"] =
array ("in" =>
array("format" => "string"),
"out" =>
array("uhrzeit" => "string"));
}
// In Methode __dispatch
//__dispatch_map zurück geben
public function __dispatch($methodname) {
if (isset(
$this->__dispatch_map[$methodname]))
return
$this->__dispatch_map[$methodname];
return NULL;
}
// Service Methode mit Parametern
function jetzt ($format) {
// Ist das Format fehlerhaft?
if (($format == null)||
(trim($format) == "")) {
// Fehlermeldung zurückgeben
return new SOAP_Fault("Kein Parameter angegeben",
"0815", "Client");
}
date_default_timezone_set('Europe/Berlin');
$uhrzeit = date ($format);
// Rückgabe als SOAP_Value Objekt
return (new SOAP_Value('uhrzeit',
'string', $uhrzeit));
}
}
// Web-Service Klasse ausprägen
$service = new MeinZeitService();
// Server ausprägen
$ss = new SOAP_Server();
// Service mit Namen zuweisen
$ss->addObjectMap ($service,
"urn:MeinZeitService");// Service Starten oder WSDL ausgeben? if (isset($_SERVER["REQUEST_METHOD"])&&
$_SERVER["REQUEST_METHOD"] == "POST") {
// Einstellung, dass POST-Daten an den
// Service weiter gegeben werden
$ss->service ($HTTP_RAW_POST_DATA);
} else {
// Prüfen, dass wsdl als Parameter
if (isset($_SERVER['QUERY_STRING']) &&
strcasecmp($_SERVER['QUERY_STRING'],
'wsdl') == 0) {
// DISCO_Server zum Erzeugen des WSDL
// auspraegen
require_once "SOAP/Disco.php";
$disco = new SOAP_DISCO_Server ($ss,
"MeinZeitService",
"Mein Zeit Service");
// HTML-Header setzen
header("Content-type: text/xml");
// WSDL-Dokument ausgeben
print $disco->getWSDL ();
}
}
?>
###########################################################
WSDL-Client
<?php
// ab php5.3 deprecated Warnings abschalten
ini_set ('error_reporting', E_ALL & ~E_DEPRECATED);
require_once "SOAP/Client.php";
// SOAP ueber WSDL auspraegen
$sw = new SOAP_WSDL ("http://localhost/cswa/ws/wsdlserver.php?wsdl");
// Proxy-Objekt ermitteln
$proxy = $sw->getProxy ();
// Web Service Methode aufrufen
$ergebnis = $proxy->jetzt ("H:i:s");
// Ergebnis ausgeben
print $ergebnis."\n";
?>
===========================================================
SOAP-Fault
===========================================================
SOAP-Server:
<?php
// ab php5.3 deprecated Warnings abschalten
ini_set ('error_reporting', E_ALL & ~E_DEPRECATED);
// PEAR::SOAP einbinden
require_once "SOAP/Server.php";
$skiptrace =& PEAR::getStaticProperty(
'PEAR_Error', 'skiptrace');$skiptrace = true; // Service-Klasse programmieren class MeinZeitService { // __dispatch_map definiren public $__dispatch_map = array (); // Ein- und Ausgabeparameter in // __dispatch_map definieren public function __construct() {
$this->__dispatch_map["jetzt"] =
array ("in" =>
array("format" => "string"),
"out" =>
array("uhrzeit" => "string"));
}
// In Methode __dispatch
//__dispatch_map zurück geben
public function __dispatch($methodname) {
if (isset(
$this->__dispatch_map[$methodname]))
return
$this->__dispatch_map[$methodname];
return NULL;
}
// Service Methode mit Parametern
function jetzt ($format) {
// Ist das Format fehlerhaft?
if (($format == null)||
(trim($format) == "")) {
// Fehlermeldung zurückgeben
return new SOAP_Fault("Kein Parameter angegeben",
"0815", "Client");
}
date_default_timezone_set('Europe/Berlin');
$uhrzeit = date ($format);
// Rückgabe als SOAP_Value Objekt
return (new SOAP_Value('uhrzeit',
'string', $uhrzeit));
}
}
// Web-Service Klasse ausprägen
$service = new MeinZeitService();
// Server ausprägen
$ss = new SOAP_Server();
// Service mit Namen zuweisen
$ss->addObjectMap ($service,
"urn:MeinZeitService");// Einstellung, dass POST-Daten an den // Service weiter gegeben werden $ss->service ($HTTP_RAW_POST_DATA); ?> ########################################################### Soap-Client <?php // ab php5.3 deprecated Warnings abschalten ini_set ('error_reporting', E_ALL & ~E_DEPRECATED); // Einbinden von SOAP/Client.php require_once "SOAP/Client.php"; // Client ausprägen und URI auf Web Service // übergeben $sc = new SOAP_Client ("http://localhost/cswa/ws/soapserver-fault.php"); // Parameter für Web Service Methode //$parameter = array ("format" => "H:i:s"); $parameter = array ("format" => null); // Methode call aufrufen, um Web Service // Methode zu nutzen $ergebnis = $sc->call ("jetzt", $parameter,
"urn:MeinZeitService");// Auf Fehler prüfen if (is_object($ergebnis)&&
(get_class($ergebnis) == "SOAP_Fault")) {
// Fehlermeldung ausgeben
print "Fehler! ".$ergebnis->message."\n";
} else {
// Ergebnis ausgeben
print $ergebnis."\n";
}
?>
===========================================================
Rest
===========================================================
Server:
<?php
// Wenn GET Methode
if($_SERVER['REQUEST_METHOD'] == 'GET'){
// Pfad zerlegen, 1 Element ist b_id
$path = $_SERVER['PATH_INFO'];
if($path != null){
$path_params = explode("/", $path);
}
echo "Daten von Buch ".$path_params[1];
return;
}
// Wenn POST Methode
if($_SERVER['REQUEST_METHOD'] == 'POST'){
// POST-Body holen
$body = file_get_contents("php://input");
// Status setzen
header("HTTP/1.0 201 Created");
echo "Daten von neuem Buch: ".$body;
return;
}
// Status setzen
header("HTTP/1.0 501 Not Implemented");
?>
###########################################################
Client
<?php
$url = "http://localhost/cswa/rest/book.php";
// curl initialisieren
$ch = curl_init();
// Optionen fuer GET setzen
curl_setopt($ch, CURLOPT_URL, $url."/42");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPGET, true);
// Anfrage ausfuehren
$response = curl_exec($ch);
echo "---- GET ----\nStatus-Code: ". curl_getinfo($ch, CURLINFO_HTTP_CODE)."\n";
echo $response."\n----\n";
curl_close($ch);
// curl initialisieren
$ch = curl_init();
// Optionen fuer POST setzen
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
// Bost-Body setzen
$data = "Buch 0815";
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// Anfrage ausfuehren
$response = curl_exec($ch);
echo "---- POST ----\nStatus-Code: ". curl_getinfo($ch, CURLINFO_HTTP_CODE)."\n";
echo $response."\n----\n";
curl_close($ch);
// curl initialisieren
$ch = curl_init();
// Optionen fuer DELETE
curl_setopt($ch, CURLOPT_URL, $url."/42");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
// Anfrage ausfuehren
$response = curl_exec($ch);
echo "---- DELETE ----\nStatus-Code: ". curl_getinfo($ch, CURLINFO_HTTP_CODE)."\n";
echo $response."\n----\n";
curl_close($ch);
?>
===========================================================
sonstiges
===========================================================
<?php
// ab php5.3 deprecated Warnings abschalten
ini_set ('error_reporting', E_ALL & ~E_DEPRECATED);
// PEAR::SOAP einbinden
require_once "SOAP/Server.php";
$skiptrace =& PEAR::getStaticProperty(
'PEAR_Error', 'skiptrace');$skiptrace = true; // Service-Klasse programmieren class WeinService { private $db; // __dispatch_map definiren public $__dispatch_map = array (); // Ein- und Ausgabeparameter in // __dispatch_map definieren public function __construct() { try { $this->db = new PDO ("mysql:host=localhost;dbname=B5","root",""); } catch (PDOException $e) { throw new Exception ('Verbindung nicht moeglich: ' . $e->getMessage()); }
$this->__dispatch_map["vollTextSuche"] =
array ("in" => array("suchmuster" => "string"),
"out" => array("ergebnis" => "integer"));
$this->__dispatch_map["holeNamePreis"] =
array("in" => array("id" => "integer"),
"out" => array("Name" => "string"));
}
// In Methode __dispatch
//__dispatch_map zurück geben
public function __dispatch($methodname) {
if (isset(
$this->__dispatch_map[$methodname]))
return
$this->__dispatch_map[$methodname];
return NULL;
}
function holeNamePreis ($id) {
if (($format == null) || (trim($format) == "")) {
// Fehlermeldung zurückgeben
return new SOAP_Fault("Kein Parameter angegeben: holeNamePreis",
"0815", "Client");} if (!$stmt=$this->db->prepare('SELECT count(*) AS anzahl FROM vhsbenutzer WHERE benutzerid=:benutzerid AND pwd=:pwd')) throw new Exception ('PDOStatement::prepare fehlgeschlagen!'); } // Service Methode mit Parametern function jetzt ($format) {
// Ist das Format fehlerhaft?
if (($format == null)||
(trim($format) == "")) {
// Fehlermeldung zurückgeben
return new SOAP_Fault("Kein Parameter angegeben",
"0815", "Client");
}
date_default_timezone_set('Europe/Berlin');
$uhrzeit = date ($format);
// Rückgabe als SOAP_Value Objekt
return (new SOAP_Value('uhrzeit',
'string', $uhrzeit));
}
}
// Web-Service Klasse ausprägen
$service = new MeinZeitService();
// Server ausprägen
$ss = new SOAP_Server();
// Service mit Namen zuweisen
$ss->addObjectMap ($service,
"urn:MeinZeitService");// Service Starten oder WSDL ausgeben? if (isset($_SERVER["REQUEST_METHOD"])&&
$_SERVER["REQUEST_METHOD"] == "POST") {
// Einstellung, dass POST-Daten an den
// Service weiter gegeben werden
$ss->service ($HTTP_RAW_POST_DATA);
} else {
// Prüfen, dass wsdl als Parameter
if (isset($_SERVER['QUERY_STRING']) &&
strcasecmp($_SERVER['QUERY_STRING'],
'wsdl') == 0) {
// DISCO_Server zum Erzeugen des WSDL
// auspraegen
require_once "SOAP/Disco.php";
$disco = new SOAP_DISCO_Server ($ss,
"MeinZeitService",
"Mein Zeit Service");
// HTML-Header setzen
header("Content-type: text/xml");
// WSDL-Dokument ausgeben
print $disco->getWSDL ();
}
}
?>
===========================================================
Info
===========================================================
- Warum ist asynchrone Abhandlung von
Anfragen die elegante Variante?
Die Anwendung wird während der Abfrage nicht blockiert.
Ein Programm das im Hintergrund arbeitet bietet immer mehr
Benutzerfreundlichkeit.
- Welche vier Fähigkeiten erhält
XMLHttpRequest nach einer
abgeschlossenen Anfrage?
status, responseXML, responseText, getResponseHeader
- Welcher Struktur ähneln Ajax Anwendungen?
Desktopanwendung, da Ajax Struktur über ähnliche GUI Elemente
und ähnlichen, aber simpleren Eventloop verfügt.
- Was ist SOA nicht?
Produkt, Werkzeug, Framework, Entwicklungstechnologie, Bauplan
- Wann setzt man SOA ein? Wann sinnvoll?
Hetergenität, verteilte Systeme, unterschiedliche Eigentümer, Interoperabilität
- Konzipiere einen Serviceaufruf
Fachliche Schnitstelle: bearbeiteKunde(action,id,name,adresse,konto)
Technische Schnittstelle: leseKunde(id), ändereKundenAdresse(id,Adresse), löscheKunde(id)
Die lose Kopplung – Antworten
Die Minimierung der Abhängigkeiten möchte man erreichen.
Vorteile:
Die Flexibilität des Systems steigt.
Der bürokratische Aufwand der System-Koordination wird vergleichsweise geringer.
Die Kompetenz der Subsysteme werden optimal genutzt sodass man lokale Lösungen entwickeln kann.
Externe Turbulenzen und strategische Fehlentscheidungen im System können weniger durchschlagen als bei einer „enger Kopplung“.
Nachteile:
Programmlogik des Service-Nutzers wird unüberschaubar.
das Funktionieren des Systems ist schwer zu kontrollieren.
die strategische Steuerung des Gesamtsystems wird erschwert.
die Redundanz im System lässt keine optimale Ressourcennutzung zu.
Ein Vertriebsmitarbeiter schließt außerhalb seines Büros einen Vertrag mit seinem Kunden, jedoch ist der Vetriebsmitarbeiter nicht im Firmen-Netz verbunden. Aufgrund der im Vorabend aktualisierten Stammdaten (Bestand und Preis) in dem Firmen-Programm, bestellt der Kunde 10 000 Kugellager zu je 4 Euro. Das macht für den Kunden 40 000 Euro. In der Zwischenzeit erhöht der Vertriebschef die Preise um 15 cent. Als der Vertriebsmitarbeiter wieder in sein Büro kehrt und seine Vertriebsanwendung startet, erkennt die Anwendung einen Konflikt zwischen dem lokal erfassten Auftrag und den globalen Stammdaten. Die Rechnung von dem Kunden beträgt nicht mehr 40 000Euro sondern 41 500 Euro.
Ohne die lose Kopplung hätte der Vertriebsmitarbeiter keinen Vertrag abschließen können.
Die Asynchrone Kommunikation besagt dass sowohl der Sender als der Empfänger nicht gleichzeitig (synchron) tätig sein müssen. Der Sender und der Empfänger werden zeitlich entkoppelt. Z.B.:
System A sendet System B eine Nachricht („Anfrage“). In der Zeit wo System A die Nachricht verschickt muss System B (der Empfänger) nicht anwesend sein. Sobald die Nachricht versendet wurde, kann System A (der Sender) weiter arbeiten. Wenn System B wieder verfügbar ist, wird die Nachricht bearbeitet und wird im Anschluss an System A verschickt. Auch hier muss System A wie System B nicht anwesend sein. Sobald System A wieder verfügbar ist, wird die Antwort bearbeitet, wenn es passend ist.
In der Realität ist es so, dass Produktionsprobleme anhand unerwartete Service-Laufzeiten verursacht wurden (sogenannten: Race-Conditions). Man hat die Priorität an die Wartbarkeit der Systeme als wichtiger empfunden, daher möchte man dieses Risiko nach Möglichkeit vermeiden.
Dieser Beschluss leitet zu einer engeren Kopplung, dass die Verfügbarkeit an beiden System eine Voraussetzung ist.
Unerwünscht ändert sich dadurch die Performance ins Negative.