SOAP PHP вызывает .NET.Нет параметров - PullRequest
2 голосов
/ 19 ноября 2010

Народ,

Я использую SOAPClient в PHP для вызова веб-службы .NET.Все хорошо и прекрасно, вплоть до момента, когда я передаю параметры.Удаленный веб-сервис отправляет запрос в файл 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?

Ответы [ 3 ]

3 голосов
/ 19 ноября 2010

Чтобы оправдать ваши опасения: ДА, работа с 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-текст.

0 голосов
/ 22 ноября 2010

Просто для того, чтобы вы все знали, как мы справились ... у меня возникла проблема из-за определения более сложного типа, поэтому он никогда не входил в функцию как отдельные параметры, он входил в функцию как класс, это толькопроизошло, когда была определена карта классов.

Мы поняли, что при попытке использовать службу через .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/'));#

Массив параметров передается как обычно.Спасибо вам обоим за помощь, хотя и не совсем то направление, которое мне было нужно.

0 голосов
/ 19 ноября 2010

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.

...