SugarCRM の REST Web サービスを拡張し、XML を使用する

XML と SugarCRM とを組み合わせ、大規模なデータ・セットを扱えるように Web サービスを改善する

SugarCRM 5.5 の登場により、Web サービスのフレームワーク全体が強化されました。既存の SOAP のサポートを補完するために REST のサポートが追加されただけではなく、ビジネス・アプリケーションを容易にサポートするために、安全にアップグレードできる形で Web サービスをカスタマイズできるようになりました。SugarCRM の REST Web サービスは、その初期設定では Web サービスとやり取りをするデータ・フォーマットとして、JSON と、シリアライズされた PHP データを使用します。この記事では、SugarCRM のインスタンスでデータを送受信する際のデータ・フォーマットとして XML を追加するのがいかに容易であるかを説明します。

John Mertic, Software Engineer, SugarCRM

Photo of John MerticJohn Mertic は SugarCRM のソフトウェア・エンジニアであり、PHP による Web アプリケーションを数年間経験してきています。彼はこれまで SugarCRM で、データ統合や、モバイル・インターフェースやユーザー・インターフェースのアーキテクチャーなどを専門としてきました。彼は精力的なライターとして、php|architect や IBM developerWorks、Apple Developer Connector などに記事を発表しており、また『The Definitive Guide to SugarCRM: Better Business Applications』の著者でもあります。彼は多くのオープンソース・プロジェクトにも貢献しており、そのうち最も重要なものは PHP プロジェクトです。彼は PHP の Windows インストーラーの作成者でありメンテナーでもあります。



2011年 6月 24日

なぜ XML なのか?

よく使われる頭文字語

  • Ajax: Asynchronous JavaScript + XML
  • API: Application Program Interface
  • HTML: HyperText Markup Language
  • HTTP: HyperText Transfer Protocol
  • REST: REpresentational State Transfer
  • URL: Uniform Resource Locator
  • W3C: World Wide Web Consortium
  • XML: Extensible Markup Language
  • XSLT: Extensible Stylesheet Language Transformations

JSON (JavaScript Object Notation) とシリアライズされた PHP データがサポートされているにもかかわらず、なぜ XML が必要なのでしょうか。この疑問は SugarCRM の Web サービスに限られた話ではありません。REST スタイルの Web サービスでは、より構造化された XML データ・フォーマットよりも JSON を使用する Web サービスがますます増えています。というのは JSON の方が XML よりも軽量であり、データのエンコードに対するサポートが容易であり、さらにペイロードをリッチな Ajax アプリケーションで直接利用できるためです。その一方で JSON は、Web 上での通信で最も重要なデータ・フォーマットというわけではありません。それは、XML の最盛期に XML が、Web 上での通信で最も重要なデータ・フォーマットとみなされたわけではないのと同じことです。XML ではなく JSON 表現を使用することにはいくつかのメリットがありますが、それでもやはり JSON やシリアライズされた PHP よりも XML の方がデータ・フォーマットとして望ましい場合があります。そうした例を以下に挙げます。

  • データ・セットが大規模な場合、そのデータをすべて一度に解析しようとすると、非常にコストがかかります。JSON やシリアライズされた PHP では、データ構造全体を一度にメモリーにロードする必要がありますが、それよりも XML プル・パーサーを使用した方が、大規模なデータ・セットをより効率的に処理することができます。
  • XSLT を使用することで、XML データを任意の表示フォーマットに容易に変換することができます。例えば、Web サービスを呼び出した結果を取得し、次に XSLT 変換を行い、ユーザーに表示するための HTML 文書を作成することができます。
  • レガシー・アプリケーションやプログラミング言語の多くは、ネイティブで XML をサポートしていますが、JSON は新しい技術なのでサポートしていません。また、皆さんが PHP 以外の言語を使用している場合には、シリアライズされた PHP データの処理は選択肢とはならないでしょう。

XML は時代遅れの技術であると感じている人も多いかもしれませんが、むしろ XML によって上記のような特定分野の事例がうまく処理できるようになりつつあります。したがって、XML 技術を SugarCRM の Web サービスの入出力データ・フォーマットの 1 つとしてサポートすることは、間違いなく有益です。


SugarCRM の Web サービスをカスタマイズする

