PHP Soap не создает правильный XML-документ - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь использовать этот WSDL-сервис: https://wsaimport.uni -login.dk / wsaimport-v5 / ws? WSDL

Требуется XML-документ с информацией о пользователях.импортировать.При импорте лица два атрибута являются обязательными (согласно https://wsaimport.uni -login.dk / wsaimport-v5 / ws? Xsd = 1 ): (например, <xs:attribute name="protected" type="xs:boolean" use="required">).

Я создаю объект с необходимой информацией (и, конечно, больше) (пользователь и личный идентификатор являются поддельными):

object (XMLinst) # 5 (1) {["UNILoginImport"] => object (UNILoginImport) # 6 (5) {["sourceDateTime"] => string (19) "2018-10-20T00: 15: 54" ["source"] => string (10) "SurveyInfo" ["schoolYear"] => string (9)" 2018-2019 "[" sourceVersion "] => string (3)" 0.1 "[" Institution "] => object (Institution) # 7 (4) {[" InstitutionNumber "] => string (5) "10150" ["InstitutionName"] => NULL ["Group"] => object (Group) # 8 (7) {["GroupId"] => string (2) "7b" ["GroupName"] => string (3)" 7.B "[" GroupType "] => string (11)" Hovedgruppe "[" GroupLevel "] => string (2)" DT "[" Line "] => string (1) "B" ["FromDate"] => string (10) "2018-08-01" ["ToDate"] => string (10) "2019-06-30"} ["InstitutionPerson"] => массив(1) {[0] => object (InstitutionPerson) # 9 (5) {["LocalPersonId"] => string (11) "310900-8345" ["Person"] => object (Person) # 10 (16) {["protected"] => bool (false) ["verifyLevel"] => string (1) "0"[" FirstName "] => string (9)" Tester A. "["FamilyName"] => string (9) "Testersen" ["CivilRegistrationNumber"] => string (11) "310900-8345" ["EmailAddress"] => NULL ["BirthDate"] => string (10) "2000-09-31 "[" Gender "] => string (1)" M "[" PhotoId "] => NULL [" AliasFirstName "] => NULL [" AliasFamilyName "] => NULL [" Address "] => NULL ["HomePhoneNumber"] => NULL ["WorkPhoneNumber"] => NULL ["MobilePhoneNumber"] => NULL ["GroupId"] => string (2) "7b"} ["Student"] => object (Студент) # 11 (6) {["Role"] => string (4) "Elev" ["StudentNumber"] => NULL ["Level"] => string (2) "DT" ["Location"] => string (8) "B-rummet" ["MainGroupId"] => string (2) "7b" ["GroupId"] => NULL} ["Employee"] => NULL ["Extern"] => NULL}}}}}

Я звоню клиенту, а затем функция импорта:

$unilogin = new SoapClient($WSDL,array("soap_version" => SOAP_1_2,'cafile' => "/etc/ssl/certs/surveyinfo.pem", 'cache_wsdl'=>"WSDL_CACHE_NONE", 'cache'=>"WSDL_CACHE_NONE", 'trace'=>true));

$unilogin->importerDeltaXml(array("wsBrugerid"=>$user,"wsPassword"=>$pass,"xml"=>$import));

Этовозвращает ошибку:

org.xml.sax.SAXParseException;cvc-complex-type.4: атрибут 'protected' должен появляться в элементе 'ns3: Person'.

Возвращение из getLastResponse выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="https://uni-login.dk" xmlns:ns2="https://uni-login.dk/data" xmlns:ns3="https://wsaimport.uni-login.dk/import" xmlns:ns4="https://wsaimport.uni-login.dk/ws"><env:Body><ns4:importerDeltaXml><ns1:wsBrugerid/><ns1:wsPassword/><ns4:xml><ns3:UNILoginImport sourceVersion="0.1" sourceDateTime="2018-10-20T00:12:28" source="SurveyInfo" schoolYear="2018-2019"><ns3:Institution><ns2:InstitutionNumber>10150</ns2:InstitutionNumber><ns2:Group><ns2:GroupId>7b</ns2:GroupId><ns2:GroupName>7.B</ns2:GroupName><ns2:GroupType>Hovedgruppe</ns2:GroupType><ns2:GroupLevel>DT</ns2:GroupLevel><ns2:Line>B</ns2:Line><ns2:FromDate>2018-08-01</ns2:FromDate><ns2:ToDate>2019-06-30</ns2:ToDate></ns2:Group><ns3:InstitutionPerson><ns2:LocalPersonId>310400-8444</ns2:LocalPersonId><ns3:Person><ns2:FirstName>Tester A.</ns2:FirstName><ns2:FamilyName>Testersen</ns2:FamilyName><ns2:CivilRegistrationNumber>310400-8444</ns2:CivilRegistrationNumber><ns2:BirthDate>2000-04-31</ns2:BirthDate><ns2:Gender>K</ns2:Gender></ns3:Person><ns3:Student><ns2:Role>Elev</ns2:Role><ns2:Level>DT</ns2:Level><ns2:Location>B-rummet</ns2:Location><ns2:MainGroupId>7b</ns2:MainGroupId></ns3:Student></ns3:InstitutionPerson></ns3:Institution></ns3:UNILoginImport></ns4:xml></ns4:importerDeltaXml></env:Body></env:Envelope>

Как видите, protected и verificationLevel не являются частью XML, даже если они присутствовали в объекте, представленном в SOAP.Как вы также можете видеть, функция SOAP-клиента в PHP фактически способна генерировать атрибуты в соответствии с запросом WSDL-документа, потому что это делается в теге <ns3:UNILoginImport>.

Я столкнулся с ошибкойв PHP SoapClient?Или что-то не так в WSDL-документах?(он выпускается правительственным агентством Дании, и ряд компаний уже используют его).

Какой-нибудь совет, как обойти эту проблему?Я пытался использовать XML-документ, полученный из __getLastRequest, вставляя запрошенные атрибуты, но при отправке этого XML-документа после помещения его в новый SoapVar я получаю сообщение «Не удалось скопировать сообщение» ... Спасибо!

1 Ответ

0 голосов
/ 18 ноября 2018

Я нашел обходной путь, расширив SOAP-клиент следующим образом:

class HackSoapClient extends SoapClient {

        function __doRequest($request, $location, $action, $version, $one_way = NULL) {

            $request=str_replace('<ns3:Person>','<ns3:Person protected="false" verificationLevel="0">',$request);
            // parent call
            return parent::__doRequest($request, $location, $action, $version,$one_way);
        }
    }
...