5

我使用SoapClientLibrary 从 TecDoc webservices 获取数据。所有 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 回答