まず、SugarCRM の Web サービスの API に、カスタムのエントリー・ポイントを追加することから始めましょう。このエントリー・ポイントとは、SugarCRM の Web サービスのメソッドを実行するために、クライアントが HTTP POST を使用して呼び出す URL のことです。既存の Web サービスを変更したくないので、新しいエントリー・ポイントを v2 Web サービスに追加します (v2 Web サービスにはエントリー・ポイント service/v2/rest.php を使用してアクセスします)。そのためには、custom ディレクトリーで定義されたエントリー・ポイントを使用します (このエントリー・ポイントの場所は custom/service/v2/rest.php です)。リスト 1 に、このエントリー・ポイントの内容を示します。

リスト 1. Web サービスのエントリー・ポイントである rest.php
<?php
if(!defined('sugarEntry')) define('sugarEntry', true);
chdir('../../..');
$webservice_class = 'CustomSugarRestService';
$webservice_path = 'custom/service/core/CustomSugarRestService.php';
$webservice_impl_class = 'SugarRestServiceImpl';
$registry_class = 'registry';
$location = '/custom/service/v2/rest.php';
$registry_path = 'service/v2/registry.php';
require_once('service/core/webservice.php');

リスト 1 のエントリー・ポイントでは、さまざまな変数が定義されています。つまり Web サービスのエントリー・ポイントの定義の一部として、さまざまなプロパティーを設定する必要があるということです。この例で注目すべき重要な変数は、クラスの名前を定義する $webservice_class と、クラスのパスを定義する $webservice_path です。このクラスは webservice に対する受信リクエストを処理し、該当する Web サービスのメソッドを呼び出します。またこのクラスは、その Web サービスのメソッドから取得した結果を適切にパッケージ化し、そのペイロードをクライアントに返します。また、このエントリー・ポイントへのパスは $location プロパティーで指定します。

今度は webservice クラスについて詳しく調べてみましょう。このクラスは custom/service/core/CustomSugarRestService.php にあります。リスト 2 に、このクラスの定義を示します。

リスト 2. CustomSugarRestService の webservice ハンドラー・クラス
<?php
if(!defined('sugarEntry')) define('sugarEntry', true);
require_once('service/core/SugarRestService.php');
class CustomSugarRestService extends SugarRestService
{
   /**
         * @see SugarRestService::_getTypeName()
         */
        protected function _getTypeName($name)
        {
            if ( strtolower($name) == 'xml' ) {
                return 'SugarRestXML';
            }
        return parent::_getTypeName($name);
        }

