5

ライブラリを使用してSoapClient、TecDoc Web サービスからデータを取得しました。パラメータに配列内の配列が含まれるこの特殊な関数を除いて、すべての ws 関数が機能します。

これが私のコードです:

$client    = new SoapClient("http://webservice-cs.tecdoc.net/pegasus-2-0/wsdl", array("trace"     => true));

//array of product ids
$data   = array(
    'empty' => false,
    'array' => array(361024, 365118),
);

$params = array(
    'provider'             => 23014,
    'lang'                 => 'es',
    'country'              => 'es',
    'articleId'            => $data,
    'attributs'            => true,
    'documents'            => true,
    'documentsData'        => false,
    'eanNumbers'           => false,
    'immediateAttributs'   => true,
    'immediateInfo'        => false,
    'info'                 => true,
    'prices'               => false,
    'priceDate'            => null,
    'normalAustauschPrice' => false,
    'mainArticles'         => false,
    'oeNumbers'            => true,
    'replacedNumbers'      => false,
    'replacedByNumbers'    => false,
    'usageNumbers'         => false,
    'normalAustauschPrice' => false,
);

$test   = $client->__soapCall('getDirectArticlesByIds2', array('in0' => $params));

var_dump($test);

上記の関数の目的は、ID (ID の配列) からすべての製品情報を取得することです。

SoapClient は次のエラーを示します。

[soapenv:Server.userException] org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize. in C:\xampp 1.8.1\htdocs\www\test.php:59 Stack trace: #0 C:\xampp 1.8.1\htdocs\www\test.php(59): SoapClient->__soapCall('getDirectArticl...', Array)

配列パラメーターをプロパティに渡す必要のない他の関数は完全に機能します。

'array' => array(361024, 365118)エラーの原因であることがわかりました。配列を にするNULLと、上記のコードが機能し、空の結果が返されます (製品 ID が渡されないため)。

$data   = array(
    'empty' => false,
    'array' => null,
);

うまく機能する関数の例:

static public function addDynamicIp($hour)
{
    $client = new SoapClient("http://webservice-cs.tecdoc.net/pegasus-2-0/wsdl");
    $params                   = array(
        'provider'      => 23014,
        'address'       => $_SERVER['REMOTE_ADDR'],
        'validityHours' => $hour,
    );

    $client->__soapCall('addDynamicAddress', array('in0' => $params));
}

同じパラメーター (配列に配列を含む) を使用すると、NuSOAPは最初のコードを正常に実行し、正しい結果を返すことができます。しかし、NuSOAP は非常に多くの問題を引き起こし、特に速度が遅くなります。SoapClient を使用する必要があります。

したがって、NuSOAP ライブラリにはすべての子配列を適切な形式に変換する場所があると思いますが、SoapClient はそうではありません。いくつかの解決策を試しましたが、うまくいきませんでした。これを解決するのを手伝ってください。

4

3 に答える 3

4

5 ページの「 TecDoc WebService インターフェイスの説明」ドキュメントの「既知の互換性の問題」セクションには、次のように記載されています。

PHP は異なる整数データ型を実装していません。オペレーティング システムに応じて、整数には 32 ビットまたは 64 ビットが含まれます。したがって、int (32 ビット) から long (64 ビット) への暗黙的な自動マッピングは、64 ビット値を取る個別のパラメーターに対して行われます。ただし、これは配列では機能しないため、数値を含む文字列の配列を持つ関数を使用する必要があります

したがって、私が理解できる限りでは、PHPgetDirectArticlesByIds2StringListでは の代わりに使用する必要があるようですgetDirectArticlesByIds2

于 2013-09-11T21:25:26.787 に答える
1

運がない他の答えを試しました。getAssignedArticlesByIds2関数と ArticleIdPairSeq に問題がありました。以下を追加して、配列に関する問題を解決しました。

'features' => SOAP_USE_XSI_ARRAY_TYPE

SoapClientコンストラクターに。

これが他の人の問題を解決することを願っています。

于 2014-02-06T12:58:21.730 に答える
1

SoapVar要求を適切に処理できるように、Aを使用する必要があります。作業コードの一部:

class ArticleIdPair {
    public $articleId = null;
    public $articleLinkId = null;

    function __construct($articleId, $articleLinkId) {
        $this->articleId = $articleId;
        $this->articleLinkId  = $articleLinkId;
    }  
}  

class ArticleIdPairSequence {
    public $array = array();
    public $empty = true;

    function __construct(array $articleIdPairs) {
        $this->array = $articleIdPairs;

        if (count($articleIdPairs) > 0) {
            $this->empty = false;
        }
    }
}

//...

$soapClient = new SoapClient(TECDOC_WEBSERVICE_WSDL_URL, array(
     "classmap" => array(
         "ArticleIdPair" => "ArticleIdPair",
         "ArticleIdPairSequence" => "ArticleIdPairSequence"
      )
));

//...

$test = new ArticleIdPair($articleId, $articleLinkId);

$articleIdPairSeq = new ArticleIdPairSequence(array($test));

$encodedPairSeq = new SoapVar($articleIdPairSeq, SOAP_ENC_OBJECT, "ArticleIdPairSequence");

$params = array(
//...
"articleIdPairs" => $encodedPairSeq,
//...
);

//...

$result = $soapClient->__SoapCall("getAssignedArticlesByIds2", array($params));

同じ機能ではありませんが、お役に立てば幸いです。

于 2013-09-09T12:22:57.870 に答える