Создание приложения на базе pureXML и JSON: Часть 3. Создание гаджетов OpenSocial для pureXML

Определение, развертывание и тестирование гаджетов OpenSocial для взаимодействия с JSON Universal Services

С помощью Web 2.0-технологии гаджетов OpenSocial разработчики могут легко размещать свои приложения на популярных Web-сайтах, таких как iGoogle, MySpace, Hi5, LinkedIn и другие. В этой статье гаджеты OpenSocial рассматриваются на примере разработки приложения, использующего pureXML®-возможности DB2®. Это последняя статья цикла из трех частей, в которой показано, как построить приложение pureXML, пользовательским интерфейсом которого служит гаджет, легко устанавливаемый на любой OpenSocial-совместимый Web-сайт. Следуя инструкциям из этой статьи, вы создадите пользовательский интерфейс, который хранит и извлекает данные JSON, описанные в первой статье, с помощью сервисов JSON Universal Services, созданных во второй.

Хань Нгуен, штатный инженер-программист, IBM

Фото Хань НгуенИнженер-программист Хань Нгуен (Han Nguyen) работает над новыми стандартами с акцентом на социальные сети в различных отраслях промышленности и для разных категорий продуктов. Ранее занималась разработкой технологий в сфере услуг и поддержки программного обеспечения.



Энди Смит, штатный инженер-программист, IBM

Фото Энди СмитаИнженер-программист Энди Смит (Andy Smith) работает над новыми стандартами с акцентом на применение технологий, связанных с социальными сетями, в различных отраслях промышленности и для разных категорий продуктов. Ранее работал над проектами, относящимися к Web-технологиям и порталам, в сфере услуг и поддержки программного обеспечения.



Марк Вейцель, архитектор программного обеспечения, IBM

Фото Марка ВейцеляМарк Вейцель (Mark Weitzel) работает старшим техническим сотрудником в группе новых стандартов и программного обеспечения с открытым исходным кодом отделения IBM Software Group, специализируясь на социальных сетях. До этого входил в состав группы автономных вычислений Tivoli, отвечая за несколько проектов по управлению системами open source в Eclipse и Apache.



23.11.2011

Сведения об OpenSocial

OpenSocial – это управляемая сообществом спецификация, которая определяет компонентную модель на основе браузера, называемую гаджетом, и API для доступа к информации о профиле пользователей и к их социальному образу (включая информацию о круге общения, деятельности и т.п.). Приложения, реализующие API, совместимы с широким кругом сайтов социальных сетей, таких как iGoogle, MySpace, Yahoo, Orkut, Hi5, LinkedIn и другие. В этой статье мы сосредоточимся на гаджетах OpenSocial и покажем, что они могут служить мощным средством расширения сферы охвата вашего приложения в Интернете.

Используемые сокращения

  • API: Application programming interface
  • CSS: Cascading stylesheets
  • HTML: HyperText Markup Language
  • HTTP: Hypertext Transfer Protocol
  • JSON: JavaScript Object Notation
  • SOA: Service Oriented Architecture
  • UI: User interface
  • URL: Uniform Resource Locator
  • XML: Extensible Markup Language

Что такое гаджет OpenSocial

  • Гаджет OpenSocial – это компактное представление Web-приложения, реализующее определенный набор API. Гаджет описывается XML-документом, который соответствует спецификации OpenSocial. Это определение содержит пользовательский интерфейс, такой как HTML, таблицы стилей CSS и JavaScript для определения логики операций, а также дополнительные метаданные об авторе, заголовке и т.п.
  • Сайт, который реализует спецификацию OpenSocial и может размещать приложения, называется контейнером OpenSocial. Это означает, что он может обрабатывать XML-определения гаджета и выдавать соответствующий HTML-код для браузера. Важно понимать, что определения гаджетов не обязательно должны размещаться на сайте, предоставляющем контейнер. Более того, гаджеты, как правило, обеспечивают сервис с абсолютно другого сайта. Контейнер предоставляет механизмы, такие как подписанные HTML-запросы, гарантирующие передачу исходящих от гаджета вызовов на его сайт. Будучи контейнером OpenSocial, сайт может обеспечить простой способ сосредоточения сервисов со всего Интернета.

Создание гаджета

