代码之家  ›  专栏  ›  技术社区  ›  Alana Storm

从php soapserver返回php数组

  •  3
  • Alana Storm  · 技术社区  · 15 年前

    我对“创建服务端”的SOAP相对比较陌生,所以对于我正在阅读的任何术语,应用程序都是预先准备好的。

    是否可以从使用php的soapserver类设置的远程过程soap服务返回php数组?

    我有一个WSDL(通过盲目遵循教程构建),在某种程度上,它看起来像这样。

    <message name='genericString'>
        <part name='Result' type='xsd:string'/>
    </message>
    
    <message name='genericObject'>
        <part name='Result' type='xsd:object'/>
    </message>
    
    <portType name='FtaPortType'>       
        <operation name='query'>
            <input message='tns:genericString'/>
            <output message='tns:genericObject'/>
        </operation>        
    </portType>
    

    我调用的php方法名为query,看起来像这样

    public function query($arg){
        $object = new stdClass();
        $object->testing = $arg;
        return $object;     
    }
    

    这让我可以打电话

    $client = new SoapClient("http://example.com/my.wsdl");
    $result = $client->query('This is a test');
    

    结果的转储看起来像

    object(stdClass)[2]
        public 'result' => string 'This is a test' (length=18)
    

    我想从查询方法返回本机PHP数组/集合。如果我更改查询方法以返回数组

    public function query($arg) {
        $object = array('test','again');
        return $object;
    }
    

    它被序列化为客户端的对象。

    object(stdClass)[2]
        public 'item' => 
            array
                0 => string 'test' (length=4)
                1 => string 'again' (length=5)
    

    这是有道理的,因为我特别指出 xsd:object 作为WSDL中的结果类型。如果可能的话,我想返回一个没有包装在对象中的本机PHP数组。我的直觉告诉我有一个特定的xsd:type可以让我完成这个任务,但我不知道。我也同意将对象序列化为 ArrayObject .

    不要在WSDL的技术细节方面耽误我的学习。我想了解一下

    3 回复  |  直到 11 年前
        1
  •  2
  •   Michał Niedźwiedzki    15 年前

    我用过 this WSDL generator 创建描述文件。

    返回字符串数组是我的Web服务所做的事情,这里是WSDL的一部分:

    <wsdl:types>
    <xsd:schema targetNamespace="http://schema.example.com">
      <xsd:complexType name="stringArray">
        <xsd:complexContent>
          <xsd:restriction base="SOAP-ENC:Array">
            <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd:string[]" />
          </xsd:restriction>
        </xsd:complexContent>
      </xsd:complexType>
    </xsd:schema>
    
    </wsdl:types>
    <message name="notifyRequest">
      <part name="parameters" type="xsd:string" />
    </message>
    <message name="notifyResponse">
      <part name="notifyReturn" type="tns:stringArray" />
    </message>
    

    然后是API函数 notify 定义:

    <wsdl:operation name="notify">
      <wsdl:input message="tns:notifyRequest" />
      <wsdl:output message="tns:notifyResponse" />
    </wsdl:operation>
    
        2
  •  5
  •   lubosdz    11 年前

    小技巧-编码为JSON对象,解码回递归关联数组:

    $data = json_decode(json_encode($data), true);
    
        3
  •  0
  •   hobodave    15 年前

    艾伦,为什么不在客户机收到响应时将对象强制转换为数组呢?

    例如

    (array) $object;
    

    这将把stdclass对象转换成一个数组,没有可测量的开销,并且在php中是O(1)。

    您也可以尝试将类型从xsd:object更改为soap enc:array。

    推荐文章