j2ee|php5|web|webサービス|プログラム|アクセス
PHP Weather Client
このセクションでは独自の PHP Weather クライアントを構築します。いくつかのコード スニペットがここに提供されています。完全なクライアント ファイルと WSDL ファイルをダウンロードすることをお勧めします。
Weather Serviceを表すために使用されるext/soapクラスはSoapClientです。 Weather Forecast アプリケーションを導入したときに説明したように、アプリケーション サーバーが http://host:port/ItsoWebServer2RouterWeb/wsdl/itso/session/WeatherForecastEJB.wsdl で WSDL を提供していることがわかっています。デフォルトのポートを使用し、サーバーであるマシンで作業しているため、WSDL ファイルを探して最初の SoapClient を作成できます:
<?php
$soapClient = new SoapClient("http://localhost:9080 / " .
"ItsoWebService2RouterWeb/wsdl/itso/session/WeatherForecastEJB.wsdl");
?>
ext/soap が組み込まれているため、SoapClient を参照する前に include ステートメントや require ステートメントは必要ないことに注意してください。
クライアントがインスタンス化されたので、Weather サービスに連絡し、その getForecast オペレーションを呼び出す必要があります。 SoapClient を WSDL モードで使用する場合、ext/soap には、SoapClient 自体の関数であるかのようにリモート操作を直接参照できるという優れた機能があります。ただし、入力パラメータを設定する際には少しコツが必要です。 ext/soap は、WSDL から検出された一連の操作とパラメーターを提供できます:
$functions = $soapClient->__getFunctions();
print_r($functions);
$types = $soapClient->__getTypes();
print_r ($types);
getForecast に関連する結果を表示し、読みやすいようにこれらの結果を再フォーマットするだけでよいため、次のコードが表示されます:
getForecastResponse getForecast(getForecast $parameters)
struct getForecast {
dateTime startDate ;
int days;
}
struct getForecastResponse {
Weather getForecastReturn;
}
struct Weather {
文字列条件;
dateTime 日付;
文字列風向;
int 風速;
int 温度摂氏;
ブール dbflag;
}
ext/ soap は実際には getForecast クラスを定義しません。この操作に必要な入力パラメーター配列を作成する必要があります:
$getForecastParam = array('startDate' => time(), 'days' => 3);
その後、呼び出します。 SoapClient メソッドのような操作:
$forecastResponse = $soapClient->getForecast($getForecastParam);
最後に、返された getForecastResponse オブジェクトを取得します。これ自体は Weather オブジェクトの配列であり、結果をテーブルに表示します。
echo "
";
echo "
日付 |
Condition |
Temperature |
Wind$weatherArray = $forecastResponse->getForecastReturn; foreach ($weatherArray as $weather) { echo " |
",
"",strftime("%a. % b %d, %Y", strtotime($weather->date)),"</td>", " |
$weather->condition | ",
"$weather- >摂氏温度</td>", " |
$weather->windDirection $weather->windSpeed | ",
"
";
}
echo "
";
PHPクライアントと Java クライアントの出力は同じなので、クリスマスの間サンノゼでは雪が降らないことがわかります...
図 3. PHP WeatherClient
SOAP ストリームの観察
Weather サービスに正常に接続し、結果が表示されます。しかし、何か問題が発生し、期待した結果が得られなかった場合はどうすればよいでしょうか? ext/soap は、クライアントとサーバー間で交換される SOAP メッセージを表示できるため、問題の特定に役立ちます。
トレース機能は、trace オプションを使用して SoapClient が作成された場合にのみ使用する必要があります。 options 配列パラメーターにトレース オプションを設定し、SoapClient コンストラクターに渡します。コンストラクターの使用を次のように変更します。
$soapClient = new SoapClient("http://localhost:9080/" .
"ItsoWebService2RouterWeb/wsdl/itso/session/WeatherForecastEJB.wsdl",
array('trace' = > 1));
そしてgoForecastを呼び出した後にtraceメソッドを呼び出します:
echo "Request :
", htmlspecialchars($soapClient->__getLastRequest()), "
";
echo "Response :
__getLastResponse()), "
";
htmlspecialchars 組み込み関数を使用してトレース出力をエンコードしてください。これは、SOAP XML 区切り文字を < などの特殊文字に変換するためです。 ;、次のようにこれにより、ブラウザがマークアップとして解釈できなくなります。
リクエストのトレース出力は以下の通りです:
<?xml version="1.0"coding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas .xmlsoap.org/soap/envelope/"
xmlns:ns1="http://session.itso">
<SOAP-ENV:Body>
<ns1:getForecast>
<ns1:startDate>2004-11-30T13 : 対応しています 答えは:
<?xml version="1.0"coding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http: //schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001 /XMLSchema-instance">
<soapenv:Body>
<getForecastResponse xmlns="http://session.itso">
<getForecastReturn xmlns:ns-239399687="http://mapping.itso">
<ns- 239399687:条件>晴れ :風向>W ns-239399687:風向>
18風速>
6温度摂氏>
<ns-239399687:dbflag>1< /ns-239399687:dbflag>
</getForecastReturn>
</getForecastResponse>
</soapenv:Body>
</soapenv:Envelope>
トレース付きクライアントを実行する場合は必須この出力を収集するには、日数パラメータを 0 に設定して、SOAP 応答が出力する行数を減らします。しかし、予期せぬ動作に遭遇しました。 getForecastResponse は以前と同様に Weather オブジェクトの配列であることが予想されますが、4 つの要素ではなく 1 つの要素のみを持つ必要があります。ただし、これは単純な Weather オブジェクトに変換されるため、最後の PHP クライアント コードの例でわかるように、この動作に従ってコーディングする必要があります。これは、サーバー応答に含まれる Weather オブジェクトの数に関係なく、getForecast が常に Weather オブジェクトの配列を返す Java クライアントの動作とは異なります。 SoapClient::_getTypes() の出力には、この違いを理解するのに十分な詳細が示されていないため、完全なインターフェイス仕様を理解するには WSDL ドキュメントを参照します。