我在发送安全wse标头以使用Web服务时遇到问题,并且已经尝试了几种使用TargetProcess.com的Web服务的方式,我不确定我做错了什么。
(http://demo.tpondemand.com/Services/ProjectService.asmx?wsdl)
他们的示例使用了一个非常旧的Nusoap版本,但我尝试使用内置在SoapClient类中的php5来实现这一点。
我在接收错误请求错误或无法进行身份验证之间遇到困难。那么我该如何发送这些标题?
这是我到目前为止所做的,但不起作用:
$tp_header_part = '
<wsa:Action>
http://targetprocess.com/RetrieveAll
</wsa:Action>
<wsa:MessageID>
urn:uuid:'.$this->getGuid().'
</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
</wsa:ReplyTo>
<wsa:To>http://medios.tpondemand.com/Services/ProjectService.asmx</wsa:To>
<wsse:Security SOAP-ENV:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
wsu:Id="SecurityToken-'.$this->getGuid().'">
<wsse:Username>MYUSERNAME</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
MYPASSWORD
</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>';
$soap_var_header = new SoapVar( $tp_header_part, XSD_ANYXML, null, null, null );
$soap_header = new SoapHeader( 'http://schemas.xmlsoap.org/ws/2003/06/secext', 'Security', $soap_var_header );
$client->__setSoapHeaders($soap_header);
p.s getGuid函数只根据文档生成了一个guid。
有什么想法吗?
答案 0 :(得分:1)
如果目标服务器是使用.NET / ASP编写的,那么获取“完美”XML请求可能非常繁琐 - 例如,在使用命名空间前缀时,必须在XML中包含命名空间的声明同样。
我可以在你的XML(wsa,wsse,SOAP-ENV)中看到几个名称空间的例子,它们似乎没有被删除 - 如果PHP SoapClient能够自动填充它们,我会感到惊讶。您似乎完全声明的唯一一个是'wsse'='http://schemas.xmlsoap.org/ws/2003/06/secext',通过启动您的SoapHeader对象。
如果可能的话,在PHP和目标服务器之间放一个数据包嗅探器(例如Fiddler2),以确切地查看正在发送和接收的内容 - 这可以使跟踪错误变得容易得多,并找出原因XML被拒绝了。
我建议对您的初始代码进行2次修改,这应该使其成为“有效的XML”:
xmlns:wsa="<URL for definition of WSA>"
SoapHeader - 我不确定,但是既然您已将名称空间URI放在此处,则可能需要在对象名称中包含名称空间前缀:
$soap_header = new SoapHeader( 'http://schemas.xmlsoap.org/ws/2003/06/secext', 'wsse:Security', $soap_var_header );
最重要的是找到一些方法来获得PHP客户端和目标服务器之间的确切HTTP对话 - 如果你还可以得到一个比较和对比的工作示例,那通常会让生活变得更容易100%! / p>