SoapClient 调用 returns 500 内部服务器错误

SoapClient call returns 500 Internal Server Error

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

但是,当我尝试访问 __getFunctions() 给我的其他方法之一时,即使在 copy/pasting 来自文档的 XML 并输入我自己的凭据之后,我我仍然从 SoapFault 对象中得到一个 Internal Server Error 故障字符串和 500 作为故障代码。

我确信是我自己的 XML 字符串导致了这个问题,但我终究无法弄清楚是怎么回事。事实证明,直接联系 API 提供者没有帮助。这是我第一次处理 Soap/Web 服务,所以我不确定从这里到哪里去。

我做了 wget http//xxx.xxx.xxx?wsdl,它返回了一个有效的 XML 响应,与我在浏览器中直接转到 url 时得到的响应相同。为了解决这个问题,我应该研究什么?我处理过的所有过去 API 都是 JSON/RESTful,所以我觉得自己无法尝试调试 PHP 错误。

编辑

我已经慢慢删除了部分方法调用和部分 XML 字符串,试图触发不同的错误或其他错误,以便找到我需要修复的内容。我发现,通过不传递我的 XML 字符串,我从 $client->FunctionCall(...) 得到了有效的响应。这是一条 "this isn't right" 消息,但它是一条消息!事实上,为 xml 参数传递任何东西都会导致 500 http faultcode/faultstring。这是否意味着我的 XMl 格式不正确,或者是否意味着他们的最终处理请求存在问题?

第二次编辑

如果我按如下方式进行$client declecation,我会得到错误字符串Could not connect to host

$opts = array(
    'ssl' => array('ciphers'=>'RC4-SHA')
  );
$client = new SoapClient($CREDS['orderingWSDL'], array (
"encoding"=>"ISO-8859-1",
'stream_context' => stream_context_create($opts),
  'exceptions'=>true,
));

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

有时来自 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());
}