2

我正在尝试使用 SOAPClient 来查询 NOAA SOAP API 以获取某些特定信息。根据这篇博客文章,对服务的典型查询是这样的:

$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);

好,易于。但是,查看文档显示最后一个参数。可以采用一组布尔值发送到服务器以打开响应中的特定内容。正确完成后,查询最终看起来像这样

所以当然,我尝试类似...

$client = new SoapClient('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));

请注意,我还必须将参数 3 更改为“时间序列”,因为“glance”只是硬编码它返回的内容(完全忽略第五个参数)。在任何情况下,上述代码都会导致服务器发回空白响应。我在第六个参数中尝试了各种其他的东西,但没有运气。

那么,有什么大主意呢?如何为 API 提供预期的“布尔数组”?

4

3 回答 3

3

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);
于 2011-09-07T14:16:51.333 回答
1

您似乎缺少unitType $Unit. __getFunctions()您只需将其设置'e'为美国或'm'公制读数。看起来它还要求您为所有返回值定义布尔值......而不仅仅是您想要的那些。因此,您需要定义

$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);

然后在声明后将其添加到您的通话中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);
于 2014-03-18T21:19:15.260 回答
0

如果您查看服务的描述,您会看到最后一个参数是复杂数据类型,由 NOAA 描述。您可以创建 weatherParametersType 的实例,然后直接修改其成员。(例如wParams.pop12=True

于 2012-02-07T04:07:28.710 回答