SoapClient调用返回500内部服务器错误

时间:2016-05-19 14:17:37

标签: php soap soap-client

我正在尝试使用PHP及其内置的SoapClient连接到API。我已经检查了我通过客户端提供的格式错误的文档给出的URL,$client->__getFunctions()返回了三个函数的列表。 HelloWorld($name)响应Hello ~name~,向我显示我正在通过SoapClient调用与服务器通信,并且URL正确无误。

但是,当我尝试访问__getFunctions()给我的其他方法之一时,即使在从文档中复制/粘贴XML并放入我自己的凭据之后,我仍然被赋予{{1 faulttring和Internal Server Error作为SoapFault对象的faultcode。

我确信这是我自己的XML字符串导致了这个问题,但我不能为我的生活弄清楚如何。直接与API提供商联系并未证明有用。这是我第一次处理肥皂/网络服务,所以我不确定从哪里开始。

我做了500并且它返回了我看起来像一个有效的XML响应,就像我直接访问浏览器中的url时得到的那样。为了解决这个问题,我应该考虑什么?我所处理的所有过去的API都是JSON / RESTful,所以我觉得我的元素试图调试PHP错误。

修改

我已经慢慢删除了部分方法调用和部分XML字符串,试图触发不同的错误或某些内容以找到我需要修复的内容。我发现,通过不传入我的XML字符串,我得到wget http//xxx.xxx.xxx?wsdl的有效回复。这是一个“这是不对的”消息,但这是一条消息!实际上,为xml参数传递该函数ANYTHING会导致$client->FunctionCall(...) faultcode / faultstring。这是否意味着我的XMl格式不正确或者是否意味着他们的最终处理请求存在问题?

第二次修改

如果我按照以下方式进行500 http取消,我会得到faulttring $client

Could not connect to host

我越来越困惑,我试图解决这个问题的时间越长。

1 个答案:

答案 0 :(得分:6)

有时来自SOAP服务的500状态可能是抛出的SoapFault异常。为了帮助您进行故障排除,您需要能够检查请求XML和响应XML。

将您的代码放在try / catch块中,并使用$client->__getLastRequest()$client->__getLastResponse()来检查实际的XML。

示例:

$client = new SoapClient('http//xxx.xxx.xxx?wsdl', array('soap_version'=>SOAP_1_1,'trace' => 1,'exceptions' => true));
try {
  $response = $client->someFunction();
  var_dump($response);
} catch (Exception $e)  {
  var_dump($e->getMessage());
  var_dump($client->__getLastRequest());
  var_dump($client->__getLastResponse());
}