【问题标题】:PHP - Soap xml not being parsed as expectedPHP - 没有按预期解析 Soap xml
【发布时间】:2015-08-10 13:27:38
【问题描述】:

我正在使用网络服务(确切地说是 OTRS 网络服务)。我正在使用 PHP5 soapClient 并且(供将来参考)这是 dump($client->__getFunctions()); 的结果($client 是我使用 WSDL 和运行 Web 服务服务器端的 url 创建的对象)

array:5 [
  0 => "OTRS_TicketCreateResponse TicketCreate(OTRS_TicketCreate $TicketCreate)"
  1 => "OTRS_TicketUpdateResponse TicketUpdate(OTRS_TicketUpdate $TicketUpdate)"
  2 => "OTRS_TicketGetResponse TicketGet(OTRS_TicketGet $TicketGet)"
  3 => "OTRS_TicketSearchResponse TicketSearch(OTRS_TicketSearch $TicketSearch)"
  4 => "OTRS_SessionCreateResponse SessionCreate(OTRS_SessionCreate $SessionCreate)"
]

注意:我想调用最后一个服务SessionCreate

也是dump($client->__getTypes()); 的结果 - 仅适用于我尝试调用的 Web 服务请求(以避免出现巨大的文本墙)。

 21 => """
    struct OTRS_SessionCreate {
     string UserLogin;
     string CustomerUserLogin;
     string Password;
    }"""

WSDL 文件为 SessionCreate 显示了这一点

<xsd:complexType name="OTRS_SessionCreate">
        <xsd:sequence>
          <xsd:choice minOccurs="1" maxOccurs="1">
            <xsd:annotation>
              <xsd:documentation>UserLogin or CustomerUserLogin is mandatory.</xsd:documentation>
            </xsd:annotation>
            <xsd:element name="UserLogin" type="xsd:string" minOccurs="0"/>
            <xsd:element name="CustomerUserLogin" type="xsd:string" minOccurs="0"/>
          </xsd:choice>
          <xsd:element name="Password" type="xsd:string" minOccurs="0"/>
        </xsd:sequence>
      </xsd:complexType>

我的 PHP 代码

$client->SessionCreate("SessionCreate", array("SessionCreate" => array("UserLogin" => "Myuser","Password" => "secret")));

如果我这样做dump($client-&gt;__getLastRequest());

<?xml version="1.0" encoding="UTF-8"?>
  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SessionCreate/><param1><item><key>SessionCreate</key><value><item><key>UserLogin</key><value>myuser</value></item><item><key>Password</key><value>secret</value></item></value></item></param1></SOAP-ENV:Body></SOAP-ENV:Envelope>

我真正需要发送的是:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <SessionCreate>
         <!--You have a CHOICE of the next 2 items at this level-->
         <!--Optional:-->
         <UserLogin>Myuser</UserLogin>
         <Password>secret</Password>
      </SessionCreate>
   </soapenv:Body>
</soapenv:Envelope>

我的问题

我尝试了几种将数据输入soapCall 的方法——通过数组、对象,甚至是手工制作的XML。我想要的是它接收一个SessionCreate 标签,其中一个标签用于用户登录,另一个用于密码,每个标签都包含数据。但无论我怎么尝试,PHP 总是会用&lt;param1&gt; 等包裹,而且总是有一个空的&lt;SessionCreate&gt;(只需写&lt;SessionCreate/&gt;

所以我的两部分问题是: * 我如何正确地将对象输入到 SOAP 调用中? * 有没有一种方法可以静态声明 XML 并使用它进行 SOAP 调用?即使我必须有一个$xml = "&lt;soapEnvelope&gt;" 之类的......然后只需调用类似$client-&gt;soapCall(url,xml) 的东西@

【问题讨论】:

    标签: php xml web-services soap wsdl


    【解决方案1】:

    我遇到了“灵丹妙药”的秘密(我想在这里分享它,以供未来需要解决 Web 服务障碍的绝望编码人员使用)。它是 SoapParam 对象。

    注意:NameOfService 是第一个命名服务的包装标签。

    $response = $client->__soapCall("NameOfService", array(
    new SoapParam("value1", "nameOfTag"),
    new SoapParam("value2","nameOfSecondTag"),
    // ... so on and so forth for all the parameters you require to send
    ));
    

    $response 将填充您的网络服务返回的任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      相关资源
      最近更新 更多