        /**
         * @see SugarRestService::__construct()
         */
        public function __construct($url)
        {
              $GLOBALS['log']->info('Begin: SugarRestService->__construct');
              $this->restURL = $url;
              $this->responseClass = $this->_getTypeName
($_REQUEST['response_type']);
              $this->serverClass = $this->_getTypeName($_REQUEST['input_type']);
              $GLOBALS['log']->info('SugarRestService->__construct serverclass 
= ' . $this->serverClass);
              if ( file_exists('service/core/REST/'. $this->serverClass . '.php') ) {
                  require_once('service/core/REST/'. $this->serverClass . '.php');
                }
       elseif ( file_exists('custom/service/core/REST/'. $this->serverClass . 
'.php') ) {

           require_once('custom/service/core/REST/'. $this->serverClass . '.php');
       }
       else {
          $GLOBALS['log']->fatal('ERROR: SugarRestService->__construct serverClass
'.$this->serverClass.' not found');
       }
                $GLOBALS['log']->info('End: SugarRestService->__construct');
        }

        /**
         * @see SugarRestService::serve()
         */
        public function serve()
        {
            $GLOBALS['log']->info('Begin: SugarRestService->serve');
            if ( file_exists('service/core/REST/'. $this->responseClass . '.php') ) {
            require_once('service/core/REST/'. $this->responseClass . '.php');
                }
       elseif ( file_exists('custom/service/core/REST/'. $this->responseClass . 
'.php') ) {
           require_once('custom/service/core/REST/'. $this->responseClass . '.php');
       }
       else {
          $GLOBALS['log']->fatal('ERROR: SugarRestService->__construct serverClass
'.$this->responseClass.' not found');
       }
                $response  = $this->responseClass;
                $responseServer = new $response($this->implementation);
                $this->server->faultServer = $responseServer;
                $this->responseServer->faultServer = $responseServer;
                $responseServer->generateResponse($this->server->serve());
                $GLOBALS['log']->info('End: SugarRestService->serve');
        }
}

このリストの最初の部分では、まず SugarRestService::_getTypeName() メソッドをオーバーライドし、次のセクションで定義する SugarRestXML クラスを使用できるように XML タイプをマッピングする機能を追加しています。また、サーバー・クラスをインスタンス化するコンストラクターをオーバーライドしています。さらに、レスポンス・クラスをインスタンス化するために、SugarRestService::serve() メソッドもオーバーライドしています。この 2 つの変更が必要な理由は、このメソッドが service/core/REST/ ディレクトリーだけではなく、custom/service/core/REST/ ディレクトリーも検索して、SugarRest の異なる実装を見つけられるようにするためです。


XML フォーマットのリクエストを処理する

これで、カスタムの Web サービスに対するエントリー・ポイントが定義され、custom ディレクトリーにある SugarRest 実装の検索に必要なフックが webservice クラスに追加されたので、Web サービスで使われる XML データを処理するクラスの定義を始めることができます。そこで、SugarRestXML という新しいクラスを定義しましょう。このクラスは SugarRest クラスのサブクラスであり、受信した XML ペイロードの処理、および適切な XML フォーマットでクライアントに処理結果を返すといった、必要となる機能を提供します。

まず、最初の部分を見てみましょう。この部分では、受信した XML ペイロードを処理するためのメソッドを定義しています。このタスクを処理する主要なメソッドは SugarRestXML::serve() です。このクラスの定義をリスト 3 に示します。

リスト 3. Web サービスのリクエストを処理する SugarRestXML.php
<?php
if(!defined('sugarEntry')) define('sugarEntry', true);
require_once('service/core/REST/SugarRest.php');

/**
* This class is a XML implementation of REST protocol
*/
class SugarRestXML extends SugarRest
{
        /**
         * @see SugarRest::serve()
         */
        public function serve()
        {
            $GLOBALS['log']->info('Begin: SugarRestXML->serve');
            $xml = !empty($_REQUEST['rest_data'])? $_REQUEST['rest_data']: '';
            if(empty($_REQUEST['method']) || !method_exists($this->implementation, 
$_REQUEST['method'])){
                        $er = new SoapError();
                        $er->set_error('invalid_call');
                        $this->fault($er);
                }
         else {
               $method = $_REQUEST['method'];
               $data = $this->_convertXMLToArray(from_html($xml));
               if(!is_array($data))$data = array($data);
               $GLOBALS['log']->info('End: SugarRestXML->serve');
               return call_user_func_array(array( $this->implementation, 
$method),$data);
               }
        }

このメソッドは非常に基本的なものであり、想定される REQUEST 変数の methodrest_data が設定されているかどうかを調べます。method パラメーターは呼び出し対象となる Web サービスのメソッドを指定し、rest_data はそのメソッドに渡される XML ペイロードを含んでいます。XML フォーマットの受信リクエストにはパラメーターがありますが、各々のパラメーターは parameters タグで囲まれた項目としてメソッドに渡されます。それらのパラメーターのいずれかが、入力として配列を受け付ける場合には、その配列はそのパラメーターのタグに含まれるタグとなることにより、「XML 化」されます。例えば SugarCRM のインスタンスにログインするためには、リスト 4 に示す XML を Web サービスの login メソッドに渡します。

リスト 4. Web サービスの login メソッドに渡される XML ペイロード
<?xml version="1.0" encoding="UTF-8"?>
<parameters>
   <user_auth>
       <user_name>admin</user_name>
       <password>{md5 encoded password}</password>
       <version>0.1</version>
   </user_auth>
   <application_name>test</application_name>
   <name_value_list />
</parameters>

このペイロードを受け付けるためには、このペイロードを PHP の配列に変換し、Web サービスのメソッドを実装する内部メソッドに渡します。そのためには、PHP に組み込まれている SimpleXML クラスを利用する単純なメソッドを追加します。このクラスは単純に XML クラスを PHP オブジェクトに変換し、そのオブジェクトの子要素を順に処理して連想配列を作成します (リスト 5)。

リスト 5. XML を配列に変換する SugarRestXML.php
/**
         * Converts an XML string to a PHP array
         *
         * @param string $xml
         * @return array
         */
        protected function _convertXMLToArray($xml)
        {
            $returnArray = array();
            $xmlObject = simplexml_load_string($xml);

            foreach ( $xmlObject->children() as $child ) {

            // Attempt to convert the child element to a string; if it comes out a
            // non-empty string, then the child element has no children.
                $contents = trim((string) $child);
                if ( !empty($contents) ) {
                    $returnArray[$child->getName()] = $contents;
                }
                else {
                         // Recursively call this method to convert any 
                         // child arrays to XML
                    $returnArray[$child->getName()] 
= $this->_convertXMLToArray($child->asXML());
                }
           }
           return $returnArray;
        }

作成される連想配列の項目のキーとして XML タグ名を使用し、XML 文書に対して再帰的に処理を行います。そしてこの配列は、リスト 3call_user_func_array() 関数を使用して呼び出される Web サービスのメソッドに渡されます。


XML フォーマットの XML レスポンスを返す

ここまでで、Web サービスへのリクエストとして受信した XML ペイロードを処理する部分は作成できたので、今度はクライアントに XML レスポンスを返す部分を作成しましょう。このステップでは、SugarRest::generateResponse() メソッドと SugarRest::generateFaultResponse() メソッドをオーバーライドします (リスト 6)。

リスト 6. Web サービスのレスポンスを処理する SugarRestXML.php
   /**
         * @see SugarRest::generateResponse()
         */
        public function generateResponse($input)
        {
             // If there is a fault object, return it instead.
             if (isset($this->faultObject)) {
                    $this->generateFaultResponse($this->faultObject);
                }
                else {
                    ob_clean();
                    echo $this->_convertArrayToXML($input);
                }
        }
        /**
         * @see SugarRest::generateFaultResponse()
         */
        public function generateFaultResponse($errorObject)
        {
                $error = $errorObject->number . ': ' . $errorObject->name . 
                '<br>' . $errorObject->description;
                $GLOBALS['log']->error($error);
                ob_clean();
                echo $this->_convertArrayToXML($errorObject);
        }

SugarRestXML::generateResponse() が呼び出されるのは、Web サービスのメソッドがユーザーに返す内容を用意できたときです。このメソッドはまず、ユーザーに返される内容が fault オブジェクトであるかどうか (つまりユーザーにエラーを返すのかどうか) を調べます。エラーを返す場合には、SugarRestXML::generateFaultResponse() メソッドを呼び出します。このメソッドは、その内部でエラーをログに記録します。いずれにせよ、これらのメソッドに入力される内容は PHP の配列またはオブジェクトであり、その配列またはオブジェクトを XML 文書に変換する必要があります。この処理も、リスト 7 のように再帰的に行います。

リスト 7. 配列を XML に変換する SugarRestXML.php
           /**
         * Converts a PHP array into XML
         *
         * @param array $input
         * @return string XML
         */
        protected function _convertArrayToXML($input)
        {
            $xmlWriter = new XMLWriter();
            $xmlWriter->openMemory();
            $xmlWriter->setIndent(true);
            $xmlWriter->startDocument('1.0','UTF-8');
            $xmlWriter->startElement('result');
            foreach ( $input as $key => $value ) {
                if ( is_array($value) ) {
               $xmlWriter->startElement($key);
               $this->_convertArrayItemToXML($value,$xmlWriter);
               $xmlWriter->endElement();
                }
                else {
                    $xmlWriter->writeElement($key,$value);
                }
            }
            $xmlWriter->endElement();
            $xmlWriter->endDocument();

            return $xmlWriter->outputMemory();
        }

        /**
         * Converts an item in a PHP array into XML
         *
         * @param array $item
         * @param object XMLWriter $xmlWriter
         * @return string XML
         */
        protected function _convertArrayItemToXML(array $item, XMLWriter $xmlWriter)
        {
            foreach ( $item as $key => $value ) {
            // If this is an array, we'll call SugarRestXML::_convertArrayItemToXML()
            // to convert the array to XML, containing inside the given $key element.
            if ( is_array($value) ) {
               $xmlWriter->startElement($key);
               $this->_convertArrayItemToXML($value,$xmlWriter);
               $xmlWriter->endElement();
                }
                // If it is just a scalar, we can write out the element directly.
                else {
                    $xmlWriter->writeElement($key,$value);
                }
       }
        }

ここでは、クライアントに返すための XML 文書を作成するために、XMLWriter コンポーネントを利用しています。それを 2 つのメソッドによって行います。まず SugarRestXML::_convertArrayToXML() を呼び出し、XML 宣言ヘッダーと、ルートとなる result タグを作成します (result タグは Web サービスのメソッドを呼び出した結果を含んでいます)。次に、SugarRestXML::_convertArrayItemToXML() を再帰的に呼び出して、結果を含む配列に対し繰り返し処理を行い、結果を含む配列のすべてのノードを適切な XML のフォーマットに変換します。作成された XML ペイロードはクライアントに返されます。リスト 8 に、このペイロードの例を示します。

リスト 8. Web サービスの login を呼び出した結果返される XML ペイロードの例
<?xml version="1.0" encoding="UTF-8"?>
<result>
<id>jq4v1mj3a2e0vcer9s2n3pddi4</id>
<module_name>Users</module_name>
<name_value_list>
 <user_id>
  <name>user_id</name>
  <value>1</value>
 </user_id>
 <user_name>
  <name>user_name</name>
  <value>admin</value>
 </user_name>
 <user_language>
  <name>user_language</name>
  <value>en_us</value>
 </user_language>
 <user_currency_id>
  <name>user_currency_id</name>
  <value></value>
 </user_currency_id>
 <user_currency_name>
  <name>user_currency_name</name>
  <value>US Dollars</value>
 </user_currency_name>
</name_value_list>
</result>

サーバーに渡された XML ペイロードの場合とまったく同じように、返されるペイロードには XML ファイルのタグ名として返される連想配列のキーが含まれています。これらのキーは配列を値として持っていますが、これらの値は特定の XML タグの子として表されます。XML ペイロード全体は XML の result タグに囲まれて返されます。


新たに定義された Web サービスを呼び出す

ここまでで、XML ペイロードを処理して返送できるカスタムの Web サービスを作成できたので、この Web サービスがどのように実行されるかを示す単純なコードの例を見てみましょう (リスト 9)。

リスト 9. カスタムの Web サービスに接続し、XML フォーマットでデータを送受信するスクリプトの例
<?php

// specify the REST web service to interact with
$url = 'http://localhost/sugarcrm/custom/service/v2/rest.php';
$username = 'username';
$password = md5('password');

// Open a curl session for making the call
$curl = curl_init($url);

// Tell curl to use HTTP POST
curl_setopt($curl, CURLOPT_POST, true);

// Tell curl not to return headers, but do return the response
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

// Set the POST arguments to pass to the Sugar server
$xml = <<<EOXML
<?xml version="1.0" encoding="UTF-8"?>
<parameters>
   <user_auth>
       <user_name>{$username}</user_name>
       <password>{$password}</password>
   </user_auth>
</parameters>
EOXML;
$postArgs = array(
               'method' => 'login',
               'input_type' => 'xml',
               'response_type' => 'xml',
               'rest_data' => $xml
               );
curl_setopt($curl, CURLOPT_POSTFIELDS, $postArgs);

// Make the REST call, returning the result
$response = curl_exec($curl);

// Translate the returned XML data into a SimpleXML object
$xml = simplexml_load_string($response);

// Handle the case of an error response.
if ( !isset($xml->id) ) {
   die("Error: {$xml->name} - {$xml->description}\n.");
}

// Echo out successfully returning an session id
echo "Logged in successfully! Session ID is {$xml->id}\n";

この例では、Web サービスの login メソッドを呼び出します。サーバーに送信するペイロードの input_type と、返されるペイロードの response_type の両方を XML と指定し、実際の XML データを rest_data パラメーターに渡します。次に、PHP の SimpleXML ライブラリーを使用して XML を構文解析し、PHP オブジェクトに変換します。そして、そのクラスの id 属性を取得し、ログインの成功を示すメッセージと、返されたセッション ID を表示します。


まとめ

この記事では、XML データ構造を使用して Web サービスとやり取りすることには、今でもなお価値があることを説明しました。つまり XML を使用すると、大規模なデータ・セットを効率的に処理したり、返されたデータを多様なフォーマットに容易に変換したりすることができます。次にこの記事では、SugarCRM の Web サービスで XML ペイロードも使用できるようにする方法として、カスタムのエントリー・ポイントを作成するコードについて説明しました。また、受信した XML ペイロードを処理し、Web サービスのメソッドで XML データを使用できるようにするためのコードと、メソッドが返す配列を取得し、それを XML 文書に変換してクライアントに返すためのコードの両方を説明しました。最後に、XML データを使用している SugarCRM の Web サービスをどのように呼び出すかを示すスクリプトの例を紹介しました。


ダウンロード

内容ファイル名サイズ
article source codesugarcrmxmlrest.source.zip6KB

参考文献

学ぶために

  • SugarCRM Developer Documentation では、SugarCRM のさまざまな API について詳細に解説されています。
  • SugarCRM Developer Zone で SugarCRM 開発者のためのコンテンツを調べてみてください。
  • SugarCRM をベースにアプリケーションを作成するための素晴らしい案内書、『The Definitive Guide to SugarCRM: Better Business Applications』を読んでください。
  • Build a RESTful Web service」(Andrew Glover 氏著、developerWorks、2008年7月) を読んでください。このチュートリアルでは、REST の基本的な概念について、また Restlets を使用してアプリケーションを作成する方法について、順を追って学ぶことができます。
  • 連載記事「Learning PHP」(Nicholas Chase 氏と Tyler Anderson 氏の共著、developerWorks、2005年6月、7月) を読んでください。このチュートリアルでは PHP を使用したプログラミングについて学ぶことができます。
  • PHP.net を訪れ、広く使用されている汎用のスクリプト言語である PHP のドキュメントを調べてみてください。
  • Recommended PHP reading list」を利用して、PHP (Hypertext Preprocessor) について学んでください。この読み物リストは、プログラマーや管理者のために IBM の Web アプリケーション開発者がまとめたものです。
  • developerWorks に公開された PHP 関連の記事を、オープンソースのライブラリーとして利用してください。広範な内容を網羅した技術記事や、ヒント、チュートリアル、その他のリソースが用意されています。
  • IBM developerWorks の PHP project resources を利用して PHP のスキルを磨いてください。
  • Extensible Markup Language (XML) 1.0 (Fifth Edition)」(W3C 勧告、2008年11月) を読んでください。この資料から、CDATA セクションなど、特定の XML の機能に関する詳細を知ることができます。
  • The XML FAQ」を訪れてください。このサイトは XML に関するもう 1 つの優れた情報源として、Peter Flynn 氏によって編集されています。
  • W3schools.com の「XML DOM Tutorial」を訪れ、ブラウザーで利用できる XML ベースのインターフェースにはどんなものがあるか (また、どのブラウザーがそれらのインターフェースをサポートしているか) を学んでください。
  • XHTML 1.0: The Extensible HyperText Markup Language」 (World Wide Web Consortium 勧告、2000年1月26日) を読み、HTML 4 を再定義し、サブセット化し、そして拡張する、現在および将来の文書型やモジュールのファミリーについて学んでください。
  • developerWorks の XML ゾーンには、XML の領域でのスキルを磨くためのリソースが豊富に用意されています。
  • developerWorks の Open source ゾーンをご覧ください。オープンソース技術を使用した開発や、IBM 製品でオープンソース技術を使用するためのハウ・ツー情報やツール、プロジェクトの更新情報など、豊富な情報が用意されています。
  • My developerWorks で developerWorks のエクスペリエンスをパーソナライズしてください。
  • XML および関連技術において IBM 認定技術者になる方法については、IBM XML certification を参照してください。
  • developerWorks の XML ゾーンを XML の技術ライブラリーとして利用してください。広範な話題を網羅した技術記事やヒント、チュートリアル、技術標準、および IBM Redbooks などが用意されています。また、他にも XML に関するヒントを記した記事があります。
  • developerWorks の Technical events and webcasts で、最新情報を入手してください。
  • developerWorks on Twitter で、今すぐ Twitter に参加して developerWorks のツイートをフォローしてください。
  • developerWorks podcasts で、ソフトウェア開発者のための興味深いインタビューや議論を聞いてください。
  • developerWorks On demand demos をご覧ください。初心者のための製品インストール方法やセットアップのデモから、上級開発者のための高度な機能に至るまで、多様な話題が解説されています。

製品や技術を入手するために

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, SOA and web services, Open source
ArticleID=681610
ArticleTitle=SugarCRM の REST Web サービスを拡張し、XML を使用する
publish-date=06242011