Я пытаюсь написать SOAP-клиент для службы по адресу https://webservice.kareo.com/services/soap/2.1/KareoServices.svc?wsdl
Я запросил типы (_ getTypes) и функции ( _getFunctions), которые предлагает сервис. Ниже приведена структура типа для операции GetPatients, которую я пытаюсь выполнить:
struct GetPatients { GetPatientsReq request; } struct GetPatientsReq { PatientFieldsToReturn Fields; PatientFilter Filter; } struct PatientFieldsToReturn { boolean AddressLine1; boolean AddressLine2; boolean Age; . . . } struct PatientFilter { string CollectionCategoryName; string DefaultCasePayerScenario; string FirstName; . . . } struct GetPatientsResponse { GetPatientsResp GetPatientsResult; } struct GetPatientsResp { ArrayOfPatientData Patients; } struct ArrayOfPatientData { PatientData PatientData; } struct PatientData { string AddressLine1; string AddressLine2; string Adjustments; string Age; . . . }
Определение функции:
GetPatientsResponse GetPatients (параметры GetPatients $)
Ниже приведен мой PHP-код, который пытается использовать операцию GetPatients в веб-службе:
<?php $url="https://webservice.kareo.com/services/soap/2.1/KareoServices.svc?wsdl"; $client=new SoapClient($url); /* fake user, password, key */ $CustomerKey='xxx'; $User='rmg15'; $Password='pass77'; $PatientID='1234'; $authheader=array("CustomerKey"=>$CustomerKey,"User"=>$User,"Password"=>$Password); $header = new SoapHeader("https://webservice.kareo.com/services/soap/2.1/","AuthHeader", $authheader,false); $client->__setSoapHeaders(array($header)); /* it works till this point because I was able to successfully perform the __getTypes, __getFunctions operations. */ $filter= array("FirstName"=>"rmg15"); $fields=array("age"=>"true"); $request=array("PatientFieldsToReturn"=>$fields,"PatientFilter"=>$filter); $getpatientreq=array("GetPatientsReq"=>$request); try { $presponse=$client->GetPatients($getpatientreq); } catch (Exception $ex) { var_dump($ex->faultcode, $ex->faultstring, $ex->faultactor, $ex->detail, $ex->_name, $ex->headerfault); } ?>
Это исключение, которое я получаю от службы:
"В экземпляре объекта не задана ссылка на объект."
Исключение выбрано в этой строке:
$ Presponse = $ client-> GetPatients ($ getpatientreq)
Вот полное сообщение об исключении:
object(stdClass)#7 (1) { ["ExceptionDetail"]=> object(stdClass)#8 (5) { ["HelpLink"]=> NULL ["InnerException"]=> NULL ["Message"]=> string(53) "Object reference not set to an instance of an object." ["StackTrace"]=> string(755) " at KareoServicesWCF.KareoServices.GetPatients(GetPatientsReq request) in c:\BuildAgent\work\309fd08b06e24475\Superbill\Software\Application\KareoServicesWCF\2.1\KareoServicesWCF\KareoServices.cs:line 497 at SyncInvokeGetPatients(Object , Object[] , Object[] ) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)" ["Type"]=> string(29) "System.NullReferenceException"
Это первый клиент SOAP, который я пишу. Любая помощь в исправлении этого будет полезна.