SugarCRM

第10回 Webサービスを利用してほかのシステムと連携する


河村 嘉之
オープンソースCRM株式会社
2009/7/8


クライアントのサンプル作成

 ここから、実際にSugarCRMのWebサービスを呼び出すクライアントのサンプルを作成します。

 SOAPベースのWebサービスは、XML、HTTPなどの標準的なWebの技術を利用しています。そのため、クライアント側のプログラム言語を限定しません。SugarCRMはPHPで記述されていますが、JavaやC#など、ほかの言語からサービスを利用することもできます。ここでは、JavaとPHPでサンプルを作成してみましょう。

Webサービスを呼び出すクライアントをJavaで作成

 ここでは、SugarCRMのWebサービスを呼び出すクライアントをJavaで作成します。SugarCRMのWebサービスでは、前述のとおり、そのサービスがどのような性質のものなのかを記述したWSDLを提供しています。多くの開発環境ではこのWSDLを利用してWebサービスを呼び出すコードを自動生成できます。

 ここでは、Javaをはじめ多くの言語で利用されている開発環境として「Eclipse」を用いてWebサービスを呼び出すコードを生成します。

 まず、Eclipseを立ち上げてJavaプロジェクトを作成します。そこでコンテキストメニューから、「新規→Web Services→Web Services Client」を選択します。するとダイアログが表示されますので、WSDLの場所として本稿の最初に説明したURLを指定し、ウィザードに従って値を入力していきます。すると、Webサービスを呼び出すコードが生成されます。

 ここで生成されるコードは、Apache AxisというJava用のSOAPエンジンを利用しますが、Eclipseでは必要なライブラリはクラスパスに自動的に追加されるので、開発者がこれらのライブラリを追加することなくアプリケーションを開発することができます。

 ここからは、Apache Axisを利用してSugarCRMのWebサービスを呼び出します。ここでは、以下の順番でSugarCRMのサービスを呼び出しています。

  1. ログイン
  2. レコードの検索
  3. レコードの更新
  4. ログアウト

 それぞれのサービスは、自動生成されたSugarsoapPortTypeというクラスのメソッドとして呼び出すことができます。各サービスで複合型のデータを送受信する場合は、その型に合わせたクラスも生成されていますので、それに合わせてデータを当てはめて利用します。

 ログイン時に、パスワードはそのまま送らずにMD5でダイジェストを生成して送る必要がありますが、ここではその方法は詳しく説明しません。詳しくは、「Javaでダイジェストを生成する(@IT Java Solution)」を参照してください。

public class SugarSoap {
  ...
  public void updateMeeting() {
    try {
      SugarsoapPortType sugar = new SugarsoapLocator().getsugarsoapPort();
      // (1)ログイン
      User_auth user_auth = new User_auth();
      user_auth.setUser_name("admin");
      user_auth.setPassword(md5Sum("admin"));
      user_auth.setVersion("1.0");
      Set_entry_result result = sugar.login(user_auth, "Sample");
      String sessionId = result.getId();

      // (2)レコードを検索
      String[] fields = {"id", "status", "date_start"};
      String query = "date(meetings.date_start) = '2009-05-17'";
      Get_entry_list_result search_result =
        sugar.get_entry_list(sessionId, "Meetings", query,
                        "meetings.name", 0, fields, 10, 0);
      Entry_value[] meetings = search_result.getEntry_list();

      // (3)レコードを更新
      Name_value[][] new_values = new Name_value[meetings.length][2];
      for (int i = 0; i < meetings.length; i++) {
        Name_value id = new Name_value();
        id.setName("id");
        id.setValue(meetings[i].getId());
        new_values[i][0] = id;
        Name_value status = new Name_value();
        status.setName("status");
        status.setValue("Held");
        new_values[i][1] = status;
      }
        sugar.set_entries(sessionId, "Meetings", new_values);

      // (4)ログアウト
      sugar.logout(sessionId);
    } catch (RemoteException e) { // TODO Error handling
    } catch (ServiceException e) { // TODO Error handling
    }
  }
  …
}

Webサービスを呼び出すクライアントをPHPで作成

 次に、PHPでサービスを呼び出してみましょう。

 ここでは、SugarCRMも利用している「NuSOAP」というSOAPエンジンを利用します。SugarCRMをインストールしたディレクトリ以下のincludeディレクトリに、nusoapというディレクトリがあります。今回はこのディレクトリを、以下のコードのファイルを置くディレクトリと同じディレクトリにコピーします。

 以下のコードでは、最初にNuSOAPのSOAPエンジンを初期化して、Javaのコードと同様に以下の処理を呼び出しています。

  1. ログイン
  2. レコードの検索
  3. レコードの更新
  4. ログアウト

 PHPでは連想配列が利用できるため、複合型のデータはこれを利用して送受信します。サービスの呼び出しはnusoapclientクラスのcallメソッドを利用して、これにサービス名と引数を指定して呼び出しています。

<?php
if(!defined('sugarEntry'))define('sugarEntry', true);
require_once('nusoap/nusoap.php');

$client = new nusoapclient('http://localhost/sugarpro52/soap.php?wsdl',true);
// (1)ログイン
$auth_array = array(
  'user_auth' => array(
    'user_name' => 'admin',
    'password' => md5('admin'),
    'version' => '1.0'
  ),
  'sample'
);
$login_result = $client->call('login', $auth_array);
$session_id = $login_result['id'];

