我正在尝试使用PHP中的soapClient类来创建SOAP请求,这是我的代码:
$xmlstr = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://localhost:8090/mockCustomerManagement/types">
<soapenv:Header>
<typ:customerManagementHeader>
<typ:userId>42</typ:userId>
<typ:requestId>1500</typ:requestId>
<typ:messageTimestamp>2013-09-25T14:31:21+00:00</typ:messageTimestamp>
</typ:customerManagementHeader>
</soapenv:Header>
<soapenv:Body>
<typ:getCustomerInfoData>
<useremail>sargentoarensivia@nobody.es</useremail>
</typ:getCustomerInfoData>
</soapenv:Body>
</soapenv:Envelope>
XML;
$wsdl = 'http://localhost:8090/mockCustomerManagementSoapHttpBinding?WSDL';
$client = new SoapClient($wsdl, array(
'cache_wsdl' => WSDL_CACHE_NONE,
'cache_ttl' => 86400,
'trace' => true,
'exceptions' => true,
));
$xmlVar = new SoapVar($xmlstr, XSD_ANYXML);
$client->getCustomerInfo($xmlstr);
但是请求给我一个异常,当我向客户端询问最后一个请求时,它会在我的XML的开头和结尾显示一些额外的文本,如你所见:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost:8090/mockCustomerManagement/types">
<SOAP-ENV:Body>
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://localhost:8090/mockCustomerManagement/types">
<soapenv:Header>
<typ:customerManagementHeader>
<typ:userId>42</typ:userId>
<typ:requestId>1500</typ:requestId>
<typ:messageTimestamp>2013-09-25T14:31:21+00:00</typ:messageTimestamp>
</typ:customerManagementHeader>
</soapenv:Header>
<soapenv:Body>
<typ:getCustomerInfoData>
<useremail>sargentoarensivia@nobody.es</useremail>
</typ:getCustomerInfoData>
</soapenv:Body>
</soapenv:Envelope>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
有一些方法可以删除/禁用额外的文本吗?换句话说,有没有办法只发送我的XML?
答案 0 :(得分:5)
没有什么可以提出问题来找到答案。我扩展了SoapClient类,并以这种方式发送了正确的XML。这就是代码:
/**
* Extend SoapClientClass
*/
class anotherSoapClient extends SoapClient {
function __construct($wsdl, $options) {
parent::__construct($wsdl, $options);
$this->server = new SoapServer($wsdl, $options);
}
public function __doRequest($request, $location, $action, $version) {
$result = parent::__doRequest($request, $location, $action, $version);
return $result;
}
function __anotherRequest($call, $params) {
$location = 'http://localhost:8090/mockCustomerManagementSoapHttpBinding';
$action = 'http://localhost:8090/mockCustomerManagementSoapHttpBinding/'.$call;
$request = $params;
$result =$this->__doRequest($request, $location, $action, '1');
return $result;
}
}
// Create new SOAP client
$wsdl = 'http://localhost:8090/mockCustomerManagementSoapHttpBinding?WSDL';
$client = new anotherSoapClient($wsdl, array(
'cache_wsdl' => WSDL_CACHE_NONE,
'cache_ttl' => 86400,
'trace' => true,
'exceptions' => true,
));
// Make the request
try {
$request = $client->__anotherRequest('getCustomerInfo', $XMLrequest);
} catch (SoapFault $e ){
echo "Last request:<pre>" . htmlentities($client->__getLastRequest()) . "</pre>";
exit();
}
header('Content-type: text/xml');
echo $request;
我使用免费版本的SOAP_UI来测试响应。
答案 1 :(得分:-3)
// xml post structure
$xml_post_string = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AuthHeader xmlns="http://tempuri.org/">
<UserName>username</UserName>
<Password>password</Password>
</AuthHeader>
</soap:Header>
<soap:Body>
<webservice_method_name xmlns="http://tempuri.org/" />
</soap:Body>
</soap:Envelope>';
$headers = array(
"Content-type: text/xml;charset=\"utf-8\"",
"Accept: text/xml",
"Cache-Control: no-cache",
"Pragma: no-cache",
"SOAPAction:http://tempuri.org/webservice_method_name",
"Content-length: ".strlen($xml_post_string),
);
$url = "http://yourwebserviceurl.com/servicename.asmx";
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
// $响应显示XML响应
如何使用php解析soap响应,请参阅以下网站