我正在尝试使用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
我越来越困惑,我试图解决这个问题的时间越长。
答案 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());
}