SoapServer クラス
(PHP 5, PHP 7, PHP 8)
はじめに
SoapServer クラスは » SOAP 1.1 および » SOAP 1.2 プロトコル用のサーバーとなります。 WSDL サービス記述を使用することもしないこともできます。
クラス概要
プロパティ
- service
-
- __soap_fault
-
目次
- SoapServer::addFunction — SOAP リクエストによって処理される単一もしくはいくつかの関数を追加する
- SoapServer::addSoapHeader — SOAP ヘッダをレスポンスに追加する
- SoapServer::__construct — SoapServer コンストラクタ
- SoapServer::fault — エラーを示す SoapServer フォールト を発行する
- SoapServer::getFunctions — 定義されている関数の一覧を返す
- SoapServer::__getLastResponse — 最新のSOAPレスポンスを返す
- SoapServer::handle — SOAP リクエストを処理する
- SoapServer::setClass — SOAP リクエストを処理するクラスを設定する
- SoapServer::setObject — SOAP リクエストの処理に使用するオブジェクトを設定する
- SoapServer::setPersistence — SoapServer の持続モードを設定する
+add a note
User Contributed Notes 7 notes
php1221 at klox dot net ¶
13 years ago
While there are plenty of mentions online that SoapServer doesn't support SOAP Headers, this isn't true.
In your class, if you declare a function with the name of the header, the function will be called when that header is received.
<?php
class MySoapService {
private $user_is_valid;
function MyHeader($header) {
if ((isset($header->Username)) && (isset($header->Password))) {
if (ValidateUser($header->Username, $header->Password)) {
$user_is_valid = true;
}
}
}
function MySoapRequest($request) {
if ($user_is_valid) {
// process request
}
else {
throw new MyFault("MySoapRequest", "User not valid.");
}
}
}
?>
mail at borisd dot ru ¶
5 years ago
If you want to run dummy SoapServer as a daemon for tests on linux, you need to:
1. Set up location "localhost:12312/soapServer.php" in your wsdl like:
<wsdl:service name="ServiceName">
<wsdl:port name="ServiceNamePort" binding="tns:ServiceNameBinding">
<soap:address location="http://localhost:12312/soapServer.php" />
</wsdl:port>
</wsdl:service>
2. Write your test server like:
<?php
/*
* Server
*/
class TestSoapServer
{
public function getMessage()
{
return 'Hello, World!';
}
}
$options = ['uri' => 'http://localhost:12312/'];
$server = new SoapServer(null, $options);
$server->setClass('TestSoapServer');
$server->handle();
?>
3. Run it with `php -S localhost:12312` (in the same folder)
Whenever you make a request according to your wsdl, it will end up at your "server".
carlos dot vini at gmail dot com ¶
14 years ago
SoapServer does not support WSDL with literal/document. I have a class:
<?php
class My_Soap {
/**
* Returns Hello World.
*
* @param string $world
* @return string
*/
public function getInterAdmins($world) {
return 'hello' . $world;
}
}
?>
To fix this I had to create proxy class:
<?php
class My_Soap_LiteralDocumentProxy {
public function __call($methodName, $args) {
$soapClass = new My_Soap();
$result = call_user_func_array(array($soapClass, $methodName), $args[0]);
return array($methodName . 'Result' => $result);
}
}
?>
Now make sure that the WSDL is created using My_Soap. And that the Server is created using My_Soap_LiteralDocumentProxy:
<?php
if (isset($_GET['wsdl'])) {
$wsdl = new Zend_Soap_AutoDiscover(); // It generates the WSDL
$wsdl->setOperationBodyStyle(array(
'use' => 'literal'
));
$wsdl->setBindingStyle(array(
'style' => 'document'
));
$wsdl->setClass('My_Soap');
$wsdl->handle();
} else {
$server = new Zend_Soap_Server('http://localhost/something/webservice.php?wsdl');
$server->setClass('My_Soap_LiteralDocumentProxy');
$server->handle();
}
?>
softontherocks at gmail dot com ¶
10 years ago
I posted in this URL http://softontherocks.blogspot.com/2014/02/web-service-soap-con-php.html a full example of a nusoap web service.
There is defined the server and the cliente who calls the web service.
I hope it would be useful for you.
dsubar at interna dot com ¶
14 years ago
Do not put a SoapServer and a SoapClient in the same PHP file. This seems to cause arbitrary behavior. On the PHP interpreter in Eclipse, everything worked fine. Under MAMP, I got an undocumented error. In moving the client from the same file as the server, everything worked fine.
s at dumdeedum dot com ¶
11 years ago
I was running PHP 5.3.2 and couldn't for the life of me get SOAP headers to work, no matter how carefully I built my class/wsdl/client. What finally fixed it was updating to the latest PHP. No idea if there was a bug somewhere or what, but it's never a bad idea to stay current and it might save you weeks of frustration!
hawky83 at googlemail dot com ¶
13 years ago
Another simple example for SOAP_SERVER with errorhandling an params and wsdl:
SERVER (soap_all_srv.php):
<?php
// PEAR::SOAP einbinden
require_once "SOAP/Server.php";
$skiptrace =& PEAR::getStaticProperty('PEAR_Error', 'skiptrace');
$skiptrace = true;
// Service-Class
class mytimeserv {
// __dispatch_map
public $__dispatch_map = array ();
// In/Out param -> __dispatch_map
public function __construct() {
$this->__dispatch_map["now"] =
array ("in" => array("format" => "string"),
"out" => array("time" => "string"));
}
// get back __dispatch_map in __dispatch
public function __dispatch($methodname) {
if (isset($this->__dispatch_map[$methodname])) {
return $this->__dispatch_map[$methodname];
}
return NULL;
}
// servicemthod with parameters
function now ($format) {
// formaterror?
if (($format == null) || (trim($format) == "")) {
// send errormessage
return new SOAP_Fault("Kein Parameter angegeben","0815", "Client");
}
date_default_timezone_set('Europe/Berlin');
$time = date ($format);
// return SOAP-Obj.
return (new SOAP_Value('time','string', $time));
}
}
// service-class
$service = new mytimeserv();
// server
$ss = new SOAP_Server();
// add service with name
$ss->addObjectMap (&$service,"urn:mytimeserv");
// service or wsdl
if (isset($_SERVER["REQUEST_METHOD"])&& $_SERVER["REQUEST_METHOD"] == "POST") {
// postdata -> service
$ss->service ($HTTP_RAW_POST_DATA);
} else {
// wsdl-param in url
if (isset($_SERVER['QUERY_STRING']) && strcasecmp($_SERVER['QUERY_STRING'],'wsdl') == 0) {
// DISCO_Server for WSDL
require_once "SOAP/Disco.php";
$disco = new SOAP_DISCO_Server ($ss,"mytimeserv","My Time Service");
// set HTML-Header
header("Content-type: text/xml");
// return wsdl
print $disco->getWSDL ();
}
}
?>
CLIENT (soap_all_client.php) (for wsdl: http://example.com/soap_all_srv.php?wsdl):
<?php
require_once "SOAP/Client.php";
// SOAP/WSDL
$sw = new SOAP_WSDL ("http://example.com/soap_all_srv.php?wsdl");
// Proxy-Obj.
$proxy = $sw->getProxy ();
// servicemthod
$erg = $proxy->now ("H:i:s");
// return
print $erg."\n";
?>
↑ and ↓ to navigate •
Enter to select •
Esc to close
Press Enter without
selection to search using Google