Эта страница предоставляет пользователю средства для проверки базового набора функций, обеспечиваемых механизмом Universal Services, и отображает результаты.

На рисунке 1 показан снимок с экрана тестового приложения. Он послужит шаблоном для создания примера гаджета OpenSocial. Это даст пользователю необходимые средства взаимодействия с Universal Services.

Рисунок 1. Пример тестового приложения
Пример тестового приложения для ввода данных пользователя с перечнем Web-сервисов, входными данными и действиями

Сначала создадим несколько функций JavaScript для обеспечения основных запросов, которые управляют соединениями с сервисами pureXML. Затем добавим поддержку HTML вместе со спецификацией гаджета. Наконец, мы покажем, как создать и развернуть это приложение.

Функции JavaScript для подключения к сервисам pureXML

В листинге 1 приведен пример кода JavaScript, предназначенного для обработки запросов.

Листинг 1. Функции PureJSON JavaScript
var prefs = new gadgets.Prefs();
function getPrimaryKeys()	{
	var args = {};
	doPOST("getPrimaryKeys",args,displayJSONobj);  
};
function getJSONDocumentByKey(key)	{
	var args = {
	  id: key
	};
	doPOST("getDocumentByKey",args,displayJSONobj);  
};
function insertJSON(key, data)	{
	var args = {
	  id: key,
	  doc: data
	};
	doPOST("insert",args,response);  
};
function updateJSON(key, data)	{
	var args = {
	  id : key,
	  doc : data
	};
    doPOST("update",args,response);    
};
function deleteDocument(key)	{
	var args = {
	  id : key
	};
    doPOST("delete",args,response);
};
function doPOST(command,args,processResponseCallback)	{
	var url = "http://" + prefs.getString("pureXMLHostAddress") + 
			"/" + prefs.getString("contextRoot") + "/query/"+command;
	var params = {};
	postdata = gadgets.io.encodeValues(args);
	params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST;
	params[gadgets.io.RequestParameters.POST_DATA]= postdata;
	gadgets.io.makeRequest(url, processResponseCallback, params);
};
function response(obj)	{
	alert("Gadget implementation responsibility.");
};
function displayJSONobj(obj)	{
	alert("Gadget implementation responsibility.");
};

Рассмотрим назначение каждой функции:

  • getPrimaryKeys передает запрос getPrimaryKeys сервису для получения всех первичных ключей из таблицы DB2 и отображения результатов с использованием функции обратного вызова displayJSONobj по завершении транзакции.
  • getJSONDocumentByKey использует значение ключа для передачи getDocumentByKey сервису, чтобы извлечь запись JSON с первичным ключом, соответствующим входному значению. Эта функция отображает результат, используя функцию обратного вызова displayJSONobj.
  • insertJSON предполагает два входных параметра: уникальное значение первичного ключа и данные строки в формате JSON. Эта функция передает запрос сервису для создания новой строки в таблице DB2 и подтверждает статус вставки, когда транзакция возвращается с использованием функции обратного вызова response.
  • updateJSON предоставляет возможность передать запрос сервису, чтобы обновить запись JSON со значением первичного ключа, соответствующим входному значению ключа, причем отредактированные данные представлены в качестве входных данных в формате JSON. Эта же функция вызывает функцию обратного вызова response, чтобы подтвердить обновление по завершении транзакции.
  • deleteDocument обеспечивает интерфейс для передачи сервису запроса на удаление записи в соответствии с указанным входным первичным ключом. Эта функция вызывает функцию обратного вызова response, чтобы подтвердить удаление после выполнения запроса.
  • displayJSONobj – это абстрактная функция JavaScript, которая позволяет разработчикам использовать различные подходы к обработке результата вызова в браузере.
  • response – функция, которая управляет возвращаемыми значениями, отличными от JSON. Она следует той же стратегии, что и displayJSONobj, ожидая, что разработчики заменят данную функцию своей собственной реализацией.

Для передачи своих запросов перечисленные выше функции вызывают функцию doPOST. Функция doPOST ожидает команду запроса к сервису, входные значения запроса и функцию обратного вызова для обработки результата, возвращенного сервисом. Она использует эти входные параметры для обращения к сервисам gadgets.io.makeRequest. gadgets.io.makeRequest – это функция гаджетов OpenSocial, которая обеспечивает получение гаджетами данных и размещение этих данных на сторонних сайтах. Ее формат выглядит следующим образом: gadgets.io.makeRequest(url, callback, opt_params)

