Zum Inhalt springen

SOAP Webservice erstellen

Erstellt am 23. Februar 2009 · 6 Antworten · letzte Antwort am 31. März 2009

Tags: PHP, Frage

Tsd ·

Hi,
ich wollte mir einen Webservice für mein Portal zusammenbauen.
Hab erstmal einige Tutorials durchgemacht. Die haben schließlich auch alle ganz gut funktioniert.( Gut das wsdl-File war invalide. Geht aber ja auch ohne 😃 )
Jetzt wollt ich das in mein TYPO3 einbauen.
Hab mir zwei Frontend-Plugins erstellt. Eins soll der Server, das andere der Client sein.
Leider bekomm ich dauernd nur Fehlermeldungen.
Letzte Meldung war z.B.

looks like we got no XML document

Meine beiden pi Klassen sehen wie folgt aus.
Server:

try {
  $server = new SOAPServer(NULL,array(
				'uri' => 'http://portaladresse/webservice'
				));
  $server->setClass('tx_portalwebservice_pi1');
  $server->handle();
}
 
catch (SOAPFault $f) {
  print $f->faultstring;
}
class tx_portalwebservice_pi1 extends tslib_pibase {
	var $prefixId      = 'tx_portalwebservice_pi1';		
	var $scriptRelPath = 'pi1/class.tx_portalwebservice_pi1.php';
	var $extKey        = 'portal_webservice';	
	var $pi_checkCHash = true;
	
	function main($content,$conf)	{
		$this->conf=$conf;
		$this->pi_setPiVarDefaults();
		$this->pi_loadLL();
	}
	public function halloWelt()
	{
		return "Hallo!! Es funktioniert!!!";
	}  
}



if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/portal_webservice/pi1/class.tx_portalwebservice_pi1.php'])	{
	include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/portal_webservice/pi1/class.tx_portalwebservice_pi1.php']);
}
?>

Client:

class tx_portalwebservice_pi2 extends tslib_pibase {
	var $prefixId      = 'tx_portalwebservice_pi2';		
	var $scriptRelPath = 'pi2/class.tx_portalwebservice_pi2.php';
	var $extKey        = 'portal_webservice';	
	var $pi_checkCHash = true;
	

	function main($content,$conf)	{
		$this->conf=$conf;
		$this->pi_setPiVarDefaults();
		$this->pi_loadLL();
		try {
			$client = new SOAPClient(NULL,array(
					'location' => 'http://portaladresse/index.php?id=29',
					'uri'      => 'http://portaladresse/webservice',
					'style'    => SOAP_RPC,
					'use'      => SOAP_ENCODED
					));
		$result = $client->halloWelt();
		}
		catch (SOAPFault $f) {
			print $f->faultstring;
		}
		$content .= '<h1>'.$result.'</h1>';
			
		return $this->pi_wrapInBaseClass($content);
	}
}



if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/portal_webservice/pi2/class.tx_portalwebservice_pi2.php'])	{
	include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/portal_webservice/pi2/class.tx_portalwebservice_pi2.php']);
}

Was mach ich da falsch??
Wäre super, wenn mir da jemand weiterhelfen könnte.
Thx Tsd.
PS.: TYPO3 4.2.5 und PHP5 mit nativer SOAP Unterstützung

jenses ·
Tsd schrieb

looks like we got no XML document

als Reaktion auf

return "Hallo!! Es funktioniert!!!";

ist doch ziemlich eindeutig, oder? 🙂
Versuch doch doch einfach mal ein gültiges XML_Dokument zu senden...

Tsd ·

Hmmm,
Inwiefern. Ich habe gedacht ich kann über SOAP Funktionen auf dem SOAP-Server aufrufen. Und es werden mir Werte zurück gegeben. Als XML zwar, aber um die Erstellung des XML müsste sich die SOAP-Funktion von PHP kümmern.
Ohne TYPO3 bekomm ich das auch mit genau diesen Funktionen hin.
Da wird mir ein XML zurückgegeben, was die Client-Funktion interpretiert und ausgibt.
Ich bin mitlerweile soweit, dass es wohl an irgendwelche Ausgaben auf der Serverseite liegt. Wohl am Template oder ähnlichem.
Wenn ich in meinem PHP Skript(ohne Typo3) ein echo einbau, kommt es zur selben Fehlermeldung

Tsd ·

Hmmm,
also ich versteh schon, das ich XML zurückliefern muss.
Ich hab jetzt den Webservice in einer php-Datei außerhalb von TYPO3 erstellt.
Das geht ohne Probleme.
Problematisch wird es wenn ich es als Frontend Plugin mach, da dann die Serverseite ja noch HTML-Code beinhaltet(z.B. Template oder Fehlermeldung bei fehlendem Template 😃)
Die Clientseite als Frontend-Plugin ist kein Problem.
Meine Frage ist also nicht, wie man generell einen Webservice mit SOAP erstellen kann, sondern wie man einen Webservice in TYPO3 integrieren kann.
Wäre net, da man dann die Konfiguration über das Backend bewerkstelligen könnte.

Ps.: Natürlich gibt es augenscheinlich keinen Unterschied zwischen PHP und einer TYPO3 Extension. Aber es gibt sehr wohl einen Unterschied, zwischen einer php-Datei außerhalb von TYPO3 und einer Extension.

SeveQ ·

Ein eigener Seitentyp ist vielleicht die Lösung für dein Problem. Darüber kannst du dafür sorgen, dass Typo3 dir reines XML liefert. Den Seitentyp definierst du zum Beispiel in der ext_path/pi1/static/setup.txt. Das muss dann etwa so aussehen:

blubb_page_type >
blubb_page_type = PAGE
blubb_page_type {
  typeNum = 890 # beliebige Nummer hier eintragen, weiß nicht, ob's da Regeln gibt
  config {
    disableAllHeaderCode = 1
    sendNoCacheHeaders = 1
    no_cache = 1
    admPanel = 0
    xhtml_cleaning = 0
    additionalHeaders = Content-Type:...;charset=... # Content-Typ und charset hier angeben für XML 
  }
  
  10 = USER
  10 {
    userFunc = tx_blubb_ext_pi1->webServiceFunction
  }
}

... naja, so in etwa. Ein Aufruf erfolgt dann über http://www.deine-domain.de/?type=890

Du solltest als Ausgabe die Rückgabe der userFunc bekommen. Ich hoffe, das hilft dir ein wenig.

Tsd ·

Lösung ist eigentlich ganz einfach. Man erstellt ein Frontend-Plugin und fügt zwischen Server-logik und Content-Ausgabe ein die(); ein.