Передача "массива логических значений" службе SOAP NOAA - PullRequest
2 голосов
/ 10 августа 2011

Я пытаюсь использовать SOAPClient, чтобы запросить у SOA API NOAA некоторую конкретную информацию.Типичный запрос к сервису выглядит примерно так, согласно этому сообщению в блоге :

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

Красиво и просто.Однако, взглянув на документацию , вы увидите, что последний параметр.может принимать массив логических значений, отправляемых на сервер для включения определенных вещей в ответе.Когда все сделано правильно, запрос в итоге выглядит как 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 ]

3 голосов
/ 07 сентября 2011

Используйте простой способ отправки параметра 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);
1 голос
/ 19 марта 2014

Вы, похоже, пропускаете 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);
0 голосов
/ 07 февраля 2012

Если вы посмотрите описание службы, вы увидите, что последний параметр представляет собой сложный тип данных, описанный NOAA.Вы можете создать экземпляр weatherParametersType, а затем напрямую изменить его члены.(например, wParams.pop12=True)

...