我正在尝试将API集成到我的网站中(API并不重要,问题在于SOAP)。我通常不用PHP编写代码,而是专注于javascript,所以SOAP和相关的东西对我来说都很陌生。我一直在寻找和尝试不同的事情大约两个半小时,并设法缩小我的问题。
我打电话给$client->__getFunctions()
,它给我一个字符串列表,定义了我能够使用的所有功能。这是我想要使用的函数的字符串:
"GetActivationCodeResponse GetActivationCode(GetActivationCode $parameters)"
我已经编写并且正在与API创建者一起编写,因为这是我第一次使用SOAP,并且第一次使用php。
所以我在我的类中创建了一个名为GetActivationCode
的函数,如下所示:
public function GetActivationCode($params) {
$this->client->GetActivationCode($params);
var_dump($this->client);
}
这将始终输出SOAP错误:
Server was unable to process request. --->
System.NullReferenceException:
Object reference not set to an instance of an object
所以我猜测它希望传递的参数是一个名为GetActivationCode
的类的实例?我不知道如何做到这一点,并且不想创建一个全新的类来提供一个函数(但如果这是解决方案,我会的。)
我写的课程
<?php
require_once("../includes/mbApi.php");
error_reporting(E_ALL);
ini_set('display_errors', '1');
class MBActivateService extends MBAPIService
{
function __construct($debug = false)
{
$serviceUrl = "http://" . GetApiHostname() . "/0_5/SiteService.asmx?wsdl";
$this->debug = $debug;
$option = array();
if ($debug)
{
$option = array('trace'=>1);
}
$this->client = new soapclient($serviceUrl, $option);
}
public function GetActivationCode($s, $k, $ids) {
var_dump($this->client->__getFunctions());
$arr = array();
$arr["SourceName"] = $s;
$arr["Password"] = $k;
$arr["SiteIDs"] = $ids;
var_dump($arr);
$this->client->GetActivationCode($arr);
}
}
$activate = new MBActivateService();
$result = $activate->GetActivationCode("She3", "private api key", array("28856"));
var_dump($result);
?>
总体目标
这是总体目标,以防有人提供更好的解决方案。我需要发送以下SOAP请求:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://clients.mindbodyonline.com/api/0_5">
<soapenv:Header/>
<soapenv:Body>
<GetActivationCode>
<Request>
<SourceCredentials>
<SourceName>XXXX</SourceName>
<Password>XXXX</Password>
<SiteIDs>
<int>XXXX</int>
</SiteIDs>
</SourceCredentials>
</Request>
</GetActivationCode>
</soapenv:Body>
</soapenv:Envelope>
我需要发送SourceName
,Password
和SiteIDs
(数组)的选项。
提前感谢任何输入!
答案 0 :(得分:2)
听起来很熟悉。我要尝试的第一件事就是将函数重写为:
public function GetActivationCode($params) {
var_dump($this->client->GetActivationCode(array(
'Request' => array(
'SourceCredentials' => $params
),
)));
}
另外,要进行调试,可以将其添加到SoapClient
构造函数的选项中:
array(
'trace' => true,
)
这样您就可以$this->client->__getLastRequest()
来调试代码。