【问题标题】:Passing "array of booleans" to NOAA's SOAP service将“布尔数组”传递给 NOAA 的 SOAP 服务
【发布时间】:2011-10-24 09:39:09
【问题描述】:

我正在尝试使用 SOAPClient 来查询 NOAA SOAP API 以获取某些特定信息。根据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);

很好很容易。但是,查看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 更改为“时间序列”,因为“glance”只是硬编码它返回的内容(完全忽略第五个参数)。在任何情况下,上述代码都会导致服务器发回空白响应。我在第六个参数中尝试了各种其他的东西,但没有运气。

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

【问题讨论】:

    标签: php api soap soap-client noaa


    【解决方案1】:

    使用简单的方式在请求中发送 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】:

      您似乎缺少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);
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-04
          • 2015-12-26
          • 2015-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多