PHP5 サイボウズガルーン3API ラッパーインターフェース(仮)
一部社内利用と、筆者が趣味で作成中の「サイボウズガルーン3 用 PHP5インターフェースクラス」を試験公開します。
が、まだデバッグ中であり、マニュアルもな〜んにもありません(笑)。よって一部動かないメソッドとか多数残っています。
それでもよければ、持って行ってください。
ダウンロード
(2014/07/25追記: うはwwwバグってました。日本語文字コード周りが以前のものはまるで駄目だったので書き換えました)
以下、初期設定と簡単な使用例を記します。
前提条件
- サイボウズガルーン Version 3.7.0以上 (開発を3.5.4で始めたので多分3.5系でも動く)
- PHP Version 5.3.0以上 (無駄にヒアドキュメントとか使っているのでそれをprintにでも書き換えれば5.2系でも動くかと)
base.wsdlを書き換えること
なぜか、garoon 3.7.0からWSDLファイルのパースに失敗するようになります(3.5系では問題なし)。
そこで、
[document/root]/[install_identifier]/api/2008/base.wsdl を下記に書き換えます(バックアップはとっておくこと)
base.wsdl
もしかすると、最新版では治っているかもしれませんので、実行してWSDLパースエラーが出る場合のみ
上記に書き換えてください。
(3.7 SP2(3.7.2)では改修頂いているようです。
よって、3.7.0〜3.7.1の場合のみ、この現象が出ることになります。)
なお、WSDLファイルをデフォルトではcacheしてしまいます。書き換えを行った場合は、
cacheを削除してください
phpデフォルトでは、
/tmp/wsdl*
- php.iniで zend.script_encoding (5.4.0未満では mbstring.script_encoding)を記述していること
スクリプトのエンコーディングが何であっても動いて欲しかったので、上記設定を見て、
SOAPの受け渡しでUTF-8に変換しています。
よって、これら設定がされていることを前提とします。
筆者の環境では SJIS で動きました。
もし記述がない場合には、UTF-8で動作すると思います。(だめだ、やっぱり記述してください。そのうち直します)
インストールと初期設定
- ダウンロードしたファイルを実行スクリプトを書くフォルダか、
includeパスが通っているフォルダにおいてください。
- 次に CbgrnSoapAPI_inc.php ファイルをご利用の環境に合わせて書き換えます。各項目の意味は
- GBGRNAPI_SERVER_NAME
- アクセスするガルーンサーバーのFQDNを書きます
- CBGRNAPI_SERVER_IS_UNIX
- そのサーバーがUNIX系の場合はtrue。Windows系の場合はfalse
- CBGRNAPI_SERVER_IS_APACHE
- ガルーンを実行しているhttp serverがapacheの場合true。IISの場合にはfalse
- CBGRNAPI_IDENTIFIER
- ガルーンのインストール識別子。デフォルトではcbgrn
- CBGRNAPI_TYPE_OF_SECURITY
- セキュリティタイプ。WS-Security=1。Cookie=2。ただし1しか実装しておりません(そのうち作るかも)
- CBGRNAPI_LOGIN_USER
- CBGRNAPI_LOGIN_PASSWORD
- デフォルトのログインユーザ/パスワード。実行時にsetUserメソッドを必ず呼ぶのであれば、適当でOK
- CBGRNAPI_ERROR_LANG
- エラーメッセージの言語。デバッグ中なので適当
- CBGRNAPI_USE_PROXY
- サーバーにproxy経由でアクセスする場合true。直接アクセスする場合はfalse。但しproxy経由は未テスト
- CBGRNAPI_PROXY_NAME
- CBGRNAPI_PROXY_PORT
- CBGRNAPI_PROXY_USER
- CBGRNAPI_PROXY_PASS
- 接続するproxyサーバーのFQDN/ポート番号/[ユーザ名/パスワード]
- SOAP_TRACE
- PHP-SOAPオプションのスイッチ。trueで、__getLastRequest()等が答えを返してくれます。
もうエラーは出ないぜ〜とかいう場合には、falseにしてください。
- SOAP_CACHE_WSDL
- WSDLファイルをcacheするかどうかの設定。設定可能な内容は、
- WSDL_CACHE_NONE
- WSDL_CACHE_DISK
- WSDL_CACHE_MEMORY
- WSDL_CACHE_BOTH
- CBGRNAPI_THIS_VERSION
- そのままにしておいてください。(Version管理しようかと思っていたのですが断念しました)
- CBGRNAPI_VERSION
- そのままにしておいてください。(同上)
- W3C_DATETIME_FORMAT
- そのままにしておいてください。(書き換えると動かなくなります)
プログラム例
例1. ユーザ[ユーザ名]に割り当てられているアドレス帳のタイトル一覧取得
<?php
require("CybozuGaroonAPI.php");
$api = new CybozuGaroonAPI();
$api->setUser("ユーザ名", "パスワード"); // ログインユーザの指定
$shared_books = $api->AddressGetReadAllowBooks(); // 権限の有るアドレス帳のID一覧を取得する
$book_list[-1] = "個人アドレス帳";
if (is_array($shared_books)) {
foreach ($shared_books as $book_id) {
$book = $api->AddressGetSharedBooksById($book_id);
$book_list[$book_id] = $book->name; // アドレス帳のブック名を取得する
}
}
var_dump($book_list);
?>
例2.ユーザの追加
<?php
require("CybozuGaroonAPI.php");
$client = new CybozuGaroonAPI();
// $client->setUser("Administrator", "password"); // 管理者ID/passをCbgrnSoapAPI_inc.phpで定義していれば必要ない
try {
$user_info = new CbgrnUserInfoType(); // 追加するユーザのユーザ情報を格納するクラス
$user_info->primary_group = 6;
$user_info->sort_key = "テストユーザ";
$user_info->email_address = "foo@bar.com";
$user_info->description = "ユーザのメモ";
$user_info->post = "課長";
$user_info->telephone_number = "000-000-0000";
$user_info->url = "http://www.bar.com";
$user_info->locale = 3;
$user_info->base = 3;
$user_info->organization = 6;
// ログインID, 表示名, パスワード, ユーザ情報
$result = $client->AdminAddUserAccount("text", "テストユーザ", "test", $user_info);
var_dump($result);
} catch (SoapFault $e) { // エラーが発生した時の例外処理
echo "[" . $e->faultcode . "]" . $e->getMessage() . "\n";
echo "Request:\n" . $client->__getLastRequest() . "\n";
}
?>
今後の課題
- デバッグ、デバッグ、デバッグ(笑)
- 思ったよりパフォーマンスが悪いので、速度とメモリーを無駄遣いしないように書き換えられるか...
- 引数などの最適化...アクセスクラスを定義したが、かえって操作が面倒だったりしたので、改善の余地ありか
- エラーメッセージクラス(class CbgrnSoapFault)を真面目に生成する...エラー処理が適当すぎるのでちゃんと作りこまないと...
- 簡易マニュアル作成(泣)...めんどくさ...
開発中の気付き
WSDLファイルの問題
サイボウズガルーンにおけるAPIは、wsdlファイルに関して、あまり関心を払っていないようです。
そのため、上記のbase.wsdlがパースエラーになったり、プログラム応答のxmlと、WSDLが不一致であったり
します。具体的には、
base.wsdl がパースエラー (先述)(3.7.2で直っています)
- AdminGetOrgDetailById orgDetailとなっているがSOAP応答は"OrgDetail"で不一致となる
- 他にもあるかも
xml名前空間修飾子があると動かない
おそらくガルーンAPIに挑戦した方の多くがこれにハマると思います。
例えば、
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns1="http://wsdl.cybozu.co.jp/schedule/2008"
xmlns:ns2="http://schemas.cybozu.co.jp/schedule/2008"
xmlns:ns3="dummyNameSpace">
:<中略>
<ns1:ScheduleAddEvents>
<parameters>
<schedule_event id="dummy" event_type="normal" version="dummy" public_type="public" detail="title" description="description">
<ns2:members>
<ns2:member>
<ns2:user id="6"/>
</ns2:member>
<ns2:member>
<ns2:facility id="6" order="2"/>
</ns2:member>
</ns2:members>
<ns2:when>
<ns2:datetime start="2013-07-12T23:30:00+00:00" end="2013-07-13T01:00:00+00:00"/>
</ns2:when>
</schedule_event>
</parameters>
</ns1:ScheduleAddEvents>
のようにリクエストxmlを書くと(PHP-SOAPはこんな出力になる)、xml上では正しい(はず)のですが、
サイボウズガルーンAPIは読み取ってくれません。
何が原因かというと、ns2:という名前空間識別子があるとそれを正しく認識できないようです。
(なぜか、この例の ns1: はOKなんですけどね)
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns1="http://wsdl.cybozu.co.jp/schedule/2008"
xmlns:ns2="http://schemas.cybozu.co.jp/schedule/2008"
xmlns:ns3="dummyNameSpace">
:<中略>
<ns1:ScheduleAddEvents>
<parameters>
<schedule_event id="dummy" event_type="normal" version="dummy" public_type="public" detail="title" description="description">
<members>
<member>
<user id="6"/>
</member>
<member>
<facility id="6" order="2"/>
</member>
</members>
<when>
<datetime start="2013-07-12T23:30:00+00:00" end="2013-07-13T01:00:00+00:00"/>
</when>
</schedule_event>
</ns1:ScheduleAddEvents>
</parameters>
このように ns2: を飛ばしてxmlを生成し、SOAPサーバーにリクエストを投げると答えが返ってきます。
おそらく2段目以降のxmlメンバを名前空間付きでパースしてないんじゃないかと思われます。
このライブラリでは仕方ないので、__doRequest()でリクエストxmlを無理やり ns2: → space と書き換えて
リクエストを通しています。
(必ずns2:という名前空間になるとは限らないので、かなり危険な実装です)
また、同様の問題が、SOAPヘッダ部にもあって、やっぱり<Username>とかに名前空間がつくとダメっぽいです。
こちらは、生でSOAPヘッダを生成することで、回避しました。
マニュアルの誤記大杉
APIマニュアルが公開されていますが、少なくとも私が印刷した
- API概要 第6版
- Base 第5版
- Util 第3版
- システム管理 第4版
- スケジュール 第4版
- メッセージ 第4版
- 掲示板 第2版
- ファイル管理 第3版
- アドレス帳 第3版
- メール 第4版
- ワークフロー 第3版
- マルチレポート 第3版
- お気に入り 第3版
- 通知 第4版
では、かなりの数の誤記が有ります。すぐに分かるものは良いのですが、かなり悩んだものが有りました。
直して欲しいところです。
なお、このページで公開するソフトウェア並びに文章は、当社の業務とは関係なく作成したものであり、
当社並びに筆者はなんら責任を負いません。利用は各自自己責任でおねがいします。
自由に使って頂いて結構ですが、著作権は放棄しません。また、再配布もご遠慮願います。
デバッグ中ということも有り、仕様は予告なく変更します。特にメソッドの引数は多分変わっていきます
問い合わせ等は、基本的に受け付けておりません。が、筆者が興味をもった内容については、
ご回答する場合がございます。それでもよければ、
webmaster@hokoku-kogyo.co.jp (@を@に変えてね)
まで、メール下さいm(_ _)m
「動いたぜ〜」とかいうメールは作者の励みになります。ご返事は出来兼ねますが、喜んで受け付けます(笑)
「うちで働けゴルァヽ(`Д´)ノ」ご相談に応じる用意は有ります。が、別チャンネルでw