Passing "array of booleans" to NOAA's SOAP service
I'm attempting to use SOAPClient to query the NOAA SOAP API for some specific information. A typical query to the service goes something like this, according to this blog post:
$client = new SoapClient('http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl#NDFDgen');
$result = $client->NDFDgen(40.7893,-96.6938,'glance','2007-04-20T00:00','2007-04-21T00:00',NULL);
Nice and easy. However, taking a look at the documentation shows that the last param. can take an array of booleans that is sent to the server to turn on specific things in the response. When done correctly, the query ends up looking like this.
So of course, I try something like...
$client = new SoapC开发者_运维技巧lient('http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl#NDFDgen');
$result = $client->NDFDgen(40.7893,-96.6938,'time-series','2007-04-20T00:00','2007-04-21T00:00', array('mint' => 1, 'maxt' => 1));
Notice that I also had to change param 3 to 'time-series', as 'glance' simply hardcodes what it returns (ignoring the fifth param completely). In any case the above code causes the server sends back a blank response. I've tried various other things in that sixth param with no luck.
So, what's the big idea? How do I give the API an 'array of booleans' like it expects?
Use Simple way to send the XML parameter in the request. For Boolean values you can directly use "true".
$client = new SoapClient('http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl#NDFDgen',array('trace' => 1));
$param1 = new SoapParam(40.7893, "latitude");;
$param2 = new SoapParam(-96.6938, "longitude");;
$xmlDocument = '<product xmlns:dwml="http://www.weather.gov/forecasts/xml/DWMLgen/schema/DWML.xsd">glance</product>';
$xmlvar = new SoapVar($xmlDocument,XSD_ANYXML);
$param3 = new SoapParam($xmlvar, "product");;
$param4 = new SoapParam("2011-09-06T00:00", "startTime");;
$param5 = new SoapParam("2011-09-07T00:00", "endTime");;
$xmlDocument = '<weatherParameters xmlns:dwml="http://www.weather.gov/forecasts/xml/DWMLgen/schema/DWML.xsd">
<maxt xsi:type="xsd:boolean">true</maxt>
<mint xsi:type="xsd:boolean">true</mint>
</weatherParameters>';
$xmlvar = new SoapVar($xmlDocument,XSD_ANYXML);
$param6 = new SoapParam($xmlvar, "weatherParameters");;
$result = $client->NDFDgen($param1,$param2,$param3,$param4,$param5,$param6);
echo "REQUEST:".$client->__getLastRequest()."<br>";
print_r($result);
You seem to be missing the unitType $Unit
as described in __getFunctions()
. You'll just need to set it to 'e'
for US or 'm'
for metric readings. It looks like it also requires that you define booleans for ALL of the return values... not just the ones you want. Therefore, you'd want to define
$PARAMS = array('appt' => false,
'conhazo' => false,
'critfireo' => false,
'cumw34' => false,
'cumw50' => false,
'cumw64' => false,
'dew' => false,
'dryfireo' => false,
'iceaccum' => false,
'icons' => false,
'incw34' => false,
'incw50' => false,
'incw64' => false,
'maxrh' => false,
'maxt' => true,
'minrh' => false,
'mint' => true,
'phail' => false,
'pop12' => false,
'prcpabv14d' => false,
'prcpabv30d' => false,
'prcpabv90d' => false,
'prcpblw14d' => false,
'prcpblw30d' => false,
'prcpblw90d' => false,
'precipa_r' => false,
'ptornado' => false,
'ptotsvrtstm' => false,
'ptstmwinds' => false,
'pxhail' => false,
'pxtornado' => false,
'pxtotsvrtstm' => false,
'pxtstmwinds' => false,
'qpf' => false,
'rh' => false,
'rx' => false,
'sky' => false,
'sky_r' => false,
'snow' => false,
'td_r' => false,
'temp' => false,
'temp_r' => false,
'tmpabv14d' => false,
'tmpabv30d' => false,
'tmpabv90d' => false,
'tmpblw14d' => false,
'tmpblw30d' => false,
'tmpblw90d' => false,
'waveh' => false,
'wdir' => false,
'wdir_r' => false,
'wgust' => false,
'wspd' => false,
'wspd_r' => false,
'wwa' => false,
'wx' => false);
and then add it to your call after declaring the unitType
:
$client = new SoapClient('http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl');
$result = $client->NDFDgen(40.7893,-96.6938,'time-series',NULL,NULL,'e',$PARAMS);
If you look at the description of the service, you will see that the last parameter is a complex data type, described by NOAA. You can create an instance of the weatherParametersType, and then modify its members directly. (e.g. wParams.pop12=True
)
精彩评论