NuSOAP 0.7.2发送空SOAP请求

时间:2012-01-11 01:25:19

标签: php xml api nusoap soap-client

好的,所以在我充斥着诸如“使用PHP的内置SOAP扩展”或“升级到nuSOAP 0.9.5”这样的答案之前,我只想说清楚这些在我的情况下不是一个选项。我在托管环境中工作,我很幸运他们甚至在服务器上安装了这个遗留版本的nuSOAP。

那就是说,我需要一些SOAP请求的帮助。

这是我到目前为止所拥有的:

require_once('nusoap_0.7.2/nusoap.php');
ini_set("soap.wsdl_cache_enabled", "0");
date_default_timezone_set('America/Los_Angeles');
$wsdl = "https://api.bronto.com/v4?wsdl";
$ns = "https://api.bronto.com/v4";

$client = new soapclient($wsdl, array('trace'=>1, 'encoding'=>'UTF-8'));

// Login
$token = "API-TOKEN";
$sessionId = $client->call('login', array('apiToken' => $token), $ns, $ns);
if (!$sessionId) {
  print "Login failed.\n";
  exit;
}
print_r($sessionId);

$client->setHeaders(array($ns, 'sessionHeader', array('sessionId' => $sessionId)));

echo htmlspecialchars($client->request, ENT_QUOTES); // debug request

这是对API的登录调用返回的内容:

Array ( [faultcode] => soap:Client [faultstring] => 107: There was an error in your soap request. Please examine the request and try again. [detail] => There was an error in your soap request. Please examine the request and try again. )

这就是SOAP请求最终看起来像:

POST /v4 HTTP/1.0 Host: api.bronto.com User-Agent: NuSOAP/0.7.2 (1.94) 
Content-Type: text/xml; charset=UTF-8 
SOAPAction: "" 
Content-Length: 379 
<?xml version="1.0" encoding="UTF-8"?>
 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns7166="https://api.bronto.com/v4">
  <SOAP-ENV:Body>
   <parameters/>
  </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>

SOAP请求似乎正在发送,但信封为空。我怀疑我可能需要用SoapVal对象替换请求中的数组,但是关于这个对象的文档很难理解。

作为参考,这是我试图转换为nusoap 0.7.2的PHP SOAP代码

ini_set("soap.wsdl_cache_enabled", "0");
date_default_timezone_set('America/New_York');

$wsdl = "https://api.bronto.com/v4?wsdl";
$url = "https://api.bronto.com/v4";

$client = new SoapClient($wsdl, array('trace' => 1, 'encoding' => 'UTF-8'));
$client->__setLocation($url);

// Login
$token = "ADD YOUR API TOKEN HERE";
$sessionId = $client->login(array("apiToken" => $token))->return;
if (!$sessionId) {
    print "Login failed.\n";
    exit;
}
$client->__setSoapHeaders(array(new SoapHeader("http://api.bronto.com/v4", 'sessionHeader', array('sessionId' => $sessionId))));
print "Login was successful.\n";

0 个答案:

没有答案