Параметры:

  • url – строка, содержащая URL сайта, куда нужно отправить запрос. Как видите, для получения URL функция doPOST извлекает две строки из объекта prefs с использованием метода getString. (Параметры pureXMLHostAddress и contextRoot ссылаются на имена элементов из определения гаджета, которое мы рассмотрим в следующем разделе.) К этим двум строкам присоединяются /query/ и команда (insert, getDocumentByKey, update, delete т.п). Например, когда функция insertJSON() вызывает doPOST, URL будет:
    http://xmlim.watson.ibm.com:9080/JSONUniversalServices/query/insert.
  • callback – ссылка на функцию, которая вызывается при возврате запроса. Например, response – это функция обратного вызова, которая отображает статус транзакции, а displayJSONobj – функция обратного вызова, которая отображает возвращенный объект JSON или сообщение, если это пустой объект.
  • opt_params – объект JavaScript, содержащий дополнительные параметры вызова (метод HTTP и данные POST). Мы указали метод HTTP-запроса gadgets.io.MethodType.POST, чтобы показать, что это метод POST. Кроме того, мы передали данные Post в объект postdata (указан как объект, содержащий пары ключ/значение с использованием gadgets.io.encodeValues() для форматирования входных значений args).

Сохраните листинг 1 под именем PureJSON.js. На следующем шаге мы построим определение гаджета и загрузим этот файл.

Определение гаджета OpenSocial

Теперь, когда у нас есть необходимый сценарий JavaScript, можно создать определение гаджета.

Создание определения гаджета OpenSocial

Нам нужно простое определение гаджета. В листинге 2 приведен пример такого определения. Каждое определение гаджета заключается в тег <Module>. <ModulePrefs> определяет основную информацию и функции гаджета.

Листинг 2. XML-определение гаджета OpenSocial
<?xml version="1.0" encoding="UTF-8"?>
<Module>
 <ModulePrefs title="Universal Services">
   <Require feature="opensocial-0.8"/>
   <Require feature="dynamic-height"/>
   <Require feature="minimessage"/>
 </ModulePrefs>
 <UserPref name="pureXMLHostAddress" 
 	  display_name="PureXML Host Address" 
 	  default_value="xmlim.watson.ibm.com:9080"/>
 <UserPref name="contextRoot" 
 	  display_name="Context Root" 
 	  default_value="JSONUniversalServices"/>

 <Content type="html">
 <![CDATA[
	<!-- Note: We will add more code and expand this section later  -->
  ]]>
 </Content>
</Module>

Первое, что вы заметите в определении гаджета, это атрибут <title> элемента <ModulePrefs>. Можно указать атрибуты, определяющие информацию гаджета, такую как название, автор, адрес электронной почты и т.п. Для этой демонстрации мы воспользуемся только атрибутом title. Важно отметить, однако, что некоторым контейнерам для динамического развертывания требуются определенные атрибуты. За этой информацией нужно обращаться к документации разработчика платформы.

Гаджету нужно также предоставить требуемые функции. Наш пример гаджета будет загружать следующие функции:

  • opensocial-0.8 – этот гаджет использует реализацию API OpenSocial версии 0.8, так что его можно развернуть в контейнерах, поддерживающих спецификацию OpenSocial v0.8.
  • dynamic-height – с помощью этой функции разработчик гаджета может менять его высоту по мере добавления или удаления содержания. Она вызывается при отображении в гаджете или удалении сообщений транзакций DB2.
  • minimessage – эта функция предоставляет набор API для создания и отображения сообщений пользователю внутри гаджета. Для создания сообщений о статусе транзакции DB2 в этом примере мы применяем функцию minimessage.

Определим набор пользовательских предпочтений (<UserPref>) для динамического задания конечной точки pureXML Universal Service и контекста пути приложения, по которому будет развернут гаджет. При обработке гаджета определенные нами элементы <UserPref> представляются как пользовательский ввод в интерфейс гаджета. Пользователь может редактировать и изменять эти настройки. Заметим, что атрибутом name для этих элементов <UserPref> служат те же имена, которые использовались функцией JavaScript doPOST в листинге 1 для получения строк, составляющих URL конечной точки.

