如何在php中使用SoapUI的xml
问题描述:
我有SoapUI与这个xml一起工作,但我需要使用php 5.3在我的服务器上使用这些数据。我想我需要将我的$字符串转换为数组。 $ xml =(array)simplexml_load_string($ string);不会抛出任何错误,但来自该调用的响应是NULL。如何在php中使用SoapUI的xml
$string = '
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tran="http://www.cornerstoneondemand.com/Webservices/TranscriptAndTask">
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-115E54B97689076253912">
<wsse:Username>me</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">word</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">dvhXLFiL4Aoi2KQ==</wsse:Nonce>
<wsu:Created>2016-10-19T15:26:02.539Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<tran:GetTranscriptAndTasks>
<tran:request>
<Request corpName="learning">
<User id="me">
<RequestTypes>
<Inbox/>
<Transcript inprogressOnly="false" pageNumber="1"/>
<Session pageNumber="1" upcomingOnly="true"/>
<Assigned assignedOnly="true"/>
<Approval approvalDateRequested="1967-08-13"/>
<Task pendingTasksOnly="true"/>
<SuggestedTraining pageNumber="1"/>
</RequestTypes>
</User>
</Request>
</tran:request>
</tran:GetTranscriptAndTasks>
</soapenv:Body>
</soapenv:Envelope>
';
$xml = (array)simplexml_load_string($string);
$soapClient = new SoapClient($wsdl, array('trace' => 1));
$response = $soapClient->GetTranscriptAndTasks($xml);
var_dump($response);
任何帮助,非常感谢!
编辑:我发现https://github.com/sapankumarmohanty/lamp/blob/master/Crate-XML-2-Array,将xml变成一个很好的数组。但是我的结果仍然是NULL ... 如果有帮助,我在此复制了WSDL http://www.markforsyth.com/TranscriptAndTaskService.wsdl。
答
您实际上可以直接从SoapUI使用xml代码。
下面是我的一些代码代码片段:
构造我的课,那servs作为Web服务的接口。 WSDL是在类定义为一个常数:
public function __construct($username, $password) {
$this->client = new SoapClient(self::wsdl);
$this->client->__setSoapHeaders(self::securityHeader($username, $password));
}
功能在我的类返回在构造中使用的安全标头:
private static function securityHeader($username, $password) {
$nsWSSE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
$nsWSU = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
$nonce = 'xxxxx';
$xml = '<nsWSSE:Security xmlns:nsWSSE="' . $nsWSSE . '" xmlns:nsWSU="' . $nsWSU . '">'
. '<nsWSSE:UsernameToken>'
. '<nsWSSE:Username>' . $username . '</nsWSSE:Username>'
. '<nsWSSE:Password>' . $password . '</nsWSSE:Password>'
. '<nsWSSE:Nonce>' . $nonce . '</nsWSSE:Nonce>'
. '<nsWSU:Created>' . gmdate('Y-m-d\TH:i:s\Z') . '</nsWSU:Created>'
. '</nsWSSE:UsernameToken>'
. '</nsWSSE:Security>';
$securityToken = new SoapVar($xml, XSD_ANYXML);
return new SoapHeader($nsWSSE, 'Security', $securityToken);
}
在我的类A的功能,使向WS功能“abc”发出请求:
public function abc() {
$xml = ... paste your xml code from SoapUI here ...
$param = new SoapVar($xml, XSD_ANYXML);
return $this->client->abc($param);
}
这使我比以前更加接近!现在,而不是NULL我回来 Mark
现在我只是猜测: 您的xml代码复制应该从''开始。但是从这一点开始,你会误解“tran”命名空间的定义,因为它是在xml代码的开始处定义的。解决方案:向''项目添加'xmlns:tran =“http://www.cornerstonechina.com/Webservices/TranscriptAndTask”'项目 –
优秀的'猜'你是对的! :) – Mark