PHP SoapServer XML实例代码

clent.php:

$client = new SoapClient(null, array('location' => "http://demo.test.com/wsdl/HelloWorldService.php?wsdl", 'uri' => 'http://test-uri/'));
try {
    $result = $client->outsider();
    var_dump($result);
    echo "The answer isresult";
} catch (SoapFault $f) {
    echo "Error Message: {$f->getMessage()}";
}

HellowWordServer.php:

require_once 'HelloWorld.class.php';
if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST') {
    $servidorSoap = new SoapServer('http://' . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['PHP_SELF'] . '?wsdl');
    $servidorSoap->setClass('HelloWorld');
    $servidorSoap->handle();
} else {
    require_once 'SoapDiscovery.class.php';
 
    // Crea el servidor de descubrimiento
    $disco = new SoapDiscovery('HelloWorld', 'Solsoft_HelloWorld');
    header("Content-type: text/xml");
    if (isset($_SERVER['QUERY_STRING']) && strcasecmp($_SERVER['QUERY_STRING'], 'wsdl') == 0) {
        echo $disco->getWSDL();
    } else {
        echo $disco->getDiscovery();
    }
}

HelloWorld.class.php

class HelloWorld {
	private $nombre = '';
 
	/**
	 * HelloWorld::__construct() HelloWorld class Constructor.
	 * 
	 * @param string $nombre
	 * @return string
	 **/
	public function __construct($name = 'World') {
		$this->name = $name;
	}
 
	/**
	 * HelloWorld::greet() Greets the World xor $this->name xor $name if $name is not empty.
	 * 
	 * @param string $nombre
	 * @return string
	 **/
	public function greet($name = '') {
		$name = $name?$name:$this->name;
		return 'Hello '.$name.'.';
	}
 
	/**
	 * HelloWorld::servidorEstampillaDeTiempo() Returns server timestamp.
	 * 
	 * @return string 
	 **/
	public function serverTimestamp() {
		return time();
	} 
        public function outsider(){
            return "OUTSIDER";
        }
}

HelloWorld.wsdl

<?xml version="1.0" ?>
<definitions name="Solsoft_HelloWorld" targetNamespace="urn:Solsoft_HelloWorld" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="urn:Solsoft_HelloWorld" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns="http://schemas.xmlsoap.org/wsdl/">
<types xmlns="http://schemas.xmlsoap.org/wsdl/" />
<portType name="Solsoft_HelloWorldPort"><operation name="greet">
<input message="tns:greetRequest" />
<output message="tns:greetResponse" />
</operation>
<operation name="serverTimestamp">
<input message="tns:serverTimestampRequest" />
<output message="tns:serverTimestampResponse" />
</operation>
<operation name="outsider">
<input message="tns:outsiderRequest" />
<output message="tns:outsiderResponse" />
</operation>
</portType>
<binding name="Solsoft_HelloWorldBinding" type="tns:Solsoft_HelloWorldPort">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="greet">
<soap:operation soapAction="urn:Solsoft_HelloWorld#HelloWorld#greet" />
<input><soap:body use="encoded" namespace="urn:Solsoft_HelloWorld" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="urn:Solsoft_HelloWorld" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
<operation name="serverTimestamp">
<soap:operation soapAction="urn:Solsoft_HelloWorld#HelloWorld#serverTimestamp" />
<input><soap:body use="encoded" namespace="urn:Solsoft_HelloWorld" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="urn:Solsoft_HelloWorld" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
<operation name="outsider">
<soap:operation soapAction="urn:Solsoft_HelloWorld#HelloWorld#outsider" />
<input><soap:body use="encoded" namespace="urn:Solsoft_HelloWorld" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="urn:Solsoft_HelloWorld" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding>
<service name="Solsoft_HelloWorld">
<documentation />
<port name="Solsoft_HelloWorldPort" binding="tns:Solsoft_HelloWorldBinding"><soap:address location="http://demo.test.com:80/wsdl/HelloWorldService.php" />
</port>
</service>
<message name="greetRequest">
<part name="name" type="xsd:string" />
</message>
<message name="greetResponse">
<part name="greet" type="xsd:string" />
</message>
<message name="serverTimestampRequest">
</message>
<message name="serverTimestampResponse">
<part name="serverTimestamp" type="xsd:string" />
</message>
<message name="outsiderRequest">
</message>
<message name="outsiderResponse">
<part name="outsider" type="xsd:string" />
</message>
</definitions>

