我使用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 数组)中获取所有产品的信息。
肥皂客户端显示以下错误:
[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没有。尝试了一些解决方案,但没有运气。请帮我解决这个问题。
第 5 页的"TecDoc WebService 接口描述"文档的"已知兼容性问题"部分指出:
PHP 不实现不同的整数数据类型。根据操作系统的不同,整数包含 32 或 64 位。 因此,从 int(32 位)到 long (64 位)的自动隐式映射 bit) 是在采用 64 位值的离散参数上完成的。 但是,这不适用于数组,因此有函数具有 必须使用包含数值的字符串数组。
因此,据我所知,似乎在PHP中您应该使用getDirectArticlesByIds2StringList
而不是getDirectArticlesByIds2
。
应使用SoapVar
,以便可以正确处理请求。工作代码中的一些片段:
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));
它不是用于相同的功能,但我希望它有所帮助。
尝试其他答案没有运气。我在getAssignedArticlesByIds2函数和ArticleIdPairSeq上遇到了问题。我已经通过添加以下内容解决了数组问题:
'features' => SOAP_USE_XSI_ARRAY_TYPE
到 SoapClient 构造函数。
我希望这将为其他人解决问题。