php - 如何将数组作为值传递到 PHP Soapclient 请求中?

标签 php xml arrays soap soap-client

如何将数组作为值传递到 PHP Soapclient 请求中?

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

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

soapclient->doSomething(array('id' => 'blah', 'page' => 'blah', 'params' => array('email' => '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="691d0c1a1d291d0c1a1d470a0604" rel="noreferrer noopener nofollow">[email protected]</a>', 'password' => 'password', 'blah' => 'blah')));

soap 主体 xml 最终如下所示(注意空的 params 元素):

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

最佳答案

对于 JAX-WS Web 服务,可能是 hashmap 输入参数存在问题。生成的 xsd 架构对于 HashMap 似乎不正确。将 map 放入包装器对象中会导致 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 适用于此解决方案,但 HashMap 则不然。该对象被映射到 xsd:anyType,它作为 xsd 模式对象而不仅仅是对象进入 java webservice。

关于php - 如何将数组作为值传递到 PHP Soapclient 请求中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2337901/

相关文章:

sql-server - t-sql : create and add several namespaces to xml

javascript - 获取 2 个数组的差异,同时获取具体的边

c# - 如何在 C# 中将 3D 数组类型转换为 1D 数组类型?

php - PHP和MYSQLi插入

php - 2 个字符串之间的正则表达式匹配

c# - 如何正确序列化 DateTime?

c# - 如何使用 LINQ 从 xml 数据库中选择唯一名称?

javascript - 根据另一个对象数组过滤对象数组并返回合并数组

php - MySQL 表和 JSON 解析。是否有外键?

php - 通过迁移从其他列创建昵称,laravel 8