0

nuSOAP を使用して PHP で Web サービスを作成しています。Web サービスは、オブジェクトの配列を返します。使用時

$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 に変換できないと不平を言います。

4

1 に答える 1

0

まず、WCF が応答を理解できるように、必ず UTF8 をオンにしてください。

  // 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 ... }
于 2013-06-29T20:59:19.803 に答える