//(2)レコードを検索
$search_array = array(
  'session' => $session_id,
  'module_name' => 'Meetings',
  'query' => 'date(meetings.date_start) = \'2009-05-17\'',
  'order_by' => 'meetings.name',
  'offset' => 0,
  'select_fields' => array('status', 'date_start'),
  'max_results' => 10,
  'deleted' => 0
);
$search_result = $client->call('get_entry_list', $search_array);

// (3)レコードを更新
$new_values = array();
foreach ($search_result['entry_list'] as $meeting) {
  $new_value = array(
    array('name'=>'id', 'value'=>$meeting['id']),
    array('name'=>'status', 'value'=>'Not Held')
  );
  $new_values[]=$new_value;
}
$update_array = array(
  'session' => $session_id,
  'module_name' => 'Meetings',
  'name_value_lists' => $new_values
);
$result = $client->call('set_entries', $update_array);

// (4) Logout

$result = $client->call('logout', array('session'=>$session_id));
?>

エラー処理を追加する

 上記のサンプルコードでは、呼び出しにエラーがあった場合の処理を記述していません。エラーがあるかどうかの判定は、Webサービスを呼んだ結果のerror属性に格納されているエラー情報のname属性が「No Error」という文字列かどうかで判定します。もしエラーがあった場合は、name属性にエラーの概要、description属性にエラーの詳細が格納されています。

$result = $client->call('login', $auth_array);
if ($result['error']['name'] == 'No Error') {
  $session_id = $result['id']; //正常時の処理
} else {
  echo($result['error']['name']."\n".$result['error']['description']."\n"); //エラー処理
}

コラム■SugarCRMの新しいWebサービス

 SugarCRMのWebサービスインターフェイスについて今回説明しましたが、現状のWebサービスには、いくつか改良を求めるリクエストが上がっています。

 例えばBeanの関連を参照するような場合、主となるBeanを取得した際に、それに関連付くBeanはIDのみが格納されているため、それぞれのデータは再度サービスを呼び出して取得しなければいけません。このように何度も外部サービスの呼び出しが発生すると、パフォーマンス的に問題になることがあります。

 現在、このような問題を解決するための仕組みやカスタマイズに柔軟に対応する仕組みなどを取り込んだ新しいWebサービスインターフェイスの仕様を検討中です。この新しいWebサービスインターフェイスは、次期バージョンであるSugarCRM v5.5に入る予定です。


まとめ

 今回は、SugarCRMのWebサービスを説明しました。Webサービスを利用することにより、SugarCRMに蓄積されているデータを外部から簡単に利用できることがご理解いただけたと思います。Webサービスを利用することにより、さまざまなアプリケーションとの連携が可能になります。実際に、多くのアプリケーションではWebサービスインターフェイスを利用してSugarCRMとの連携を実現しています。

 今回はSugarCRMのサービスを外部から利用する方法について説明しましたが、次回は外部のサービスをSugarCRMから利用する方法を説明したいと思います。SugarCRMの最新版バージョン5.2から「Cloud Connector」という外部のサービスを呼び出すためのフレームワークが導入されました。次回はこのCloud Connectorを利用し、Web上にあるサービスをSugarCRMから利用してみます。

2/2
 

Index
徹底解剖、SugarCRM(10)
 Webサービスを利用してほかのシステムと連携する
  Page 1
 SugarCRMのWebサービス
  Page 2
 クライアントのサンプル作成
 Webサービスを呼び出すクライアントをJavaで作成
 Webサービスを呼び出すクライアントをPHPで作成
 エラー処理を追加する
 コラム SugarCRMの新しいWebサービス
 まとめ

Linux Square全記事インデックス


 Linux Squareフォーラム 仮想化技術関連記事
連載:実践! Xenで実現するサーバ統合
有力な仮想化技術として注目を集めるようになった「Xen」。このXenを活用してサーバ統合を実践していく手順を具体的に紹介します
特集:サーバの仮想化技術とビジネス展開の可能性
jailからUML/VMwareまで
1台のマシンで複数のサーバを動かす「仮想化技術」。VMwareやUMLの登場により、WebサイトだけでなくOS自体を仮想化できるようになった
特集:仮想化技術のアプローチと実装
VMwareから要注目技術Xenまで

1台のサーバで複数の仮想マシンを実行する仮想化技術は、空間コストを引き下げる可能性を持つ。最新の仮想化技術を概観してみよう
特集:仮想OS「User Mode Linux」活用法
技術解説からカーネルカスタマイズまで
Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説
特集:仮想化技術の大本命「Xen」を使ってみよう
インストール & Debian環境構築編

高いパフォーマンスで本命の1つとなった仮想マシンモニタ「Xen」。日本語による情報が少ないXenを、実際に動かしてみよう
特集:仮想化技術の大本命「Xen」を使ってみよう
Xen対応カスタムカーネル構築編

Xen環境およびその上で動作する仮想マシン用カーネルを自分で構築しよう。これにより、自由にカスタマイズしたカーネルを利用できる
特集:IPv6、UML、セキュリティ機能の統合
全貌を現したLinuxカーネル2.6[第4章]

今回は、これまでに紹介し切れなかった機能を一気に紹介する。これを読めば、カーネル2.6の正式リリースが楽しみになるだろう
Linux Squareプロダクトレビュー VMware Workstation 4
PC/AT互換機エミュレータとして不動の地位を築いたVMware。その新バージョンがリリースされた。新機能を早速試してみよう
古くて新しい「サーバ仮想化技術」の行方
サーバ仮想化を実現するための技術がソフトウェア、ハードウェアの両面で出そろってきた。ハイパーバイザーのさらなる高速化に向けた動きを紹介する
Linux Squareフォーラム全記事インデックス


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間