如何将数组作为值传入PHP soapclient请求?

时间:2010-02-25 21:47:52

标签: php xml arrays soap soap-client

如何将数组作为值传入PHP soapclient请求?

我已经实例化并连接了一个soapclient。然后我尝试调用一个需要3个参数的webservice方法(字符串,字符串,hashmap)。

以下是我期望在下面工作的内容。但是在查看xml输出时,params节点为空。

soapclient->doSomething(array('id' => 'blah', 'page' => 'blah', 'params' => array('email' => 'test@test.com', 'password' => 'password', 'blah' => 'blah')));

肥皂体xml像这样结束(注意空参数元素):

<SOAP-ENV:Body><ns1:doSomething>
<id>blah</id>
<page>blah</page>
<params/>
</ns1:register></SOAP-ENV:Body>

2 个答案:

答案 0 :(得分:3)

对于JAX-WS webservices,它可能是hashmap输入参数的问题。生成的xsd架构似乎对于散列图不正确。将映射放在包装器对象中会导致JAX-WS输出正确的xsd。

public class MapWrapper {
    public HashMap<String, String> map;
}


// in your web service class
@WebMethod(operationName = "doSomething")
public SomeResponseObject doSomething(
        @WebParam(name = "id") String id,
        @WebParam(name = "page") String page,
        @WebParam(name = "params") MapWrapper params {
    // body of method
}

然后php代码将成功。我发现我不需要SoapVar或SoapParam,并且在没有MapWrapper的情况下无法使这些方法工作。

$entry1['key'] = 'somekey';
$entry1['value'] = 1;
$params['map'] = array($entry1);
soapclient->doSomething(array('id' => 'blah', 'page' => 'blah', 
    'params' => $params));

这是使用包装器生成的正确xsd

<xs:complexType name="mapWrapper">
  <xs:sequence>
    <xs:element name="map">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="entry" minOccurs="0" maxOccurs="unbounded">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="key" minOccurs="0" type="xs:string"/>
                <xs:element name="value" minOccurs="0" type="xs:string"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>

这是由JAX-WS生成的错误模式,只有hashmap

<xs:complexType name="hashMap">
  <xs:complexContent>
    <xs:extension base="tns:abstractMap">
      <xs:sequence/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
<xs:complexType name="abstractMap" abstract="true">
  <xs:sequence/>
</xs:complexType>

最后一点。包装HashMap&lt; String,String&gt;使用此解决方案,但HashMap&lt; String,Object&gt;没有。 Object被映射到xsd:anyType,它作为xsd架构对象进入java webservice,而不仅仅是Object。

答案 1 :(得分:0)

根据webservice定义,hashmap参数可能需要具有无法从数组直接创建的特定结构/编码。您可能想要检查WSDL,并查看SoapVarSoapParam类以获取有关Soap参数构造的更多选项。