2011-08-10 48 views
2

我試圖使用SOAPClient查詢NOAA SOAP API以獲取某些特定信息。該服務的典型查詢是這樣的,根據this blog post將「布爾值數組」傳遞給NOAA的SOAP服務

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

尼斯和容易。但是,看看documentation顯示最後一個參數。可以接收一組發送給服務器的布爾值,以便在響應中打開特定的內容。如果正確完成,查詢結果看起來像this

所以當然,我試着像...

$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爲「時間序列」,爲「一目瞭然」只是什麼硬編碼返回(忽略第五參數完全)。在任何情況下,上面的代碼都會導致服務器發回空白響應。我在第六個參數中嘗試了各種其他的東西,但沒有運氣。

那麼,什麼是大想法?我如何給API一個'布爾數組'像它期望的那樣?

回答

3

使用簡單的方法在請求中發送XML參數。對於布爾值,您可以直接使用「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); 
0

如果你看看服務的描述,你會看到最後一個參數是一個複雜的數據類型,由NOAA描述。您可以創建weatherParametersType的實例,然後直接修改其成員。 (例如wParams.pop12=True

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