Четвертый раздел, раздел содержания <Content>, определяет тип содержания гаджета – HTML. В разделе CDATA (character data) определяется само содержание гаджета путем создания HTML-таблицы для ввода пользовательских данных в сочетании с minimessage, предпочтениями пользователя и функциями JavaScript, составляющими исполняемый гаджет. На следующем шаге мы дополним этот раздел созданием клиентской части, подключаемой к сервисам pureXML.

Добавление содержимого в гаджет

В раздел CDATA определения гаджета, описанного на предыдущем шаге, добавим пример HMTL-таблицы и функции JavaScript для ввода информации и действий пользователя.

Во-первых, добавим таблицу стилей, используемую в HTML-таблице, как в листинге 3.

Листинг 3. Используемая таблица стилей
  <style type="text/css">
   table.layout {border:0; width:50%;}
   td.green {background-color:#BFFF80; 
      font-family:sans-serif, verdana;}      
   td.white {background-color:#FFFFFF; 
      font-family:sans-serif, verdana;}      
   th.green {background-color:#BFFF80; 
      font-family:sans-serif, verdana;}   
   th.white {background-color:#FFFFFF; 
      font-family:sans-serif, verdana;}   
   td.row-bright{background-color:#FFFFBF; 
      font-family:sans-serif, verdana; 
      text-align:center;}
   td.row-dark {background-color:#FFFF8C; 
      font-family:sans-serif, verdana; 
      text-align:center;}
   tr.row-bright {background-color:#FFFFBF; 
      font-family:sans-serif, verdana;}
   tr.row-dark {background-color:#FFFF8C; 
      font-family:sans-serif, verdana;}
   tr.empty {background-color:#FFFFFF; 
      height: 10px;}
   tr.empty-small {background-color:#FFFFFF; 
      height: 5px;}
  </style>

Затем включим файл JavaScript PureJSON.js из листинга 1. Когда гаджет загружен, PureJSON.js будет включен в код страницы, делая все функции POST-запросов доступными для действий с HTML-таблицей (листинг 4).

Листинг 4. Загрузка файла JavaScript
    <script type="text/javascript" src="./PureJSON.js"></script>

В третьих, добавим еще один тег <script>, как показано в листинге 5. Каждая функция JavaScript соответствует действию пользователя, указанному в HTML-таблице (их можно будет определить в следующем разделе), и вызывает одну из функций, определенных в PureJSON.js из листинга 1. При загрузке этого блока кода создается объект minimessage с использованием new gadgets.MiniMessage(_MODULE_ID_). Функция gadgets.util.registerOnLoadHandler(gadgets.window.adjustHeight), расположенная в конце тега, вызывается для регистрации гаджета в контейнере OpenSocial, вынуждая его во время обработки изменить кадр в соответствии с содержанием гаджета. Внутри этого тега script перепишем функции response и displayJSONobj так, чтобы отобразить результаты запроса для пользователей.

Листинг 5. Добавление функций гаджета
    <script type="text/javascript" src="./PureJSON.js"></script>   

    <script type="text/javascript">

    var msg = new gadgets.MiniMessage(__MODULE_ID__);

    function displayJSONobj(obj)	{
      var str = "The returned record is empty, it might not exist";
      if(obj.text!=""){
      	str = obj.text;
      }
      msg.createDismissibleMessage(str);
      gadgets.window.adjustHeight();
    };

    function callGetJSONDoc()	{
      getJSONDocumentByKey(document.getElementById("key1").value);
    };

    function getJSONDocumentByKeyReturn(obj)	{
      var str = obj.text;
      msg.createDismissibleMessage(str);
      gadgets.window.adjustHeight();
    };

    function callInsertJSON()	{
      insertJSON(document.getElementById("key2").value,
         document.getElementById("document1").value);
    };

    function callUpdateJSON()	{
      updateJSON(document.getElementById("key3").value, 
         document.getElementById("document2").value);
    };

    function callDeleteDoc()	{
      deleteDocument(document.getElementById("key4").value);
    };

   function response(obj)	{
     var str = gadgets.json.parse(gadgets.util.unescapeString(obj.text));

  if(str.updateCount == 1){
    var successMsg = msg.createDismissibleMessage(
        "Received returned code = 1. Transaction successful!");
    successMsg.style.color = "green";
  }
  else	{
   var failMsg = msg.createDismissibleMessage(
    "Did not receive returned code = 1. Transaction may have failed!");
      failMsg.style.color = "red";
  }
  gadgets.window.adjustHeight();
 };

  gadgets.util.registerOnLoadHandler(gadgets.window.adjustHeight);

  </script>