SoapDiscovery.class.php

class SoapDiscovery {
	private $class_name = '';
	private $service_name = '';
 
	/**
	 * SoapDiscovery::__construct() SoapDiscovery class Constructor.
	 * 
	 * @param string $class_name
	 * @param string $service_name
	 **/
	public function __construct($class_name = '', $service_name = '') {
		$this->class_name = $class_name;
		$this->service_name = $service_name;
	}
 
	/**
	 * SoapDiscovery::getWSDL() Returns the WSDL of a class if the class is instantiable.
	 * 
	 * @return string
	 **/
	public function getWSDL() {
		if (empty($this->service_name)) {
			throw new Exception('No service name.');
		}
		$headerWSDL = "<?xml version=\"1.0\" ?>\n";
		$headerWSDL.= "<definitions name=\"$this->service_name\" targetNamespace=\"urn:$this->service_name\" xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" xmlns:tns=\"urn:$this->service_name\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n";
		$headerWSDL.= "<types xmlns=\"http://schemas.xmlsoap.org/wsdl/\" />\n";
 
		if (empty($this->class_name)) {
			throw new Exception('No class name.');
		}
 
		$class = new ReflectionClass($this->class_name);
 
		if (!$class->isInstantiable()) {
			throw new Exception('Class is not instantiable.');
		}
 
		$methods = $class->getMethods();
 
		$portTypeWSDL = '<portType name="'.$this->service_name.'Port">';
		$bindingWSDL = '<binding name="'.$this->service_name.'Binding" type="tns:'.$this->service_name."Port\">\n<soap:binding style=\"rpc\" transport=\"http://schemas.xmlsoap.org/soap/http\" />\n";
		$serviceWSDL = '<service name="'.$this->service_name."\">\n<documentation />\n<port name=\"".$this->service_name.'Port" binding="tns:'.$this->service_name."Binding\"><soap:address location=\"http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF']."\" />\n</port>\n</service>\n";
		$messageWSDL = '';
		foreach ($methods as $method) {
			if ($method->isPublic() && !$method->isConstructor()) {
				$portTypeWSDL.= '<operation name="'.$method->getName()."\">\n".'<input message="tns:'.$method->getName()."Request\" />\n<output message=\"tns:".$method->getName()."Response\" />\n</operation>\n";
				$bindingWSDL.= '<operation name="'.$method->getName()."\">\n".'<soap:operation soapAction="urn:'.$this->service_name.'#'.$this->class_name.'#'.$method->getName()."\" />\n<input><soap:body use=\"encoded\" namespace=\"urn:$this->service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n</input>\n<output>\n<soap:body use=\"encoded\" namespace=\"urn:$this->service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n</output>\n</operation>\n";
			    $messageWSDL.= '<message name="'.$method->getName()."Request\">\n";
				$parameters = $method->getParameters();
				foreach ($parameters as $parameter) {
					$messageWSDL.= '<part name="'.$parameter->getName()."\" type=\"xsd:string\" />\n";
				}
				$messageWSDL.= "</message>\n";
				$messageWSDL.= '<message name="'.$method->getName()."Response\">\n";
				$messageWSDL.= '<part name="'.$method->getName()."\" type=\"xsd:string\" />\n";
				$messageWSDL.= "</message>\n";
			}
		}
		$portTypeWSDL.= "</portType>\n";
		$bindingWSDL.= "</binding>\n";
		return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>'); 
//生成wsdl文件,将上面的return注释 
//$fso = fopen($this->class_name . ".wsdl" , "w"); 
//fwrite($fso, sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>')); 
exit; 
	}
 
	/**
	 * SoapDiscovery::getDiscovery() Returns discovery of WSDL.
	 * 
	 * @return string
	 **/
	public function getDiscovery() {
		return "<?xml version=\"1.0\" ?>\n<disco:discovery xmlns:disco=\"http://schemas.xmlsoap.org/disco/\" xmlns:scl=\"http://schemas.xmlsoap.org/disco/scl/\">\n<scl:contractRef ref=\"http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF']."?wsdl\" />\n</disco:discovery>";
	}
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注