调用.NET的SOAP PHP。没有参数
Folk,调用.NET的SOAP PHP。没有参数
我在PHP中使用SOAPClient来调用一个.NET web服务。所有的罚款和花花公子,直到我传递参数的点。远程web服务向处理响应的listener.php文件发出请求,但是目前它似乎无法获取参数...在发送请求之前检查请求似乎没有显示参数在XML中。
有人可以明确告诉我如何传递参数吗?到目前为止,我已经看到了约3个不同的方式,包括但不限于以下内容:
$pCriteria->AuctionID = new SoapVar($auction_id, XSD_INT, 'xsd:int');
或:
$ar_bidupdate_params_total = array('AuctionID' => $auction_id,'parameter2... etc..)
或:
$ar_bidupdate_params = array( new SoapParam($auction_id, 'AuctionID'),
示例代码还显示了以各种方式调用的方法(从我所见过的方面来说) ound网)。
$info = $soapClient->__call("BidUpdate", array($pCriteria));
或
$info = $client->BidUpdate($pCriteria);
的问题是,1)我怎么可靠地传递这些参数,使用原生SoapClient的,和2)什么是做到这一点的最好方法是什么?
另外,如果我不能让这个玩球,我可能只是在飞行中建立XML。如果我选择这种方法,发送XML字符串的最佳方式是什么?
为了证明您的担忧:是的,使用SoapClient可能会令人沮丧。主要是因为文档。不过,这里有一段针对你的示例代码,我后来为一个项目工作。我最终将这种技术用于支付网关的库中。我知道这与从字符串名称中解除引用的函数调用并不完全相同,但它确实有效。
$method = "ACTION";
$wsdl = "WSDLFILE.wsdl";
$parameters = array (
'location' => "http://url.com",
'local_cert' => "/full/path/to/CERTIFICATE.pem,"
'passphrase' => "TEST-PASSWORD",
'use' => SOAP_ENCODED ,
'connection_timeout' => 4,
'user_agent' => null
);
$client = new SoapClient($wsdl, $parameters);
$response = $client->{$method}($data);
var_dump($response);
要细说,你有你的WSDL和证书设置(如果需要)后,则SoapClient的创建上飞函数($方法),对应于什么在WSDL,即:一个动作如“Capture()”或“Authorize()”。客户端然后处理XML发送/解析。无论您是否使用SOAP_ENCODED,以及如何传递参数都取决于另一端的内容。
虽然我已经处理了手动创建信封XML,但我建议不要这样做。只要你得到一个很好的WSDL转储,一个.NET项目将自动执行并且不应该是一个问题,这是避免维护噩梦的好方法,如果/当它被更改/更新时,而不是必须手动旋转XML文本。
1)如何使用本机SoapClient可靠地传递这些参数 这很困难,因为PHP不喜欢提供非常好的调试错误。确保你测试了所有的电话,以确保你的超时设置正确(PHP只是在超时错误时返回false)并且你的参数是正确的。唯一能够可靠地做到这一点的方法是确保您知道哪些功能适用于您的系统,并保留在这些参数中。检查所有不同的选项(超时,凭证等),并与他们一起玩,直到你得到一些真正可靠的东西。
2)这样做的最佳方法是什么? 你的这两个调用都是正确的语法,而参数结构实际上并不那么复杂,它只是让首先工作的东西成为难题。我的结构通常是这样的: $ opts = array(... options ...); $ client = new SoapClient('https://URL/WebAPI/WebAPI.asmx?WSDL',$ opts);
$paramters = array('a_sUserID' => $un, 'a_sUserPass' => $pw, 'xmlBatch' => $createTicketXML);
然后调用,如:
$result = $client->call('GetAllMembers',$paramters);
这是一个正常的循环我做一个成功的结果:
foreach ($result['GetMemberAllResult']['MemberData'] as $key => $value)
{
//code
}
,帮助我走出最虽然是我得到的东西使用SoapUI(http://www.soapui.org/)设置所有内容,然后将所有内容迁移到PHP。在那里,您可以运行测试,并使用为SOAP制作的工具准确找出您的呼叫中发生的情况。
只是为了让大家都知道我们是怎么做到的..我遇到的问题是由于定义了更复杂的类型,因此它从不作为单个参数进入函数,它作为类输入函数,只有在定义了'classmap'时才会发生。
我们意识到当尝试通过.NET使用服务时需要额外的东西 - (MS在Visual Studio中将所有内容都捆绑在一起)很明显,一个额外的类被作为参数传递,并且可能会如果我们能够更多地理解WSDL,那就显而易见了。
$classmap = array('UpdateInfo' => 'UpdateInfo');
$server = new SoapServer("domain.com/Listener.wsdl", array('classmap' => $classmap, 'soap_version' => SOAP_1_2, 'encoding' => 'UTF-8', 'uri' => 'http://tempuri.org/'));#
参数数组正常传递。感谢你们两位的帮助,虽然不是我需要的方向。
非常欢迎。并且,感谢分享。总的来说,我对SOAP的使用经验让我们很难工作,尽管它很好。 – zanlok 2010-11-24 16:58:47
建议您缓存wsdl文件以保持速度更快并减少不必要的净流量。 – zanlok 2010-11-19 21:00:37
根据php网站,“__call”已弃用,“__soapCall”更适用于非wsdl模式。您可以直接在对象上调用方法,并将它们解引用,以便它们不在主通信模块中进行硬编码,而是在自定义类代码中的其他位置指定。 http://www.php.net/manual/en/soapclient.soapcall.php – zanlok 2010-11-19 21:04:46