Как ArrayOfint должен искать веб-сервис, использующий NuSOAP? - PullRequest
0 голосов
/ 03 февраля 2012

Я пытался (и был несколько успешным) получить доступ к сервису с не такой большой документацией (это внутренний сервис корпорации, и разработчик давно ушел).

Задача состоит в том, чтобы повторно использовать запрос из системы графического интерфейса через вызов веб-службы и изменить параметры фильтра посредством вызова. Я начал с обратного инжиниринга от WDSL:

<s:element name="GetXMLResponse">
    <s:complexType>
        <s:sequence>
            <s:element name="searchId" type="s:string" minOccurs="0" /> 
            <s:element name="filterId" type="ope:ArrayOfint" minOccurs="0" /> 
            <s:element name="parameter1" type="ope:ArrayOfString" minOccurs="0" /> 
            <s:element name="parameter2" type="ope:ArrayOfString" minOccurs="0" /> 
        </s:sequence>
    </s:complexType>
</s:element>

Вначале я был действительно счастлив, когда смог получить вызов NuSOAP, чтобы дать мне пригодный XML-код в качестве ответа, когда я использовал только SeachID в качестве параметра

<code>$client=new NuSoap_Client($wsdl, true);
$params=array('searchId'=>'9cc497a0-7765-4659-a1c5-6eddf266892b');
$response = $client->call('ppGetXMLResponse', $params);
echo '<h3>Debug</h3>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '
';

Проблемы начались, когда я пытался отправить массив целых чисел (один filterID) и массив параметров1 (одна LF-разделенная строка параметров фильтра для рассматриваемого фильтра, массивов или парного фильтра <-> параметр)

После анализа (и много гаданий) вывода отладки (который очень многословен для NuSoap, что хорошо для новичка) он начал обретать некоторый смысл.

Часть сериализатора (или часть, которая, на мой взгляд, имеет значение) будет выглядеть следующим образом, если я введу то, что я считаю «ArrayOfInt» (например, array(4))

2012-02-03 09:31:18.333749 wsdl: in serializeType: name=filterId, type=http://www.openuri.org/:ArrayOfint, use=literal, encodingStyle=, unqualified=qualified
value=array(1) {
  [0]=>
  int(4)
}
2012-02-03 09:31:18.333940 wsdl: in serializeType: got a prefixed type: ArrayOfint, http://www.openuri.org/
2012-02-03 09:31:18.334099 wsdl: in getTypeDef: type=ArrayOfint, ns=http://www.openuri.org/
2012-02-03 09:31:18.334248 wsdl: in getTypeDef: have schema for namespace http://www.openuri.org/
2012-02-03 09:31:18.334558 wsdl: in serializeType: found typeDef
typeDef=array(5) {
  ["name"]=>
  string(10) "ArrayOfint"
  ["typeClass"]=>
  string(11) "complexType"
  ["phpType"]=>
  string(6) "struct"
  ["compositor"]=>
  string(8) "sequence"
  ["elements"]=>
  array(1) {
    ["int"]=>
    array(5) {
      ["name"]=>
      string(3) "int"
      ["type"]=>
      string(36) "http://www.w3.org/2001/XMLSchema:int"
      ["minOccurs"]=>
      string(1) "0"
      ["maxOccurs"]=>
      string(9) "unbounded"
      ["form"]=>
      string(9) "qualified"
    }
  }
}
2012-02-03 09:31:18.334800 wsdl: in serializeType: uqType: ArrayOfint, ns: http://www.openuri.org/, phptype: struct, arrayType: 
2012-02-03 09:31:18.334967 wsdl: no attributes to serialize for XML Schema type http://www.openuri.org/:ArrayOfint
2012-02-03 09:31:18.335124 wsdl: in serializeComplexTypeElements, serialize elements for XML Schema type http://www.openuri.org/:ArrayOfint
2012-02-03 09:31:18.335293 wsdl: in serializeType: name=int, type=http://www.w3.org/2001/XMLSchema:int, use=literal, encodingStyle=, unqualified=qualified
value=NULL
2012-02-03 09:31:18.335490 wsdl: in serializeType: got a prefixed type: int, http://www.w3.org/2001/XMLSchema
2012-02-03 09:31:18.335648 wsdl: in serializeType: type namespace indicates XML Schema or SOAP Encoding type
2012-02-03 09:31:18.335798 wsdl: in serializeType: returning: <int/>
2012-02-03 09:31:18.335953 wsdl: in serializeType: returning: <filterId><int/></filterId>

В результате возврата <filterId><int/></filterId> веб-сервис вернет ошибку.

После некоторого расчесывания головы я нашел ["name"]=>string(3) "int", поэтому я просто попытался изменить array(4) на array("int"=>4) И это привело к следующему:

2012-02-03 09:51:26.018529 wsdl: in serializeType: returning: <filterId><int>4</int></filterId>

Затем я использовал ту же логику для параметра ArrayOfString1, и это привело к следующему вызову

<code>$client=new NuSoap_Client($wsdl, true);
$params=array('searchId'=>'9cc497a0-7765-4659-a1c5-6eddf266892b',
            'filterId'=>array('int'=>4),
            'parameter1'=>array('String'=>implode(chr(10),$filterArray)));
$response = $client->call('ppGetXMLResponse', $params);

echo '<h3>Debug</h3>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '
';

Тогда все в порядке ... Да для моего единственного примера, но это с массивами только с одним членом. Если я хочу отправить другой filterID с другим параметром1, я не могу заставить сериализатор иметь смысл с помощью службы, которую я вызываю.

Наконец вопрос ...

Если я использую 'filterId'=>array('int'=>array(4,8)) в вызове, сериализатор возвращает: <filterId><int>4</int><int>8</int></filterId>

и это единственный способ, которым мне удалось получить отдельные параметры в вызове. но услуга возвращается:

["jwErrorDetail"]=>
    &string(21) "
          1
        "

Если я пытаюсь быть «креативным», используя 'filterId'=>array('int'=>array('4,8')), я получаю Ошибка десериализации аргументов.

["jwErrorDetail"]=>
    &string(78) "
          Error deserializing arguments.
Invalid integer value:'4,8'
        "

как я и ожидал.

Я столкнулся со стеной с помощью NuSOAP при обработке ArrayOfint или я только дезинформирован о том, как они должны обрабатываться / выглядеть в вызове SOAP?

Вполне может быть, что веб-сервис написан менее идеально, но я знаю, как работал один из дизайнеров (он, конечно, недоступен), и это обычно делалось в соответствии со стандартами и книгой (то есть не просто достаточно хорошо, так что это просто работает).

ArrayOfStrings, кажется, легче обрабатывать (или я не смог определить ArrayOfInt, поэтому вторая строка не использовалась (предполагается, что это пары filterIDs и Parameters)

Если у кого-то есть подсказки, это может помочь и другим

Я видел Отправка массивов данных в nusoap и PHP , но решение отправки необработанного XML не привлекательно, так как я чувствую, что я так близко.

...