如何在PHP中的nuSoap上创建一个Web服务,返回一个可以从WCF调用的数组?

时间:2013-06-29 20:59:20

标签: php arrays wcf nusoap

我使用nuSOAP在PHP中有一个web服务。 webservice返回一个对象数组。 使用时

$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客户端在调用时失败,抱怨它无法将thing []转换为thingArray。

1 个答案:

答案 0 :(得分: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客户端将很乐意使用nuSOAP生成的SOAP响应。

  // 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 ... }