2013-06-29 2 views
0

У меня есть webservice в PHP, используя nuSOAP. Webservice возвращает массив объектов. При использованииКак создать веб-сервис на nuSoap на PHP, который возвращает массив, который можно вызвать из WCF?

$server->wsdl->addComplexType(
    "thingArray",   // type name 
    "complexType",  // soap type 
    'array',    // php type (struct/array) 
    'sequence',   // composition (all/sequence/choice) 
    '',     // base restriction 
    array(    // elements 
     'item' => array(
      'name' => 'item', 
      'type' => 'tns:thing', 
      'minOccurs' => '0', 
      'maxOccurs' => 'unbounded' 
     ) 
    ), 
    array(),    // attributes 
    "tns:thing"   // array type 
); 

КЛИЕНТ WCF сбой при вызове, жалуясь, что он не может конвертировать вещь [], чтобы thingArray.

ответ

0

Прежде всего, не забудьте включить UTF8, чтобы WCF мог понять ответы.

// Configure UTF8 so that WCF will be happy 
    $server->soap_defencoding='UTF-8'; 
    $server->decode_utf8=false; 

Для того, чтобы понять WCF массивы, мы должны использовать кодировку SOAP для массивов, а не композиции последовательности.

Это заставит NuSOAP испускают массив, который может потреблять WCF:

$server->wsdl->addComplexType(
     'thingArray',   // type name 
     'complexType',   // Soap type 
     'array',    // PHP type (struct, array) 
     '',     // composition 
     'SOAP-ENC:Array',  // base restriction 
     array(),    // elements 
     array(    // attributes 
     array(
      'ref'=>'SOAP-ENC:arrayType', 
      'wsdl:arrayType'=>'tns:thing[]' 
     ) 
    ),  // attribs 
     "tns:thing"  // arrayType 
); 

Этот тип теперь может быть использован в реакции, и клиент WCF будет благополучно потреблять ответ SOAP, который генерирует NuSOAP.

// Register the method to expose 
    $server->register('serviceMethod',   // method name 
     array('param1' => 'tns:thingArray'),  // input parameters 
     array('return' => 'tns:thingArray'),  // output parameters 
     $ns,          // namespace 
     $ns.'#serviceMethod',     // soapaction 
     'rpc',         // style 
     'encoded',        // use 
     'Says hello'        // documentation 
); 

клиент WCF заканчивает тем, как это:

var client = new Svc.servicePortTypeClient(); 
    thing[] things = new thing[3]; 
    thing[] result = client.serviceMethod(things); 
    foreach(thing x in result) 
    { ... do something with x ... }