j2ee|php5|web|webサービス|プログラム|アクセス
WSDLの説明
Weatherサービスの呼び出しには成功しましたが、そのWSDLドキュメントはまだ見ていません。 WSDL には、SoapClient が公開するものよりも詳細な情報が含まれています。 startDate パラメータに何を入力するかをどうやって知ることができるでしょうか?返されたデータから実際に何を期待すべきでしょうか?これらの質問に答えるには、WSDL をさらに詳しく分析する必要があります。
天気予報アプリケーションの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 構造体は次のように定義されます:
したがって、この関数にはxsd:dateTime 型の startDate と整数型の days の 2 つのパラメータ。これは、SoapClient::_getTypes 関数についてわかっていることと正確に一致しますが、startDate が nil 可能であることもわかりました。間違いなく、入力パラメーターを単純化すると、関数は次のようになります:
$forecastResponse = $soapClient->getForecast(array('startDate'=>Null, 'days'=>3));
明示的な場合今日の日付を指定すると、結果は指定したとおりになります。
別の開始日を設定したい場合はどうすればよいですか? XML スキーマは、「2004-12-01T00:00:00」など、ISO 8601 標準に従ってフォーマットされた dateTime を基本タイプとして定義します。 3 日後の天気予報を知りたいとします。組み込み関数 strtotime("+3 days") を使用して必要な日付を取得できます。この関数は time() 関数と同じであり、両方とも を返します。標準 UNIX 形式の日付と時刻。AD からの日付を意味します。開始からの秒数を表す整数。 XML スキーマでは、文字列フィールドを使用して日付を ISO 8601 形式でエンコードする必要があることがわかっているため、サンプル クライアントに timeToIso8601 関数を作成して、整数の日付を SOAP エンコーディングで定義された形式に変換しました。しかし、ext/soap が整数の日付を必要な文字列フィールドの形式に非常に巧みに変換したことに驚きました。整数を渡すか、事前にフォーマットされた文字列を渡すかは関係なく、結果として得られる SOAP メッセージは同じです。
返信の日付についてはどうですか?復路では、ext/soap は SOAP 応答から dateTime フィールドを取得しますが、形式変換は行いません。エポックからの秒数を表す整数が返されることが期待されていますが、実際に取得するのは ISO 8601 に従ってフォーマットされた文字列です。したがって、strtotime 関数を使用して整数に変換し、strftime を使用して整数を表現しやすくするためにフォーマットします。
Weather Service は日付ごとに予報を提供しますが、dateTime エンコーディングの時間コンポーネントは無視されます。そのため、別のタイムゾーンで実行されているサービスから天気予報を要求した場合に必要になる可能性があるこの調整面は考慮していませんでした。タイムゾーン変換について詳しく知りたい場合は、「参考文献」に記載されている ISO 8601 標準について説明した記事を参照してください。
応答形式に戻ります。前のセクションでは、getForecast によって返されるデータの不整合について述べました。 WSDL の説明では、getForecast が getForecastResponse オブジェクトを返すことがわかります。このオブジェクトには Weather という複合型の無限のリストを含めることができます:
</complexType>
</element>
<complexType name="Weather">
<sequence>
<element name= 条件" nillable="true" type="xsd:string"/>
<要素名="日付" nillable="true" type="xsd:dateTime"/>
<要素名="windDirection" nillable="true " type="xsd:string"/>
<要素名=windSpeed" type="xsd:int"/>
<要素名=摂氏温度" type="xsd:int"/>
<要素名= dbflag " type="xsd:boolean"/>
</sequence>
</complexType>
WSDLでは単一要素配列の特殊なケースは許可されません。残念ながら、ext/soap は、応答に Weather オブジェクトのみが含まれる場合、getForecastResponse に適用される WSDL の
最後に、WSDL ドキュメントは、ネットワーク上のサービスを見つけることができるネットワーク上の場所も SOAP クライアントに伝えます:
<wsdlsoap:address location=
"http://localhost:9080/ItsoWebService2RouterWeb/services/WeatherForecastEJB"/>
</wsdl:port>
</wsdl:service>