我以前没有使用SOAP/WSDL服务的经验,所以问题可能很明显,但是下面发布的代码都导致:
服务器无法处理请求。-->不允许空用户名和密码。身份验证失败
据我所知,它知道我调用了Login方法,但它没有收到我的登录数据。
来自API:
登录
要求:
用户名(字符串)
密码[String]反应:
SessionId [String](描述:用于进一步API调用的会话id)
我在许多SOAP示例中看到SoapHeader用于身份验证,但它需要一个名称空间,我不知道那将是什么(API没有提到任何名称空间)。
我代码:$username = "blabla";
$password = "bloblo";
$wsdl = "https://bla.bla/bla.asmx?wsdl";
$client = new SoapClient($wsdl, array("trace" => 1, "exception" => 0));
$loginParameters = array("UserName" => $username, "Password" => $password);
//$session = $client->Login->SessionId;
//$session = $client->__soapCall("Login", $loginParameters);
$session = $client->Login($loginParameters);
从WSDL: <s:schema elementFormDefault="qualified" targetNamespace="http://xxxx/external/api/">
<s:element name="Login">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="password" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="LoginResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="LoginResult" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
根据WSDL,您的输入参数称为userName
而不是UserName
(小写u),并且password
都是小写的。所以改成:
$loginParameters = array("userName" => $username, "password" => $password);
在检索结果时,服务返回一个包含结果的响应对象。所以你需要这样做:
$response = $client->Login($loginParameters);
$session = $response->LoginResult;
这个参考可能对头设置很有用,这个答案可能会给您更多关于soap名称空间的提示。