1

Web サービスを呼び出したい。また、Web サービスにはいくつかの 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>

複合型:

   <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>

そしてPHPコード(それは機能していません):

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 

トライアンドキャッチで:

End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected. Found element 'param1' from namespace ''. Line 2, position 155.
4

1 に答える 1

1

それで、私はあなたの問題を再現しようとしましたが、あなたのサービスにアクセスできなかったので、追加するまで機能しなかった温度変換を選択しました

$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 実行時の内部サーバー エラー

于 2013-09-13T22:27:17.997 に答える