Apacheプロジェクトの、SOAPライブラリです。Java版のAxisというライブラリがあるため、Axis C++と呼ばれています。
Apache 1.x 2.xへモジュールを組み込み、SOAPサービスを提供するサーバと、SOAPサービスへアクセスするクライアントが作成出来ます。
事前にApache2がインストールしてあるものとします。
Axis C++ downloadページから、axis-c-win32-current-bin.zipをダウンロードします。
axis 1.5(2006/03/01現在)、は他にXercesのバイナリが必要になります。
LoadModule axis_module modules/mod_axis2.dll <Location /axis> SetHandler axis </Location>
LogPath:XXXX WSDDFilePath:YYYY XMLParser:ZZZZ Transport_http:AAAA Channel_HTTP:BBBB
LogPath: [Apache_Folder]\Axis\logs\AxisLog WSDDFilePath: [Apache_Folder]\Axis\conf\server.wsdd XMLParser:[Apache_Folder]\Axis\lib\AxisXMLParser.dll Transport_http:[Apache_Folder]\Axis\lib\HTTPTransport.dll Channel_HTTP:[Apache_Folder]\Axis\lib\HTTPChannel.dll
クライアントから文字列をパラメータとして渡す場合は、UTF-8へ変換して関数を呼び出す必要があります。ただし、サーバから文字列が戻ってくる場合は、shift_jis(windows、Xercesを使った場合他のXMLパーサを使った場合は分かりません、ごめんなさい)になります。これは、クライアントからサーバへの通信は
の順で行われ、Axis→Xercesのデータ受け渡し時に、UTF-8バイナリストリームでデータが渡されるため呼び出し時はUTF-8への変換が必要になります。
逆に、サーバからのデータ受信時は
の順にデータが処理され、Xerces→Axisの段階でXercesのTranscoderを使いwchar_tからcharへ変換が行われます。このため、Xercesの変換機能によりローカルのロケールへ変換されるためshift_jisで文字列が渡ってきます。
また、サーバ側では、クライアントから渡ってくる文字列は、shift_jisになります。また、クライアントへ文字列を返す場合は、UTF-8へ変換して渡す必要があります。では、クライアントの時と同様文字列の流れを見てみます。クライアントからのデータ受信時は
となるため、ここでもXerces→Axisの変換が発生し、shift_jisで文字列が渡ってきます。
サーバからクライアントへデータを返す場合は、
となり、Axis→Xercesへデータを渡す時にUTF-8である必要があるため、UTF-8への変換が必要になります。
なんだかねぇ。少々おかしな感じになってます。元々がASCII以外の文字コードをあまり考慮していないからなんだと思いますが不思議なねじれがあるとはいえ、日本語が通る事には感謝したいと思います。
文字コード変換は、ICUなんかを使うのも良いでしょう。使い方は、ICUを使おうを見て下さい。