我使用SoapClient
库从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没有。尝试了一些解决方案,但没有运气。请帮我解决这个问题。
答案 0 :(得分:3)
第5页“TecDoc WebService Interface description”文档的“已知兼容性问题”部分指出:
PHP没有实现不同的整数数据类型。根据操作系统,整数包含32或64位。 因此从int(32位)到long(64 bit)在离散参数上完成,这些参数取64位值。 但是,这不适用于数组,因此有函数 必须使用包含数值的字符串数组。
因此,据我所知,似乎使用PHP时,您应该使用getDirectArticlesByIds2StringList
代替getDirectArticlesByIds2
。
答案 1 :(得分:1)
应该使用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));
这不是同一个功能,但我希望它有所帮助。
答案 2 :(得分:1)
尝试其他答案没有运气。我遇到了 getAssignedArticlesByIds2 函数和ArticleIdPairSeq的问题。我通过添加:
解决了我的数组问题'features' => SOAP_USE_XSI_ARRAY_TYPE
到 SoapClient 构造函数。
我希望这会解决其他人的问题。