PHP SoapClient“;反序列化错误“;将数组中的数组传递给属性时
我使用PHP SoapClient“;反序列化错误“;将数组中的数组传递给属性时,php,serialization,soap,soap-client,Php,Serialization,Soap,Soap Client,我使用SoapClient库从TecDocWebServices获取数据。除此特殊函数(其参数包含数组中的数组)外,所有ws函数都工作 这是我的密码: $client = new SoapClient("http://webservice-cs.tecdoc.net/pegasus-2-0/wsdl", array("trace" => true)); //array of product ids $data = array( 'empty' => fal
SoapClient
库从TecDocWebServices获取数据。除此特殊函数(其参数包含数组中的数组)外,所有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在尝试反序列化的内容中遇到了一个子元素,这不是预期的。在C:\xampp 1.8.1\htdocs\www\test.php:59堆栈跟踪:#0 C:\xampp 1.8.1\htdocs\www\test.php(59):SoapClient->\uu soapCall('getDirectArticl…',数组)
我不必将数组参数传递给属性的其他函数工作得很好
我发现'array'=>array(361024365118)
导致了错误。如果我将数组设为NULL
,则上述代码有效,只返回空结果(因为没有传递产品ID)
工作良好的函数示例:
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没有。尝试了一些解决方案,但没有成功。请帮我解决这个问题。应该使用
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));
它不适用于相同的功能,但我希望它能有所帮助。第5页“”文档的“已知兼容性问题”部分指出:PHP不实现不同的整数数据类型。根据操作系统的不同,整数包含32位或64位。 因此,需要一个从int(32位)到long(64位)的自动隐式映射 位)对采用64位值的离散参数执行。 但是,这不适用于数组,因此有函数具有 必须使用包含数值的字符串数组
因此,据我所知,使用PHP时,似乎应该使用
GetDirectArticlesByd2Stringlist
而不是GetDirectArticlesBydS2
尝试其他答案,但没有成功。我在GetAssignedArticlesByDS2函数和ArticleIdPairSeq方面遇到问题。我通过添加以下内容解决了阵列的问题:
'features' => SOAP_USE_XSI_ARRAY_TYPE
到SoapClient构造函数
我希望这将为其他人解决问题。您对应该使用的函数的看法是正确的。Tecdoc应该提供一些简单PHP实现的示例(至少我找不到)。文档的这一部分看起来更加清晰,重要部分用粗体显示。
'features' => SOAP_USE_XSI_ARRAY_TYPE