我正在尝试使用此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">
(。
我生成了一个包含所需信息(当然还有更多(的对象(用户和个人 ID 是假的(:
object(XMLinst(#5 (1( { ["UNILoginImport"]=> object(UNILoginImport(#6 (5( { ["sourceDateTime"]=>string(19( "2018-10-20T00:15:54" ["源"]=>字符串(10( "调查信息" ["学年"]=>字符串(9( "2018-2019" ["sourceVersion"]=>string(3( "0.1" ["机构"]=>对象(机构(#7 (4( { ["机构编号"]=>字符串(5( "10150" ["机构名称"]=>空 ["组"]=>对象(组(#8 (7( { ["GroupId"]=>string(2( "7b" ["组名"]=>字符串(3( "7.B" ["GroupType"]=>string(11( "Hovedgruppe" ["组级别"]=>字符串(2( "DT" ["行"]=>字符串(1( "B" ["FromDate"]=>string(10( "2018-08-01" ["ToDate"]=>string(10( "2019-06-30" } ["InstitutionPerson"]=>array(1( { [0]=>对象(InstitutionPerson(#9 (5( { ["LocalPersonId"]=>string(11( "310900-8345" ["Person"]=>object(Person(#10 (16( { ["受保护"]=>布尔(假( ["验证级别"]=>字符串(1( "0" ["名字"]=>字符串(9( "测试人员 A." ["姓氏"]=>字符串(9( "泰斯特森" ["民事登记号"]=>字符串(11( "310900-8345" ["电子邮件地址"]=>空 ["出生日期"]=>字符串(10( "2000-09-31" ["性别"]=>字符串(1( "M" ["PhotoId"]=>NULL ["别名名字"]=>空 ["别名"]=>空 ["地址"]=>空 ["家庭电话号码"]=>空 ["工作电话号码"]=>空 ["手机号码"]=>空 ["GroupId"]=>string(2( "7b" } ["学生"]=>对象(学生(#11 (6( { ["角色"]=>字符串(4( "提升" ["学生编号"]=>空 ["电平"]=>字符串(2( "DT" ["位置"]=>字符串(8( "B-翻滚" ["MainGroupId"]=>string(2( "7b" ["组 ID"]=>空 } ["员工"]=>空 ["外部"]=>空 } } } } }
我正在调用客户端,然后调用导入函数:
$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 的对象中。正如你所看到的,PHP 中的 SOAP-client 函数实际上能够根据 WSDL 文档的请求生成属性,因为它是在<ns3:UNILoginImport>
标记中完成的。
我在PHP的SoapClient中遇到过错误吗?还是 WSDL 文档中有问题?(它是由丹麦政府机构生产的,许多公司已经在使用它(。
关于如何解决这个问题的任何建议?我尝试使用从__getLastRequest获得的XML文档,插入请求的属性,但是在发送此XML文档时,将其通过新的SoapVar放置后,我得到"无法复制消息"... 谢谢!
我找到了一种解决方法,方法是通过以下方式扩展 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);
}
}