SoapClientを使用してhttp://weather.gov/forecasts/xml/SOAP_server/ndfdXMLserver.php?wsdl と対話し、NDFDgenByDay()を呼び出すと問題なく動作しますが、NDFDgen()を呼び出す場合はSoapClientを使用しているときにweatherParametersをNDFDgen()に渡す方法がわからないため、代わりにcurlします。これが私が試したことです:
...
$this->client =
new SoapClient(
'http://weather.gov/forecasts/xml/SOAP_server/ndfdXMLserver.php?wsdl',
array('cache_wsdl'=>WSDL_CACHE_NONE)
);
...
$this->xml =
$this->client->NDFDgen(
new SoapParam($this->latitude, 'latitude'),
new SoapParam($this->longitude,'longitude'),
new SoapParam('time-series', 'product'),
new SoapParam($startTime, 'startTime'),
new SoapParam($endTime, 'startTime'),
new SoapParam('e', 'Unit'),
new SoapParam(
array(
new SoapParam(false,'maxt'), new SoapParam(false,'mint'),
new SoapParam(true, 'temp'), new SoapParam(true, 'dew'),
new SoapParam(true, 'pop12'), new SoapParam(true, 'qpf'),
new SoapParam(true, 'sky'), new SoapParam(true, 'snow'),
new SoapParam(true, 'wspd'), new SoapParam(true, 'wdir'), //10
new SoapParam(false,'wx'), new SoapParam(false,'waveh'),
new SoapParam(true, 'icons'), new SoapParam(true, 'rh'),
new SoapParam(true, 'appt'), new SoapParam(false,'incw34'),
new SoapParam(false,'incw50'), new SoapParam(false,'incw64'),
new SoapParam(false,'cumw34'), new SoapParam(false,'cumw50'), //20
new SoapParam(false,'cumw64'), new SoapParam(false,'critfireo'),
new SoapParam(false,'dryfireo'), new SoapParam(false,'conhazo'),
new SoapParam(false,'ptornado'), new SoapParam(false,'phail'),
new SoapParam(false,'ptstmwinds'), new SoapParam(false,'pxtornado'),
new SoapParam(false,'pxhail'), new SoapParam(false,'pxtstmwinds'), //30
new SoapParam(false,'ptotsvrtstm'), new SoapParam(false,'pxtotsvrtstm'),
new SoapParam(false,'tmpabv14d'), new SoapParam(false,'tmpblw14d'),
new SoapParam(false,'tmpabv30d'), new SoapParam(false,'tmpblw30d'),
new SoapParam(false,'tmpabv90d'), new SoapParam(false,'tmpblw90d'),
new SoapParam(false,'prcpabv14d'), new SoapParam(false,'prcpblw14d'), //40
new SoapParam(false,'prcpabv30d'), new SoapParam(false,'prcpblw30d'),
new SoapParam(false,'prcpabv90d'), new SoapParam(false,'prcpblw90d'),
new SoapParam(true, 'precipa_r'), new SoapParam(true, 'sky_r'),
new SoapParam(true, 'temp_r'), new SoapParam(true, 'td_r'),
new SoapParam(true, 'wdir_r'), new SoapParam(true, 'wspd_r'), //50
new SoapParam(true, 'wwa'), new SoapParam(true, 'wgust')
),
'weatherParameters'
)
);
私が得るエラーは次のとおりです。
Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object has no 'maxt' property in [Redacted]\data\WeatherService.php:199
curlを介して機能するxmlは次のとおりです。
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ndf="http://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl">
<soapenv:Header/>
<soapenv:Body>
<ndf:NDFDgen soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<latitude xsi:type="xsd:decimal">{$this->latitude}</latitude>
<longitude xsi:type="xsd:decimal">{$this->longitude}</longitude>
<product xsi:type="xsd:string">time-series</product>
<startTime xsi:type="xsd:dateTime">{$this->startTime}</startTime>
<endTime xsi:type="xsd:dateTime">{$this->endTime}</endTime>
<Unit xsi:type="xsd:string">e</Unit>
<weatherParameters xsi:type="ndf:weatherParametersType">
<!--You may enter the following 52 items in any order-->
<maxt xsi:type="xsd:boolean">false</maxt>
<mint xsi:type="xsd:boolean">false</mint>
<temp xsi:type="xsd:boolean">true</temp>
<dew xsi:type="xsd:boolean">true</dew>
<pop12 xsi:type="xsd:boolean">true</pop12>
<qpf xsi:type="xsd:boolean">true</qpf>
<sky xsi:type="xsd:boolean">true</sky>
<snow xsi:type="xsd:boolean">true</snow>
<wspd xsi:type="xsd:boolean">true</wspd>
<wdir xsi:type="xsd:boolean">true</wdir>
<wx xsi:type="xsd:boolean">false</wx>
<waveh xsi:type="xsd:boolean">false</waveh>
<icons xsi:type="xsd:boolean">true</icons>
<rh xsi:type="xsd:boolean">true</rh>
<appt xsi:type="xsd:boolean">true</appt>
<incw34 xsi:type="xsd:boolean">false</incw34>
<incw50 xsi:type="xsd:boolean">false</incw50>
<incw64 xsi:type="xsd:boolean">false</incw64>
<cumw34 xsi:type="xsd:boolean">false</cumw34>
<cumw50 xsi:type="xsd:boolean">false</cumw50>
<cumw64 xsi:type="xsd:boolean">false</cumw64>
<critfireo xsi:type="xsd:boolean">false</critfireo>
<dryfireo xsi:type="xsd:boolean">false</dryfireo>
<conhazo xsi:type="xsd:boolean">false</conhazo>
<ptornado xsi:type="xsd:boolean">false</ptornado>
<phail xsi:type="xsd:boolean">false</phail>
<ptstmwinds xsi:type="xsd:boolean">false</ptstmwinds>
<pxtornado xsi:type="xsd:boolean">false</pxtornado>
<pxhail xsi:type="xsd:boolean">false</pxhail>
<pxtstmwinds xsi:type="xsd:boolean">false</pxtstmwinds>
<ptotsvrtstm xsi:type="xsd:boolean">false</ptotsvrtstm>
<pxtotsvrtstm xsi:type="xsd:boolean">false</pxtotsvrtstm>
<tmpabv14d xsi:type="xsd:boolean">false</tmpabv14d>
<tmpblw14d xsi:type="xsd:boolean">false</tmpblw14d>
<tmpabv30d xsi:type="xsd:boolean">false</tmpabv30d>
<tmpblw30d xsi:type="xsd:boolean">false</tmpblw30d>
<tmpabv90d xsi:type="xsd:boolean">false</tmpabv90d>
<tmpblw90d xsi:type="xsd:boolean">false</tmpblw90d>
<prcpabv14d xsi:type="xsd:boolean">false</prcpabv14d>
<prcpblw14d xsi:type="xsd:boolean">false</prcpblw14d>
<prcpabv30d xsi:type="xsd:boolean">false</prcpabv30d>
<prcpblw30d xsi:type="xsd:boolean">false</prcpblw30d>
<prcpabv90d xsi:type="xsd:boolean">false</prcpabv90d>
<prcpblw90d xsi:type="xsd:boolean">false</prcpblw90d>
<precipa_r xsi:type="xsd:boolean">true</precipa_r>
<sky_r xsi:type="xsd:boolean">true</sky_r>
<temp_r xsi:type="xsd:boolean">true</temp_r>
<td_r xsi:type="xsd:boolean">true</td_r>
<wdir_r xsi:type="xsd:boolean">true</wdir_r>
<wspd_r xsi:type="xsd:boolean">true</wspd_r>
<wwa xsi:type="xsd:boolean">true</wwa>
<wgust xsi:type="xsd:boolean">true</wgust>
</weatherParameters>
</ndf:NDFDgen>
</soapenv:Body>
</soapenv:Envelope>
基本的に、すべてのSoapインタラクションにSoapClientを使用したいのですが、上記のweatherParametersパラメーターのような複雑なパラメーターを実行する方法がわかりません。SoapClientを使用するときにweatherParametersを指定できる場合は、その方法を教えてください。 curlを使用すると、soapエンベロープを作成してからcurlを初期化して使用してから、応答xmlを応答エンベロープから解析するまでの間に、文字通り100行を超えるコードがphpに追加されます。