【发布时间】: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->__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 总是会用<param1> 等包裹,而且总是有一个空的<SessionCreate>(只需写<SessionCreate/>
所以我的两部分问题是:
* 我如何正确地将对象输入到 SOAP 调用中?
* 有没有一种方法可以静态声明 XML 并使用它进行 SOAP 调用?即使我必须有一个$xml = "<soapEnvelope>" 之类的......然后只需调用类似$client->soapCall(url,xml) 的东西@
【问题讨论】:
标签: php xml web-services soap wsdl