前回に引き続いて、Axisクライアント→サービス間の応答もgzipで圧縮する(サーバサイドの設定については前回参照)。よもや、pivotハンドラから書かなければならんのだろうか・・・と鬱々としていたら最初から実装されてんのね。
axis.jar内のorg.apache.axis.transport.http.CommonsHTTPSenderとcommons-httpclientの組み合わせでAccept-Encoding: gzipなリクエスト&応答伸張できるらしい。

導入

  • The Jakarta Site - Commons Downloadsから「Commons Codec」「Commons HttpClient」をダウンロードする。今回使ったのは、それぞれ1.3と3.0。
  • ダウンロードしたアーカイブからjarを取り出して、適当な場所に置く。クライアントプロジェクトのビルドパスに追加する。

設定

  • client-config.wsdd内に以下の赤字部分のように記述してhttpトランスポートをCommonsHTTPSenderに置き換える。
    <?xml version="1.0" encoding="UTF-8"?>
    <deployment name="using Commons-httpclient"
    xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <globalConfiguration>
    <parameter name="disablePrettyXML" value="true"/>
    <parameter name="enableNamespacePrefixOptimization" value="false"/>
    </globalConfiguration>
    <transport name="http" pivot="java:org.apache.axis.transport.http.CommonsHTTPSender"/>
    <transport name="local" pivot="java:org.apache.axis.transport.local.LocalSender"/>
    <transport name="java" pivot="java:org.apache.axis.transport.java.JavaSender"/>
    </deployment>
  • client-config.wsddをクラスパスのルートに配置する。クラスパスのルートかカレントディレクトリでもいいらしい("."ドットが適用されるから?)。./src/直下に置いた。ビルドすると./bin/直下に配置されるので。jarを作るときにbinまるごと一括で楽かと。

コード修正

  • 以下のように、得られたスタブをorg.apache.axis.client.Stubにキャストし、_setProperty()メソッドでtransport.http.acceptGzipプロパティにtrueを指定する。
    KeitaisoKaiseki binding; binding = new KeitaisoKaisekiServiceLocator().getKeitaisoKaisekiService();
    ((Stub)binding)._setProperty("transport.http.acceptGzip" , "true");
  • 06/04/29追記:"transport.http.acceptGzip"は、org.apache.axis.transport.http.HTTPConstantsのMC_ACCEPT_GZIPとして定義があるので、これを用いるがベターという指摘。jadで逆コンパイルしたコードを読んでたから気がつきませんでした。ははは。
後は、.NET Frameworkのクライアントと同じで、HTTPリクエストヘッダ中にAccept-Encoding: gzipが付与され、サーバ側が対応していれば応答本文がgzipで圧縮され送られてくる。CommonsHTTPSenderが伸張してくれておしまい。
CommonsHTTPSenderの場合、リクエストもgzip圧縮して送信できる感じ(試してない)。proxyサーバの設定ってどこでやるのかな・・・。

おまけ:応答の様子。

≫POST /KeitaisoWS/services/KeitaisoKaisekiService HTTP/1.1
≫Content-Type: text/xml; charset=utf-8
≫SOAPAction: ""
≫User-Agent: Axis/1.3
≫Accept-Encoding: gzip
≫Host: passing.breeze.cc
≫Transfer-Encoding: chunked

≫(リクエスト本文)

≪HTTP/1.1 200 OK
≪Date: Tue, 28 Feb 2006 13:34:48 GMT
≪Server: Apache
≪Vary: Accept-Encoding
≪Content-Encoding: gzip
≪Connection: close
≪Transfer-Encoding: chunked
≪Content-Type: text/xml;charset=utf-8

≪(応答本文)