Я хочу позвонить в веб-сервис. И веб-сервис содержит некоторые элементы complextype. Я получаю хорошие результаты с ASP.NET и soapUI. Но я получаю сообщение об ошибке с PHP. Я не мог понять.
Итак, вы могли бы мне помочь?
Благодарю.
Функция, которую я хочу вызвать:
<xs:element name="GetHotelSearch"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="searchClass" nillable="true" type="q13:HotelSearch" xmlns:q13="http://schemas.datacontract.org/2004/07/Model"/> <xs:element minOccurs="0" name="recorCount" type="xs:int"/> <xs:element minOccurs="0" name="sortType" type="q14:SortType" xmlns:q14="http://schemas.datacontract.org/2004/07/Model"/> <xs:element minOccurs="0" name="sortFields" nillable="true" type="q15:ArrayOfSortField" xmlns:q15="http://schemas.datacontract.org/2004/07/Model"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="GetHotelSearchResponse"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="GetHotelSearchResult" nillable="true" type="q16:ArrayOfHotelSummary" xmlns:q16="http://schemas.datacontract.org/2004/07/Model"/> <xs:element minOccurs="0" name="recorCount" type="xs:int"/> </xs:sequence> </xs:complexType> </xs:element>
ComplexTypes:
<xs:complexType name="HotelSearch"> <xs:sequence> <xs:element minOccurs="0" name="BRANCHID" type="xs:int"/> <xs:element minOccurs="0" name="UNIQUECODE" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:simpleType name="SortType"> <xs:restriction base="xs:string"> <xs:enumeration value="Ascending"> <xs:annotation> <xs:appinfo> <EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">1</EnumerationValue> </xs:appinfo> </xs:annotation> </xs:enumeration> <xs:enumeration value="Descending"> <xs:annotation> <xs:appinfo> <EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">2</EnumerationValue> </xs:appinfo> </xs:annotation> </xs:enumeration> </xs:restriction> </xs:simpleType> <xs:element name="SortType" nillable="true" type="tns:SortType"/> <xs:complexType name="ArrayOfSortField"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="SortField" type="tns:SortField"/> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfSortField" nillable="true" type="tns:ArrayOfSortField"/> <xs:simpleType name="SortField"> <xs:restriction base="xs:string"> <xs:enumeration value="PENSIONTYPENAME"> <xs:annotation> <xs:appinfo> <EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">1</EnumerationValue> </xs:appinfo> </xs:annotation> </xs:enumeration> <xs:enumeration value="HOTELNAME"> <xs:annotation> <xs:appinfo> <EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">2</EnumerationValue> </xs:appinfo> </xs:annotation> </xs:enumeration> </xs:restriction> </xs:simpleType> <xs:element name="SortField" nillable="true" type="tns:SortField"/>
Код .NET (он работает):
int _recordCount = 10; List<HotelSummary> hotels = hc.GetHotelSearch(new HotelSearch() { BRANCHID = 000, UNIQUECODE = "YIO" }, ref _recordCount, SortType.Ascending, new SortField[] { SortField.HOTELNAME }).ToList();
XML (он работает с soapUI):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:mod="http://schemas.datacontract.org/2004/07/Model"> <soapenv:Header/> <soapenv:Body> <tem:GetHotelSearch> <tem:searchClass> <mod:BRANCHID>000</mod:BRANCHID> <mod:UNIQUECODE>YIO</mod:UNIQUECODE> </tem:searchClass> <tem:recorCount>10</tem:recorCount> <tem:sortType>Ascending</tem:sortType> <tem:sortFields> <mod:SortField>HOTELNAME</mod:SortField> </tem:sortFields> </tem:GetHotelSearch> </soapenv:Body> </soapenv:Envelope>
Название<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:mod="http://schemas.datacontract.org/2004/07/Model"> <soapenv:Header/> <soapenv:Body> <tem:GetHotelSearch> <tem:searchClass> <mod:BRANCHID>000</mod:BRANCHID> <mod:UNIQUECODE>YIO</mod:UNIQUECODE> </tem:searchClass> <tem:recorCount>10</tem:recorCount> <tem:sortType>Ascending</tem:sortType> <tem:sortFields> <mod:SortField>HOTELNAME</mod:SortField> </tem:sortFields> </tem:GetHotelSearch> </soapenv:Body> </soapenv:Envelope>
И PHP Code (это не РАБОТАЕТ):
ini_set("soap.wsdl_cache_enabled", "0"); $url='http://localhost/Service/Service.svc?wsdl'; $client = new SoapClient($url); $HotelSearch= array('BRANCHID' => 000,'UNIQUECODE' => 'YIO'); $SortField= array('SortField' => 'HOTELNAME'); $result = $client->GetHotelSearch($HotelSearch, 10, 'Ascending', $SortField); $array = $result->GetHotelSearchResult->HotelSummary;
Я получаю эту ошибку:
Fatal error: Uncaught SoapFault exception: [a:InternalServiceFault] End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected. Found element 'param1' from namespace ''. Line 2, position 155. in D:\[.Projeler]\musteri\webservis\test.php:98 Stack trace: #0 D:\[.Projeler]\musteri\webservis\test.php(98): SoapClient->__call('GetHotelSearch', Array) #1 D:\[.Projeler]\musteri\webservis\test.php(98): SoapClient->GetHotelSearch(Array, 10, 'Ascending', Object(stdClass)) #2 {main} thrown in D:\[.Projeler]\musteri\webservis\test.php on line 98
С try and catch:
End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected. Found element 'param1' from namespace ''. Line 2, position 155.
Итак, я попытался воссоздать вашу проблему, и поскольку у меня не было доступа к вашему сервису, я выбираю преобразование температуры, которое не сработало, пока я не добавил
$SoapCallParameters = new stdClass(); $SoapCallParameters->nCelcius = 30; $obj = $client->CelciusToFahrenheit($SoapCallParameters);
возможно, вы также можете попробовать использовать stdClass как-то вроде
$hotelSearch = new stdClass(); $hotelSearch->searchClass->BRANCHID = 000; $hotelSearch->searchClass->UNIQUECODE = YIO;
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Вы должны знать, что я изучаю php, и единственный способ, которым я участвую, – решить проблемы, так что это я пытаюсь решить проблему.
рабочий рабочий код преобразования рабочей силы ниже:
error_reporting(E_ALL); ini_set('display_errors', '1'); $url = "http://webservices.daehosting.com/services/TemperatureConversions.wso?WSDL"; $client = new SoapClient($url, array("trace" => 1, "exception" => 0)); var_dump($client->__getFunctions()); $SOAPCall = "CelciusToFahrenheit"; $SoapCallParameters = new stdClass(); $SoapCallParameters->nCelcius = 30; $obj = $client->CelciusToFahrenheit($SoapCallParameters); var_dump($obj);
У меня была помощь от @Sergiu Paraschiv
ошибка внутреннего сервера при запуске soapclient