Differences between revisions 1 and 2
Revision 1 as of 2005-04-05 10:42:25
Size: 5031
Comment: Axis Wiki in Japanese
Revision 2 as of 2009-09-20 22:48:36
Size: 5031
Editor: localhost
Comment: converted to 1.6 markup
No differences found!

質問: WSDL2Javaスタブを使う際に、どのようにしてヘッダを取得/設定するのですか?

回答: 2種類のヘッダがあります。明示的なものと暗示的なものです。明示的なヘッダはサービスの WSDL の中で定義されています。WSDL2Java生成ツールはたいていの場合これらのヘッダを認識し、ヘッダをメソッドへの引数として含む、スタブクラスメソッドを出力します。

WSDL の中で明示的に呼び出されたくないヘッダを設定したい場合もあるかもしれません。例えば、ハンドラの中でいくつかのカスタム処理を行いたい場合や、セキュリティを追加したい場合です。この場合、スタブメソッドを呼び出す前に、リクエストにハンドラを追加することができます。

org.apache.axis.client.Stubクラスには2つのsetHeader APIがあります。1つめは、名前空間、名前、ヘッダの値を引数に取ります。

setHeader(String namespace, String partName, Object headerValue) 2つめは、SOAPHeaderElementを引数に取ります。

setHeader(SOAPHeaderElement header) ここに1つめの API を使った例を挙げます。

  FooServiceLocator loc = new FooServiceLocator();
  FooService binding = loc.getFooService();
  org.apache.axis.client.Stub s = (Stub) binding;
  s.setHeader("http://my.name.space/headers", "mysecurityheader", "This guy is OK");
  result = binding.myOperation(...);

質問: FooServiceクラス (一般的にはWSDL2Javaによって生成される) がすでにorg.apache.axis.client.Stubクラスを拡張しているのに、どうして (上記のコードに出てくる) "binding" 変数は Stub にキャストする必要があるのか説明してください。

回答: getFooService()はスタブをFooServiceオブジェクトとして返しますが、それはサービスの操作しか含んでいないインターフェースだからです。これを Stub オブジェクトにキャストすることで、JAX-RPC と Axis Stub API にアクセスすることができます。

質問: WSDL2Javaスタブを使用する際に、どのようにしてレスポンスヘッダを受け取りますか?

回答: Axis Stubオブジェクトの中でgetResponseHeader() APIを使用します。

SOAPHeaderElement getResponseHeader(String namespace, String partName) あるいはヘッダの完全なリストを受け取ります。

SOAPHeaderElement[] getResponseHeaders() ここに、myOperation()から返ってきたヘッダを取得するコードの断片をのせます。

  FooServiceLocator loc = new FooServiceLocator();
  FooService binding = loc.getFooService();
  // ヘッダを返すWebサービス操作を呼びます
  result = binding.myOperation(...);
  org.apache.axis.client.Stub s = (Stub) binding;
  s.getResponseHeader("http://my.name.space/headers", "mysecurityheader");

質問: Stub オブジェクトの中で getHeader() API は何をしますか? なぜレスポンスヘッダを返さないのですか?

回答: これらの API は、操作リクエストの中で送られる/送られたStub/Callの中にあるヘッダを返します。これは Axis 1.1 で変更され、Stubからヘッダを取得する方法がなくなったのですが (依然としてCallオブジェクトから取得することはできました)、この問題を解決するために 1.1 以降ではgetResponseHeader APIが追加されました。

質問: Axis 1.1 を使用している場合、どのようにしてレスポンスヘッダを受け取ればいいのでしょうか?

回答: Serviceオブジェクトから利用可能なCallオブジェクトを使用してSOAPEnvelopeを取得してください。このオブジェクトには多くのヘッダ関数があります。あるいは、SOAPEnvelopeに対して getHeader()を呼び出すことで JAX-RPC のjavax.xml.soap.SOAPHeaderオブジェクトを取得することができます。SOAPEnvelopeクラスは一般的にIteratorを返すので、ヘッダを自分で列挙する必要があります。

ここにSOAPEnvelopeに対してAxis APIを使用する方法の例を挙げます。

 FooServiceLocator loc = new FooServiceLocator();
 FooService binding = loc.getFooService();
 // ヘッダを返すWebサービス操作を呼びます
 result = binding.myOperation(...);
 Call lastCall = ((org.apache.axis.client.Service)service).getCall();
 org.apache.axis.message.SOAPEnvelope env = lastCall.getResponseMessage().getSOAPEnvelope;
 SOAPHeaderElement h = env.getHeaderByName(("http://my.name.space/headers", "mysecurityheader");

ja/axis/WSDLJavaHeader (last edited 2009-09-20 22:48:36 by localhost)