3

APIを自分のサイトに統合しようとしています(APIは重要ではなく、問題はSOAPにあります)。私は通常PHPでコーディングしていませんが、JavaScriptに焦点を合わせているため、SOAPや関連するものは私にはかなり異質です。私は約2時間半の間、さまざまなことを探して試してきましたが、なんとか問題を絞り込むことができました。

を呼び出し$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?というクラスのインスタンスであると推測しています。これを行う方法がわからないので、1つの関数を提供するまったく新しいクラスを作成したくありません(ただし、それが解決策である場合は作成します)。

私が書いたクラス

<?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(配列)のオプションを送信する必要があります。

ご入力いただきありがとうございます!

4

1 に答える 1

2

これはおなじみですね。私が最初に試みることは、関数を次のように書き直すことです。

public function GetActivationCode($params) {
    var_dump($this->client->GetActivationCode(array(
        'Request' => array(
            'SourceCredentials' => $params
        ),
    )));
}

SoapClientまた、デバッグするには、これをコンストラクターのオプションに追加できます。

array(
    'trace' => true,
)

このようにし$this->client->__getLastRequest()て、コードをデバッグできます。

于 2012-08-28T15:47:54.910 に答える