将“布尔数组”传递给NOAA的SOAP服务

时间:2022-04-03 21:30:37

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:

我正在尝试使用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);

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

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.

请注意,我还必须将param 3更改为'time-series',因为'glance'只是硬编码它返回的内容(完全忽略第五个参数)。在任何情况下,上述代码都会导致服务器发回空白响应。我在第六次参考中尝试过各种其他事情而没有运气。

So, what's the big idea? How do I give the API an 'array of booleans' like it expects?

那么,什么是重要的想法?我如何给API一个像它期望的“一系列布尔值”?

3 个解决方案

#1


3  

Use Simple way to send the XML parameter in the request. For Boolean values you can directly use "true".

使用简单方法在请求中发送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);

#2


1  

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

你似乎错过了__getFunctions()中描述的unitType $ Unit。您只需要将其设置为美国的“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);

and then add it to your call after declaring the unitType:

然后在声明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);

#3


0  

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)

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

#1


3  

Use Simple way to send the XML parameter in the request. For Boolean values you can directly use "true".

使用简单方法在请求中发送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);

#2


1  

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

你似乎错过了__getFunctions()中描述的unitType $ Unit。您只需要将其设置为美国的“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);

and then add it to your call after declaring the unitType:

然后在声明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);

#3


0  

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)

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