好的,我已经在我的SOAP服务中实现了确认消息功能,以下是客户端如何调用它:
<?php
require_once __DIR__ . '/vendor/autoload.php';
$options = array();
$options['cache_wsdl'] = WSDL_CACHE_NONE;
$options['soap_version'] = SOAP_1_2;
$client = new Zend\Soap\Client("http://localhost/soap/server.php?wsdl", $options);
try {
$xml = simplexml_load_file('RequestExample.xml');
$t_xml = new DOMDocument();
$t_xml->loadXML($xml->asXML());
$xml = $t_xml->saveXML($t_xml->documentElement);
$response = $client->ReqInv($xml);
} catch (Exception $e) {
$response = 'Exception: '. $e. "\n";
}
echo $response;
我的服务:
<?php
require_once __DIR__ . '/vendor/autoload.php';
require(__DIR__ . '/PTResp.php');
use Zend\Soap\AutoDiscover;
use Zend\Soap\Server;
use Zend\Soap\Wsdl;
class PT {
function ReqInv($request) {
$pt = new PTResp($request);
return $pt->toString();
}
}
if (isset($_GET['wsdl'])) {
$wsdl = new AutoDiscover();
$wsdl->setUri('http://localhost/soap/server.php');
$wsdl->setClass('PT');
$wsdl->handle();
} else {
$server = new Zend\Soap\Server('http://localhost/soap/server.php?wsdl');
$server->setClass('PT');
$server->setEncoding('ISO-8859-1');
$server->handle();
}
我的类(在PTResp.php中):
class PT {
function __construct($xml) {
$this->m = new Mustache_Engine;
$this->xml = @simplexml_load_string($xml);
$this->xml->registerXPathNamespace(<my namespace info>);
$this->SendAck();
$this->BuildResponse();
}
function toString() {
$domxml = new DOMDocument('1.0');
$domxml->preserveWhiteSpace = false;
$domxml->formatOutput = true;
$domxml->loadXML($this->response);
$this->response = $domxml->saveXML($domxml->documentElement);
return $this->response;
}
function SendAck() {
$this->Status = "Accept";
$xml_post_string = $this->m->render(
'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ProcurementAddRs xmlns=MyNamespaceInfo">
<RqUID>{{RqUID}}</RqUID>
<PKey>{{PKey}}</PKey>
<ApplicationStatus>
<ApplicationStatusCode>{{Status}}</ApplicationStatusCode>
</ApplicationStatus>
</ProcurementAddRs>
</soap:Body>
</soap:Envelope>', array("RqUID" =>$this->RqUID, "PKey"=>$this->PKey, "Status"=>$this->Status));
$url = 'http://localhost/soap/gotit.php';
$this->curl_post_async($url, $xml_post_string);
}
function curl_post_async($url, $post_string){
$parts=parse_url($url);
$fp = fsockopen($parts['host'],
isset($parts['port'])?$parts['port']:80,
$errno, $errstr, 30);
$out = "POST ".$parts['path']." HTTP/1.1\r\n";
$out.= "Host: ".$parts['host']."\r\n";
$out.= "Content-Type: text/xml\r\n";
$out.= "Content-Length: ".strlen($post_string)."\r\n";
$out.= "Connection: Close\r\n\r\n";
if (isset($post_string)) $out.= $post_string;
fwrite($fp, $out);
fclose($fp);
}
function BuildResponse() {
$this-response = "<XML response that is built goes here>";
}
}
RequestInv
请求,并用SubmitInv
响应对该请求进行回复。 - MB34SOAP请求(SOAP消费者)-> ACK(SOAP服务器)[服务在线,请求良好/不良并且正在处理] -> ACK(SOAP消费者)[准备接收响应] -> SOAP响应(SOAP服务器)
- Giacomo Penuti