Наконец, добавим HTML-таблицу для ввода информации и действий пользователя. Код HTML показан в листинге 6. Сохраните определение гаджета в файле JSONclient.xml. Снимок с экрана на рисунке 1 иллюстрирует, как выглядит таблица после обработки.

Листинг 6. HTML-таблица
<table class="layout" cellspacing="2">
  <tr>
    <th class="green">Web Service</th>
    <th class="green" colspan="2">Input</th>
    <th class="green">Action</th>
  </tr>
  <tr class="row-bright">
    <td>getPrimaryKeys</td>
    <td colspan="2" align="center">none</td>
    <td align="center">
      <input type="submit" value="Invoke" onClick="getPrimaryKeys()"/>
    </td>
  </tr>
 <tr class="row-dark" >
  <td>getJSONDocumentByKey</td>
  <td align="right">ID:</td>
  <td align="center"><input type="text" id="key1" size="40" /></td>
  <td align="center">
   <input type="submit" value="Invoke" onClick="callGetJSONDoc()"/>
  </td>
 </tr>
 <tr class="row-bright">
   <td rowspan="2">insertJSON</td>
   <td align="right">ID:</td>
   <td align="center"><input type="text" id="key2" size="40" /></td>
   <td align="center" rowspan="2">
     <input type="submit" value="Invoke" onClick="callInsertJSON()"/>
   </td>
 </tr>
  <tr class="row-bright">
    <td align="right">Document:</td>
    <td align="center">
      <textarea id="document1" cols="30" rows="5" ></textarea>
    </td>
  </tr>
  <tr class="row-dark" >
    <td rowspan="2">updateJSON</td>
    <td align="right">ID:</td>
    <td align="center"><input type="text" id="key3" size="40" /></td>
    <td rowspan="2" align="center">
	    <input type="submit" value="Invoke" onClick="callUpdateJSON()"/>
    </td>
  </tr>
  <tr class="row-dark">
    <td align="right">Document:</td>
    <td align="center">
     <textarea id="document2" cols="30" rows="5" ></textarea>
    </td>
  </tr>
  <tr class="row-bright">
    <td>deleteDocument</td>
    <td align="right">ID:</td>
    <td align="center"><input type="text" id="key4" size="40" /></td>
    <td align="center">
      <input type="submit" value="Invoke" onClick="callDeleteDoc()"/>
    </td>
  </tr>
</table>

Развертывание и тестирование

Теперь нужно развернуть гаджет, а затем проверить его.

Развертывание гаджета

Для проверки нового приложения Universal Services можно просто развернуть PureJSON.js и JSONclient.xml на сервере HTTP. Так как файлы доступны через URL, контейнер OpenSocial должен быть в состоянии получать спецификацию гаджета и в соответствии с ней обрабатывать его содержание. Сервер OpenSocial имеет ряд возможностей как для локального развертывания в рамках проектов с открытым кодом, так и для размещения на внешних платформах. Для простоты развернем этот пример гаджета в песочнице iGoogle, которая предоставляет контейнер OpenSocial.

  1. Зарегистрируйтесь на http://www.google.com/ig/sandbox.
  2. Затем отправляйтесь по ссылке Add stuff в верхней правой части страницы. Она ведет на страницу, которая предоставляет возможности поиска зарегистрированных гаджетов. См. рисунок 2. Помните, что адрес URL должен быть доступен из Интернета. Например, если вы работаете за межсетевым экраном, установка может не функционировать, так как определение гаджета нельзя загрузить и обработать в контейнере OpenSocial, в данном случае – iGoogle. (См. увеличенную версию рисунка 2.)
    Рисунок 2. Размещение приложения в песочнице iGoogle
    Снимок с экрана песочницы iGoogle, куда можно добавлять свои приложения
  3. Затем нужно дополнить этот новый гаджет URL-адресом. В левой навигационной панели есть ссылка Add feed or gadget. Она открывает диалоговое окно, куда нужно ввести полный URL файла JSONclient.xml. См. рисунок 3.
    Рисунок 3. Размещение гаджета OpenSocial в песочнице iGoogle
    Размещение гаджета OpenSocial в песочнице iGoogle
  4. Теперь можно вернуться на свою домашнюю страницу iGoogle, на которой должен появиться новый гаджет.

