我正在使用 PHP SoapClient 向使用 WSDL 的第 3 方发送请求。当我发送包含所有必需数据的请求时,我有工作功能。但是,如果缺少必填字段(或其他一些小错误),我得到的只是带有消息“内部服务器错误”的 SoapFault。澄清一下,我对请求的服务器端的控制为零。
对相同的请求使用 SoapUI 我得到以下响应。
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<s:Fault>
<faultcode>s:Client</faultcode>
<faultstring xml:lang="en-US">Request validation failed.</faultstring>
<detail>
<RequestValidationFault xmlns="http://schemas.datacontract.org/2004/07/OCCM.Phoenix.EWF.Shared.Modules.ERM.Common.BusinessEntities.Exceptions" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Domain>Request validation</Domain>
<Message>Request validation failed.</Message>
<ValidationResult xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<a:string>Patient: Last name is required.</a:string>
</ValidationResult>
</RequestValidationFault>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>
这正是我需要能够告诉我这边系统的用户进入并输入/修复所需数据的内容。在这种情况下,患者姓氏。
我打开了异常和跟踪,当请求成功时,我可以使用 $obj->__getLastResponse() 并查看预期数据。但是,当返回错误时,响应为“”,或者如果我使用 var_dump() 返回“NULL”。
在 SoapUI 中仔细观察,我可以看到响应具有 header :
状态 HTTP/1.1 500 内部服务器错误
我的假设是 SoapClient 看到了这一点,并立即根据 http 错误抛出异常。有没有人对这样的问题有过类似的经历?如果是这样,有没有办法告诉 SoapClient 返回完整的响应?
如果那不可能,有没有人知道是否有一个函数我可以覆盖以在抛出异常之前保存原始响应文本?我之前遇到过一个问题,成功的 XML 响应被包装在元数据中。通过覆盖 __doRequest() 并手动剥离元数据,我让 SoapClient 停止抛出异常。这对我当前的问题不起作用,因为那里的响应也是空白的。
最佳答案
我找不到使用 SoapClient 的解决方案。当出现错误时,我最终使用 curl 重新发送请求。然后我手动解析实际响应。
关于当服务器发回错误响应时,PHP SoapClient 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43815114/