我对SOAP没有相对经验。我试图使用WSDL模式为客户端使用Web服务。我在使用该方法传递参数时遇到问题,并让它们根据需要显示在请求中的参数。我正在使用标准的php soap类。
我需要将SOAP请求的结构如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://hostserver/">
<SOAP-ENV:Body>
<ns1:DoLogin>
<ns1:request>
<ns1:Session>
<ns1:SessionId>00000000-0000-0000-0000-000000000000</ns1:SessionId>
</ns1:Session>
<ns1:UserCredential>
<ns1:UserName>username</ns1:UserName>
<ns1:Password>password</ns1:Password>
<ns1:ApplicationID>00000000-0000-0000-0000-000000000000</ns1:ApplicationID>
<ns1:ClientID>00000000-0000-0000-0000-000000000000</ns1:ClientID>
<ns1:ClientVersion>V1.0</ns1:ClientVersion>
</ns1:UserCredential>
</ns1:request>
</ns1:DoLogin>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
在php中我调用这样的函数:
$client->DoLogin($args);
请求最终如下:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://hostserver/"><SOAP-ENV:Body><ns1:DoLogin/></SOAP-ENV:Body></SOAP-ENV:Envelope>
无论我如何传递args(单个varabiables,数组,类对象),我都无法获得具有该结构的请求。
任何人都可以帮助我吗?我相信它会变得非常简单。
答案 0 :(得分:14)
今天处理一个稍微相关的问题时,我发现以下PHP生成了如下所示的SOAP请求:
$sc = new SoapClient($url);
$params = array('step' => 'ShippingInfo', 'value' => "hello");
$result = $sc->__soapCall('runStep', array('parameters' => $params));
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/">
<SOAP-ENV:Body>
<ns1:runStep>
<ns1:step>ShippingInfo</ns1:step>
<ns1:value>hello</ns1:value>
</ns1:runStep>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我发现的一个问题是,如果我传递的参数($ params)不符合WSDL文件中指定的参数,那么SOAP客户端生成的消息看起来与您抱怨的类似 - 一条消息正文不包含任何数据值。我想知道你的问题是否在这里。
另外,请注意上面的PHP如何使用两个数组来传递参数。第一个数组包含参数及其名称。第二个包含第一个数组。我知道有趣的语法。 : - )
仅供参考,上面的示例代码用于与具有以下合同的C#.Net WCF服务进行通信:
[OperationContract]
string runStep(string step, string value);
答案 1 :(得分:3)
试试这个:
$soapClient->__soapCall('methodToCall', array('parameters' => $yourParamsArray));
这对我来说是一个.NET Web服务。
答案 2 :(得分:1)
This is valid way: right mr.bgondy
$result = $soapClient->methodsomefunction("params1"=>"value","params2"=>"value2");
我的问题是你说过
$soapClient->__soapCall('methodToCall', array('parameters' => $yourParamsArray));
上面的.net web服务代码但是当我为.net asp web服务尝试过这个方法时,参数值不解析我是这么认为的,因为当我删除了params = value not effect same“发生了未知错误!”来自iframe的.net asp web服务。
答案 3 :(得分:0)
我遇到了同样的问题。
这个为我解决了:
$result = $soapClient->somefunction(array(
"param1" => "value1",
"param2" => "value2"
));
参数类型(和顺序)必须与当前wsdl定义的相同。 (字符串,对象等)
答案 4 :(得分:-4)
试试这个,
$client->__soapCall('methodName',array('requestObj'=>$requestObj));