Тестирование гаджета

На рисунке 4 показан гаджет, обработанный в iGoogle.

Рисунок 4. Гаджет, обработанный в iGoogle
Тестирование гаджета после развертывания
  1. Для изменения параметров настройки гаджета выберите значок треугольника, чтобы открыть развертывающийся список. Выберите Edit settings.
  2. Отредактируйте адрес хоста pureXML и путь корневого контекста, чтобы он указывал на ваш сервис Universal Services.
  3. В поле getJSONDocumentByKey введите ключ документа, чтобы извлечь запись JSON, и нажмите Invoke. Повторяя этот шаг, проверьте другие операции.
  4. Функция Minimessage отобразит результат. Для удаления сообщений нажимайте знак x в конце строки.

Заключение

В этой статье мы привели пример кода, переводящего традиционное Web-приложение в настраиваемое и портативное приложение, которое можно быстро развернуть на разных платформах в Интернете. Хотя само это приложение относительно простое, приведенный пример можно использовать для быстрого написания и тиражирования новых приложений. Клиентская часть гаджета OpenSocial предоставляет пользователям удобный способ динамического подключения к любому сервису pureXML Universal Services благодаря поддержке UserPrefs. С помощью функции POST makeRequest разработчики гаджетов могут легко создавать запросы к тем или иным сервисам для выполнения транзакций базы данных. Пользователи могут добавить гаджет в любой контейнер OpenSocial независимо от того, где он физически развернут и размещается, избавившись от необходимости управлять контентом и инфраструктурой.


Загрузка

ОписаниеИмяРазмер
JavaScript-функции POST-запросов PureJSON.js.zip1 КБ
XML-определение гаджета OpenSocialJSONclient.xml.zip2 КБ

Ресурсы

Научиться

  • Оригинал статьи (EN)
  • Создание приложения на базе pureXML и JSON. Часть 1: Хранение и извлечение JSON с помощью технологии pureXML в DB2 (Нуну Жоб, Сьюзен Малайка и Михаэл Шенкер; developerWorks, октябрь 2009 г.): прочтите первую статью этого цикла и начните пользоваться преимуществами постоянных объектов JSON, которые сохраняют состояние между сеансами. Хранение, управление и обращение к JSON с помощью DB2 pureXML и простого отображения JSON на XML (первая часть цикла из трех статей).
  • Создание приложения на базе pureXML и JSON. Часть 2: Создание сервисов Universal Services для pureXML, отображающих JSON (Фейтон (Тони) Авдиу, Сьюзен Малайка и Михаэл Шенкер; developerWorks, октябрь 2009 г.). Выполнив шаги, описанные в этой статье, вы сможете представить данные JSON, описанные в первой статье цикла, с помощью JSON Universal Services (вторая часть цикла из трех статей).
  • Сообщество OpenSocial: ссылки на статьи, учебные пособия и технические спецификации, которые помогут вам научиться вставлять API OpenSocial в социальные сети для получения доступа к данным и обмена ими через Интернет.
  • iGoogle Sandbox Development Guide : сведения по поддержке OpenSocial и по разработке и развертыванию приложений в этой среде.
  • Apache Shindig: рассмотрите этот контейнер OpenSocial, позволяющий быстро устанавливать приложения OpenSocial с кодом для обработки гаджетов, прокси-запросов и для управления запросами REST и RPC. Это сообщество open source занимается разработкой эталонной реализации спецификации OpenSocial и развертыванием приложений в этой среде.
  • Сертификация IBM по XML: как стать сертифицированным разработчиком IBM по XML и связанным с ним технологиям.

Получить продукты и технологии

  • DB2 Express-C: загрузите эту бесплатную общедоступную редакцию сервера данных DB2.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML, Information Management, SOA и web-сервисы
ArticleID=776690
ArticleTitle=Создание приложения на базе pureXML и JSON: Часть 3. Создание гаджетов OpenSocial для pureXML
publish-date=11232011