【发布时间】:2016-01-29 18:31:45
【问题描述】:
我们有以下场景:
- 设置一个 web 服务 - wsdl 和所有,应该监听客户端发送的数据,接收它,用它做一些事情,如果一切正常,发送一个响应为“ok”,如果有什么东西死了,发送一个“false”
- 客户端运行一个生成soap/xml请求位的脚本,创建一个soap客户端并将请求发送到wsdl。
- 客户端得到一个结果,表明数据没有被 Web 服务处理 - 错误。而且网络服务根本没有收到任何数据。
我无权访问网络服务 - 它是别人的。生成的请求正文(整个等)正在正确生成-当我通过soapUI发送它时它可以工作,但不能通过我的php soap客户端。
我尝试使用带有 SoapClient、__doRequest、__call 的内置 Soap(尝试了所有方法),但没有任何反应 - 仍然得到 'false' 结果。我尝试重新编写 NuSoap 以使用 Soap 1.2,但对于返回 true 的内容,仍然只有 'false' 结果。
所以,我想知道是否有人可以回答我以下问题:
我是否需要在服务器上专门安装一些东西才能使其与 Soap 1.2 一起使用?
当客户端必须向 Web 服务的函数发送数据时,我应该使用 __doRequest 还是 __call?还是别的什么?
根据我的 php.ini,服务器 header_accept 值没有使用soap 1.2 所需的应用程序/soap+xml - 如果是,这可能是问题 - 回到问题 1,或者我可以将类型添加到 header_accept 吗?
编辑:
$client = new SoapClient(
"the_wsdl_url_correct_for_sure.wsdl",
array(
'soap_version' => SOAP_1_2,
'trace' => 1,
)
);
$result = $client->__doRequest(
$the_var_i_use_to_store_the_soap_xml_thingie_that_works_through_soapUI_so_it_is_correct, $location,
$the_function_I_try_to_call,
"1.2"
);
对于$location,我是操作的命名空间(我试图调用该函数并将数据从第一个参数发送到)。对于动作/功能,我尝试仅使用在命名空间中定义的动作名称,并使用带有“full_namespace/action”的完整路径
当我尝试将数据发送到 WSDL 时,我应该使用 __doRequest 还是 __call?
编辑2:
我发送的请求是:
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Header/>
<env:Body>
<ns2:FunctionName xmlns:ns2="namespace_of_the_service">
<arg0>
<data1>Some data</data1>
</arg0>
</ns2:FunctionName>
</env:Body>
</env:Envelope>
有关此问题的更多信息可以在我之前的帖子中阅读: PHP Soap Client - sending the wrong headers "soapenv:VersionMismatch"
【问题讨论】:
-
可能有很多原因。我能给出的最佳建议:获取最新的 PHP 版本。使用内置的
SoapClient类作为初学者,它支持 SOAP 1.2。您很可能提供了错误的论点。您是否处于 WSDL 模式?您的代码在哪里(如果您问我,请在此处使用示例代码坚持 SoapClient)? -
不幸的是,我无法访问服务器 - 无法自行重新配置它:/ 我确实使用了内置的 Soap,但它一直给我关于 Soap 版本不匹配的错误,从中我得出结论,它根本不支持 1.2... 或者在此过程中有些东西正在死去。我将在我的主帖中添加我的 soapClient 代码和请求。
-
如果您收到具体的错误消息,请将其添加到您的问题中。还要启用 SoapClient 类的调试模式,并逐字查看 SOAP 请求和响应。您可能还想将这两个添加到您的问题中。
-
我已启用此功能,但没有收到任何错误。
-
请参阅Debugging PHP SOAP call - 它通过启用
SoapClient的trace 模式工作,在SoapClient::__getLastResponse的文档中进行了解释。 - 然后检查 SOAP 通信的请求和响应 XML。