特此记录,备忘。
2017年1月21日13:59:58更新。
使用complextype,设置复杂数据
symfony nusoap server端
$server = new \soap_server();
$server->soap_defencoding = 'UTF-8';
$server->decode_utf8 = false;
$server->xml_encoding = 'UTF-8';
$server->configureWSDL('strings');
$server->wsdl->addComplexType(
'UploadData',
'complexType',
'struct',
'all',
'',
array(
'UploadData'=>array('name'=>'UploadData', 'type'=>'tns:ClinicData')
),
array(
array(
'ref'=>'SOAP-ENC:arrayType',
'wsdl:arrayType'=>'tns:ClinicData[]'
)
),
'tns:ClinicData'
);
$server->wsdl->addComplexType(
'ClinicData',
'complexType',
'struct',
'all',
'',
array(
'Patient'=>array('name'=>'Patient', 'type'=>'tns:PatientItem'),
'Study'=>array('name'=>'Study', 'type'=>'tns:StudyItem'),
'StudyExtCode'=>array('name'=>'StudyExtCode', 'type'=>'tns:StudyExtCodeArray'),
'StudyUid'=>array('name'=>'StudyUid', 'type'=>'tns:StudyUidItem'),
'Result'=>array('name'=>'Result', 'type'=>'tns:ResultItem'),
'StudyType'=>array('name'=>'StudyType', 'type'=>'tns:StudyTypeItem'),
'Insti'=>array('name'=>'Insti', 'type'=>'tns:InstiItem'),
'Doctor'=>array('name'=>'Doctor', 'type'=>'tns:DoctorItem'),
'Department'=>array('name'=>'Patient', 'type'=>'tns:DepartmentItem'),
'Modality'=>array('name'=>'Patient', 'type'=>'tns:ModalityItem'),
'Medical'=>array('name'=>'Patient', 'type'=>'tns:MedicalItem')
)
);
$server->wsdl->addComplexType(
'PatientItem',
'element',
'struct',
'all',
'',
array(
'Name'=>array('name'=>'Name', 'type'=>'xsd:string'),
'Gender'=>array('name'=>'Gender', 'type'=>'xsd:string'),
'Nation'=>array('name'=>'Nation', 'type'=>'xsd:string'),
'MaritalStatus'=>array('name'=>'MaritalStatus', 'type'=>'xsd:string'),
'Birthday'=>array('name'=>'Birthday', 'type'=>'xsd:string'),
'BirthAdr'=>array('name'=>'BirthAdr', 'type'=>'xsd:string'),
'Tel'=>array('name'=>'Tel', 'type'=>'xsd:string'),
'ICD'=>array('name'=>'ICD', 'type'=>'xsd:string'),
'Job'=>array('name'=>'Job', 'type'=>'xsd:string'),
'HomeAddr'=>array('name'=>'HomeAddr', 'type'=>'xsd:string'),
'WorkAddr'=>array('name'=>'WorkAddr', 'type'=>'xsd:string'),
'MedCard'=>array('name'=>'MedCard', 'type'=>'xsd:string'),
'ExtIdty'=>array('name'=>'EMPI', 'type'=>'xsd:string')
)
);
$server->wsdl->addComplexType(
'StudyItem',
'element',
'struct',
'all',
'',
array(
'StudyId'=>array('name'=>'StudyId', 'type'=>'xsd:string'),
'DocumentUid'=>array('name'=>'DocumentUniqueId', 'type'=>'xsd:string'),
'AppliedDate'=>array('name'=>'AppliedDate', 'type'=>'xsd:string'),
'ArrivedDate'=>array('name'=>'ArrivedDate', 'type'=>'xsd:string'),
'ScanType'=>array('name'=>'ScanType', 'type'=>'xsd:string'),
'BodyPart'=>array('name'=>'BodyPart', 'type'=>'xsd:string'),
'StartTime'=>array('name'=>'StartTime', 'type'=>'xsd:string'),
'FinishTime'=>array('name'=>'FinishTime', 'type'=>'xsd:string'),
'StudyStatus'=>array('name'=>'StudyStatus', 'type'=>'xsd:string'),
'RegisterDoctor'=>array('name'=>'RegisterDoctor', 'type'=>'xsd:string'),
'PatientType'=>array('name'=>'PatientType', 'type'=>'xsd:string'),
'ReportPublishTimes'=>array('name'=>'ReportPublishTimes', 'type'=>'xsd:int'),
'BrowseLevel'=>array('name'=>'BrowseLevel', 'type'=>'xsd:int'),
'PrintedTimes'=>array('name'=>'PrintedTimes', 'type'=>'xsd:int'),
'StudyAge'=>array('name'=>'StudyAge', 'type'=>'xsd:string'),
'YinYang'=>array('name'=>'YinYang', 'type'=>'xsd:int'),
'CrisisLevel'=>array('name'=>'CrisisLevel', 'type'=>'xsd:int')
)
);
$server->wsdl->addComplexType(
'StudyExtCodeArray',
'sequence',
'array',
'all',
'',
array(
'ExtCodes' => array('name' => 'ExtCodes', 'type' => 'tns:StudyExtCodeItem')
),
array(
array(
'ref'=>'SOAP-ENC:arrayType',
'wsdl:arrayType'=>'tns:StudyExtCodeItem[]'
)
),
'tns:StudyExtCodeItem'
);
$server->wsdl->addComplexType(
'StudyExtCodeItem',
'element',
'struct',
'all',
'',
array(
'CodeKey'=>array('name'=>'CodeKey', 'type'=>'xsd:string'),
'CodeValue'=>array('name'=>'CodeValue', 'type'=>'xsd:string')
)
);
$server->wsdl->addComplexType(
'StudyUidItem',
'element',
'struct',
'all',
'',
array(
'StudyUid'=>array('name'=>'StudyUid', 'type'=>'xsd:string'),
'SeriesUid'=>array('name'=>'SeriesUid', 'type'=>'xsd:string'),
'IsConsult'=>array('name'=>'IsConsult', 'type'=>'xsd:int'),
'GwModality'=>array('name'=>'GwModality', 'type'=>'xsd:string')
)
);
$server->wsdl->addComplexType(
'ResultItem',
'element',
'struct',
'all',
'',
array(
'Finding'=>array('name'=>'Finding', 'type'=>'xsd:string'),
'Diagnose'=>array('name'=>'Diagnose', 'type'=>'xsd:string')
)
);
$server->wsdl->addComplexType(
'StudyTypeItem',
'element',
'struct',
'all',
'',
array(
'StudyType'=>array('name'=>'StudyType', 'type'=>'xsd:string')
)
);
$server->wsdl->addComplexType(
'InstiItem',
'element',
'struct',
'all',
'',
array(
'InstiCode'=>array('name'=>'InstiCode', 'type'=>'xsd:string'),
'InstiName'=>array('name'=>'InstiName', 'type'=>'xsd:string'),
'Disabled'=>array('name'=>'Disabled', 'type'=>'xsd:string')
)
);
$server->wsdl->addComplexType(
'DoctorItem',
'element',
'struct',
'all',
'',
array(
'AppliedDoctor'=>array('name'=>'AppliedDoctor', 'type'=>'xsd:string'),
'ExamDoctor'=>array('name'=>'ExamDoctor', 'type'=>'xsd:string'),
'Censor'=>array('name'=>'Censor', 'type'=>'xsd:string'),
'AppliedDoctorType'=>array('name'=>'AppliedDoctorType', 'type'=>'xsd:string'),
'ExamDoctorType'=>array('name'=>'ExamDoctorType', 'type'=>'xsd:string'),
'CensorType'=>array('name'=>'CensorType', 'type'=>'xsd:string')
)
);
$server->wsdl->addComplexType(
'DepartmentItem',
'element',
'struct',
'all',
'',
array(
'AppliedDept'=>array('name'=>'Department', 'type'=>'xsd:string'),
'ExamDept'=>array('name'=>'ExamDept', 'type'=>'xsd:string'),
'AppliedDeptType'=>array('name'=>'AppliedDeptType', 'type'=>'xsd:string'),
'ExamDeptType'=>array('name'=>'ExamDeptType', 'type'=>'xsd:string'),
'AppliedDeptCode'=>array('name'=>'AppliedDeptCode', 'type'=>'xsd:string'),
'ExamDeptCode'=>array('name'=>'ExamDeptCode', 'type'=>'xsd:string')
)
);
$server->wsdl->addComplexType(
'ModalityItem',
'element',
'struct',
'all',
'',
array(
'Modality'=>array('name'=>'Modality', 'type'=>'xsd:string'),
'ModalityType'=>array('name'=>'ModalityType', 'type'=>'xsd:string')
)
);
$server->wsdl->addComplexType(
'MedicalItem',
'element',
'struct',
'all',
'',
array(
'VisitId'=>array('name'=>'VisitId', 'type'=>'xsd:int'),
'EffectiveTime'=>array('name'=>'EffectiveTime', 'type'=>'xsd:string'),
'DomainId'=>array('name'=>'DomainId', 'type'=>'xsd:string')
)
);
$server->wsdl->addComplexType(
'UploadResult',
'complexType',
'struct',
'all',
'',
array(
'code'=>array('name'=>'code', 'type'=>'xsd:string'),
'info'=>array('name'=>'info', 'type'=>'xsd:string'),
'count'=>array('name'=>'count', 'type'=>'xsd:int')
)
);
// set our namespace
// $server->wsdl->schemaTargetNamespace = $namespace;
$server->register(
'soap.strings',
array('data'=>'tns:UploadData'),
array('return'=>'tns:UploadResult'),
false,
'rpc',
'encoded'
);
$response = new Response($server->service($request->getContent()));
$response->headers->set('Content-Type', 'text/xml');
return $response->send();
客户端
<?php
require_once("lib/nusoap.php");
$proxyhost = isset($_POST['proxyhost']) ? $_POST['proxyhost'] : '';
$proxyport = isset($_POST['proxyport']) ? $_POST['proxyport'] : '';
$proxyusername = isset($_POST['proxyusername']) ? $_POST['proxyusername'] : '';
$proxypassword = isset($_POST['proxypassword']) ? $_POST['proxypassword'] : '';
$useCURL = isset($_POST['usecurl']) ? $_POST['usecurl'] : '0';
$client = new nusoap_client("http://www.bbb.com/app_dev.php/soap?wsdl", false,
$proxyhost, $proxyport, $proxyusername, $proxypassword);
$err = $client->getError();
if ($err) {
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->getDebug(), ENT_QUOTES) . '</pre>';
exit();
}
$client->setUseCurl($useCURL);
// This is an archaic parameter list
$data = array(
'UploadData'=>array(
'Patient'=>array(
'Name'=>'胡一菲',
'Gender'=>'女',
'Nation'=>'中国',
'MaritalStatus'=>'未婚',
'Birthday'=>'1987-05-31 18:35:37',
'BirthAdr'=>'湖南衡阳',
'Tel'=>'15812138004',
'ICD'=>'431027198705311630',
'Job'=>'',
'HomeAddr'=>'',
'WorkAddr'=>'',
'MedCard'=>'',
'ExtIdty'=>''
),
'Study'=>array(
'StudyId'=>'MR12138014',
'DocumentUid'=>'1.2.826.0.1.3680043.2.461.7666576.2129103229',
'AppliedDate'=>'2016-12-20 08:45:00',
'ArrivedDate'=>'2016-12-21 08:45:00',
'ScanType'=>'',
'BodyPart'=>'{脚踝}',
'StartTime'=>'',
'FinishTime'=>'',
'StudyStatus'=>'1300',
'RegisterDoctor'=>'黄辉冯',
'PatientType'=>'门诊',
'ReportPublishTimes'=>1,
'BrowseLevel'=>'1',
'PrintedTimes'=>0,
'StudyAge'=>'29',
'YinYang'=>0,
'CrisisLevel'=>0
),
'StudyExtCode'=>array(
'ExtCodes' => array(
array(
'CodeKey' => 'HisCode1',
'CodeValue' => '1213801'
),
array(
'CodeKey' => 'HisCode2',
'CodeValue' => '1122345'
),
array(
'CodeKey' => 'VisitCode',
'CodeValue' => '123789'
)
)
),
'StudyUid'=>array(
'StudyUid'=>'1.2.826.0.1.3680043.2.461.7666576.2129103229',
'SeriesUid'=>'1.2.826.0.1.3680043.2.461.7666576.2129103229',
'IsConsult'=>1,
'GwModality'=>'RIS'
),
'Result'=>array(
'Finding'=>'以Topogram片为定位标志,行鼻咽部横断位平扫及增强扫描,层厚5mm,层距5mm。',
'Diagnose'=>'鼻咽部横断位平扫及增强扫描未见病变。'
),
'StudyType'=>array(
'StudyType'=>'平诊'
),
'Insti'=>array(
'InstiCode'=>'111235-4',
'InstiName'=>'郴州市第四人民医院',
'Disabled'=>0
),
'Doctor'=>array(
'AppliedDoctor'=>'华佗',
'ExamDoctor'=>'张仲景',
'Censor'=>'孙思邈',
'AppliedDoctorType'=>'主治医生',
'ExamDoctorType'=>'主治医生',
'CensorType'=>'主任医生'
),
'Department'=>array(
'AppliedDept'=>'放射一科',
'ExamDept'=>'放射二科',
'AppliedDeptType'=>'放射科',
'ExamDeptType'=>'放射科',
'AppliedDeptCode'=>'X0001',
'ExamDeptCode'=>'X0002'
),
'Modality'=>array(
'Modality'=>'CT',
'ModalityType'=>'放射类'
),
'Medical'=>array(
'VisitId'=>'30939967229998654',
'EffectiveTime'=>'2016-12-21 11:30:00',
'DomainId'=>'3001'
)
)
);
$result = $client->call('soap.strings', $data);
if ($client->fault) {
echo '<h2>Fault (Expect - The request contains an invalid SOAP body)</h2><pre>'; print_r($result); echo '</pre>';
} else {
$err = $client->getError();
if ($err) {
echo '<h2>Error</h2><pre>' . $err . '</pre>';
} else {
echo '<h2>Result</h2><pre>'; print_r($result); echo '</pre>';
}
}
echo '<h2>Request</h2><pre>' . $client->request . '</pre>';
echo '<h2>Response</h2><pre>' . $client->response . '</pre>';
echo '<h2>Debug</h2><pre>' . $client->getDebug() . '</pre>';