|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
大家如果能懂得“熟能生巧”的道理也就明白了这并不是浪费时间,同时这也可以减轻板主的负担,让他们有时间去处理更难的问题。j2ee|php5|web|web办事|法式|会见 注释 WSDL
咱们已胜利地挪用了 Weather 办事,然而还没有看过它的 WSDL 文档。WSDL 中的细节要比 SoapClient 公然的多。咱们若何晓得应当在 startDate 参数中放甚么呢?咱们应当希冀从前往的数据中实践失掉甚么?要回覆这些成绩,必需更深切地剖析 WSDL。
可以从下载局部下载 Weather Forecast 使用法式的 WSDL。假如利用分歧的 Web 办事,只需求在阅读器中翻开响应的 WSDL 文档便可。
getForecast 操作的 WSDL 是:
<wsdl:operation name="getForecast">
<wsdl:input message="intf:getForecastRequest" name="getForecastRequest"/>
<wsdl:output message="intf:getForecastResponse" name="getForecastResponse"/>
</wsdl:operation>
个中的 getForecastRequest 动静被界说为:
<wsdl:message name="getForecastRequest">
<wsdl:part element="intf:getForecast" name="parameters"/>
</wsdl:message>
而 getForecast 布局被界说为:
<element name="getForecast">
<complexType>
<sequence>
<element name="startDate" nillable="true" type="xsd:dateTime"/>
<element name="days" type="xsd:int"/>
</sequence>
</complexType>
</element>
因而咱们晓得该函数需求两个参数,xsd:dateTime 类型的 startDate 和整数类型的 days。这与咱们所懂得的 SoapClient::_getTypes 函数完整婚配,然而如今咱们还晓得 startDate 可觉得空(nillable)。毫无疑问,假如咱们简化输出参数,那末该函数将以下所示:
$forecastResponse = $soapClient->getForecast(array('startDate'=>Null, 'days'=>3));
假如明白指定明天的日期,了局会与所指定的完整分歧。
假如但愿制订其他肇端日期怎样办呢?XML Schema将 dateTime 界说成一种根基类型,依照 ISO 8601 尺度格局化,好比“2004-12-01T00:00:00”。假定但愿懂得三天以后的天色预告,可使用内置函数 strtotime("+3 days") 取得需求的日期,该函数与 time() 函数不异,都前往尺度 UNIX 格局的日期工夫,即暗示从公元编年入手下手到如今的秒数的一个整数。咱们晓得 XML Schema 请求日期采取具有字符串字段的 ISO 8601 格局停止编码,因而在示例客户机中编写了 timeToIso8601 函数,将整很多天期转换成 SOAP 编码界说的格局。但咱们受惊地发明,其实其实不需求如许做,ext/soap 十分伶俐地将整很多天期转化成了需求的字符串字段格局。不管传递的是整数仍是预格局化的字符串,都没有关系,终究传送的 SOAP 动静都是一样的。
呼应中的日期又若何呢?在回程中,ext/soap 从 SOAP 呼应取得了 dateTime 字段,然而没有做任何格局转换。咱们但愿它前往一个整数,以暗示从公元编年到如今的秒数,但实践上失掉的是依照 ISO 8601 格局化的字符串。因而咱们利用 strtotime 函数将其转化成整数,然后利用 strftime 格局化该整数,以便于暗示。
Weather Service 按日期供应预告,但它疏忽了 dateTime 编码中的工夫成份。所以咱们没有思索这方面的调剂,假如从运转在分歧时区内的办事中恳求天色预告,那末能够必需如许做。假如但愿进一步懂得时区转换,请参阅参考材料中给出的描写 ISO 8601 尺度的文章。
如今再回到呼应格局下去。上一节中已经提到 getForecast 前往数据的纷歧致性。WSDL 描写告知咱们 getForecast 前往一个 getForecastResponse 对象,getForecastResponse 可以包括无穷多个称为 Weather 的庞杂类型的列表:
<element name="getForecastResponse">
<complexType>
<sequence>
<element maxOccurs="unbounded" name="getForecastReturn" type="tns2:Weather"/>
</sequence>
</complexType>
</element>
<complexType name="Weather">
<sequence>
<element name="condition" nillable="true" type="xsd:string"/>
<element name="date" nillable="true" type="xsd:dateTime"/>
<element name="windDirection" nillable="true" type="xsd:string"/>
<element name="windSpeed" type="xsd:int"/>
<element name="temperatureCelsius" type="xsd:int"/>
<element name="dbflag" type="xsd:boolean"/>
</sequence>
</complexType>
WSDL 不答应呈现单位素数组这类特例。不幸的是,当呼应只包括一个 Weather 对象时,ext/soap 没有思索 WSDL 中使用于 getForecastResponse 的 <sequence> 标签,由于这类行动在客户机代码中形成了不用要的庞杂性。
最初,WSDL 文档还告知 SOAP 客户机可以从收集中的哪一个中央找到该办事:
<wsdl:service name="WeatherForecastEJBService">
<wsdl:port binding="intf:WeatherForecastEJBSoapBinding"
name="WeatherForecastEJB">
<wsdlsoap:address location=
"http://localhost:9080/ItsoWebService2RouterWeb/services/WeatherForecastEJB"/>
</wsdl:port>
</wsdl:service>
不可能吃饭的时候咬了自己一下舌头就从此不吃饭了不是?放下畏惧,继续努力,咱们是来征服它的,而不是被它征服的,振奋起来吧同志。 |
|