2

Zend フレームワーク 2 で SOAP クライアントを作成しようとしています。データを正しく返す以下を作成しました。

try {
  $client = new Zend\Soap\Client("http://www.webservicex.net/country.asmx?WSDL");
  $result = $client->GetCountries();      
  print_r($result);
} catch (SoapFault $s) {
  die('ERROR: [' . $s->faultcode . '] ' . $s->faultstring);
} catch (Exception $e) {
  die('ERROR: ' . $e->getMessage());
}

ただし、たとえば使用してWebサービスにデータを送信しようとすると

try {
  $client = new Zend\Soap\Client("http://www.webservicex.net/country.asmx?WSDL");
  $result = $client->GetCurrencyByCountry('Australia');
  print_r($result);
} catch (SoapFault $s) {
  die('ERROR: [' . $s->faultcode . '] ' . $s->faultstring);
} catch (Exception $e) {
  die('ERROR: ' . $e->getMessage());
}

次のメッセージが表示されます

ERROR: [soap:Receiver] System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Data.SqlClient.SqlException: Procedure or function 'GetCurrencyByCountry' expects parameter '@name', which was not supplied. at WebServicex.country.GetCurrencyByCountry(String CountryName) --- End of inner exception stack trace ---

Web サービスにパラメーターを指定するにはどうすればよいですか?

4

1 に答える 1

6

あなたの問題はリクエストにあります、WDSLは複雑なタイプを定義します:

<s:element name="GetCurrencyByCountryResponse">
    <s:complexType>
        <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="GetCurrencyByCountryResult" type="s:string"/>
        </s:sequence>
    </s:complexType>
</s:element>

したがって、必要なのは、Webサービスで使用するためにオブジェクトまたは連想配列を作成することです。オブジェクトバリアントには、stdClassを使用できます。次のように関数呼び出しを変更する場合:

$params = new \stdClass(); 
$params->CountryName = 'Australia'; 
$result = $client->GetCurrencyByCountry($params); 

リクエストはタイプに適合し、データはサーバーに送信されます。提供されているWDSLには、処理する必要のあるさらに複雑なバリアントがあります。

<wsdl:message name="GetISOCountryCodeByCountyNameSoapOut"> 
    <wsdl:part name="parameters" element="tns:GetISOCountryCodeByCountyNameResponse"/> 
</wsdl:message>

次のような設定が必要になります。

$params = new \stdClass();
$params->parameters = new \stdClass();
$params->parameters->GetISOCountryCodeByCountyNameResult = 'YOURVALUE';

または配列として:

$params = array('parameters'=> 
  array('GetISOCountryCodeByCountyNameResult'=>'VALUE')
);
于 2013-01-28T03:11:39.400 に答える