民间,
我在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'),
示例代码还显示了以各种方式调用此函数(从我在网络上看到的内容)。
$info = $soapClient->__call("BidUpdate", array($pCriteria));
或
$info = $client->BidUpdate($pCriteria);
问题是,1)如何使用原生SoapClient可靠地传递这些参数,以及2)最好的方法是什么?
或者,如果我不能让它打球,我可能会动态构建XML。如果我选择这种方法,发送XML字符串的最佳方法是什么?
答案 0 :(得分:3)
为了证明您的担忧:是的,使用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中的内容相对应的函数($ method),即:对于诸如“Capture”之类的操作()“或”授权()“。然后客户端处理XML发送/解析。是否使用SOAP_ENCODED,以及如何传递参数实际上取决于另一端的内容。
我已经处理过手动创建信封XML,但我建议不要这样做。只要你得到一个好的WSDL转储,一个.NET项目将自动执行并且不应该是一个问题,这是一个很好的方法来避免维护噩梦如果/当它被更改/更新,而不是必须手动旋转XML文本。
答案 1 :(得分:0)
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制作的工具确切地确定调用中发生的情况。
答案 2 :(得分:0)
只是为了让大家知道我们是怎么做的...我遇到的问题是由于定义了一个更复杂的类型,因此它从未作为单独的参数输入函数,它作为一个类进入函数,这只是在定义'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/'));#
参数数组正常传递。感谢你们两位的帮助,尽管不是我需要的方向。