Главная
страница 1


1С-Битрикс: Управление сайтом

Создание Windows-приложения на основе модуля Веб-сервисы
Содержание


Введение 3

Глава I. Создание информационного блока 4

Глава II. Создание компонента веб-сервиса для добавления новостей 5

Глава III. Создание приложения 12

Шаг 1. Создание проекта 12

Шаг 2. Добавление Web Reference 13

Шаг 3. Создание формы приложения 18


Шаг 4. Компиляция и запуск 19

Заключение 21




Введение


Начиная с версии 6.5, в продукт был включен модуль Веб-сервисы. В настоящее время данный модуль входит в редакции Эксперт, Бизнес, Портал и Большой бизнес.

Помимо красивого гаджета для Windows Vista, модуль содержит в себе множество возможностей. В данном руководстве рассмотрим пример, как на основе модуля Веб-сервисы, создать простейшее Windows-приложение для добавления новостей при помощи Visual Studio 2005 и .NET Framework 2.0.


Глава I.Создание информационного блока


Прежде всего, чтобы иметь возможность добавлять новости, необходимо определить информационный блок, в котором они будут храниться. Для простоты возьмем уже готовый инфоблок Новости магазина типа Новости. Запомним, что инфоблок имеет ID равный 3 (Рис. 1 .1).

Рис. 1.1 Информационный блок новостей



  • Примечание: при необходимости вы можете создать новый тип инфоблоков и инфоблок для хранения новостей.

Теперь необходимо приступать к созданию непосредственно самого веб-сервиса (см. описание ниже).











Глава II.Создание компонента веб-сервиса для добавления новостей


При установке модуля Веб-сервисы в системе создается компонент bitrix:webservice.server. Он предназначен для простого создания, тестирования и вывода в читабельном виде информации о ваших веб-сервисах. Для нашего веб-сервиса он будет являться «сервером».

Сначала создадим свой новый компонент. Для этого создадим новую папку в /bitrix/components/demo, назовем ее webservice.addnews (Рис. 2 .2).



Рис. 2.2 Создание папки компонента

Как и любой другой компонент 2.0, наш компонент веб-сервиса должен содержать стандартные файлы описаний:

Файл .description.php:



if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

$arComponentDescription = array(


   "NAME" => "Веб-сервис добавления новостей",
   "DESCRIPTION" => "Веб-сервис добавления новостей",
   "CACHE_PATH" => "Y",
   "PATH" => array(
      "ID" => "service",
      "CHILD" => array(
         "ID" => "webservice",
         "NAME" => "Веб-сервис добавления новостей."
      )
   ),
);
?>

Файл .parameters.php:



if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

$arComponentParameters = array(


   "GROUPS" => array(),
   "PARAMETERS" => array(),
   );
?>

И исполняемый файл component.php. Создадим первоначально его в следующем виде:



if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

if(!CModule::IncludeModule("webservice") || !CModule::IncludeModule("iblock"))


   return;
   
// наш новый класс наследуется от базового IWebService
class CAddNewsWS extends IWebService
{
   // метод GetWebServiceDesc возвращает описание сервиса и его методов
   function GetWebServiceDesc()
   {
      $wsdesc = new CWebServiceDesc();
      $wsdesc->wsname = "bitrix.webservice.addnews"; // название сервиса
      $wsdesc->wsclassname = "CAddNewsWS"; // название класса
      $wsdesc->wsdlauto = true;
      $wsdesc->wsendpoint = CWebService::GetDefaultEndpoint();
      $wsdesc->wstargetns = CWebService::GetDefaultTargetNS();

      $wsdesc->classTypes = array();


      $wsdesc->structTypes = Array();
      $wsdesc->classes = array();

      return $wsdesc;


   }
}

$arParams["WEBSERVICE_NAME"] = "bitrix.webservice.addnews";


$arParams["WEBSERVICE_CLASS"] = "CAddNewsWS";
$arParams["WEBSERVICE_MODULE"] = "";

// передаем в компонент описание веб-сервиса


$APPLICATION->IncludeComponent(
   "bitrix:webservice.server",
   "",
   $arParams
   );

die();
?>

Это минимальное содержимое для определения веб-сервиса. Как видно, он содержит наследованный от IWebService класс CAddNewsWS, переопределенный метод GetWebServiceDesc, возвращающий описание сервиса в формате CWebServiceDesc и вызов компонента bitrix:webservice.server, которому в качестве параметров передается описание нашего зарождающегося веб-сервиса.

Проверим, работает ли созданный нами компонент. Для этого создадим новую страницу и разместим на ней наш новый компонент (Рис. 2 .3):



Рис. 2.3 Размещение компонента

Сохраним страницу, например, с именем ws_addnews.php (Рис. 2 .4):

Рис. 2.4 Сохранение страницы



  • Примечание: При использовании MS Visual Studio 2010 используйте адрес: http://_ваш_домен_/ws_addnews.php?wsdl.

В публичном разделе результат будет следующим (Рис. 2 .5):

Рис. 2.5 Страница с описанием веб-сервиса

Как видим, появилось описание созданного нами веб-сервиса. Но у него нет ни одного метода. Значит, приступим к его созданию. Для этого нам потребуется добавить в наш класс новый метод, который принимает на вход в качестве параметров некоторые поля новости, а в качестве результата возвращает ID добавленной новости или ошибку.

В файле component.php добавляем следующий код:

function AddNews($NAME, $DATE, $PREVIEW_TEXT, $DETAIL_TEXT, $KEYWORDS, $SOURCE)
{
   $iblock_permission = CIBlock::GetPermission(33);   
   if ($iblock_permission < "W")
   {
      $GLOBALS["USER"]->RequiredHTTPAuthBasic();
      return new CSOAPFault('Server Error', 'Unable to authorize user.');
   }
   $arFields = Array(
         "IBLOCK_ID"=>33, // инфоблок "Новости магазина"
         "NAME"=>$NAME,
         "DATE_ACTIVE_FROM"=>$DATE,
         "PREVIEW_TEXT"=>$PREVIEW_TEXT,
         "DETAIL_TEXT"=>$DETAIL_TEXT,
         "PROPERTY_VALUES" => Array(
            "KEYWORDS"=>$KEYWORDS,
            "SOURCE"=>$SOURCE,
            )
      );
   $ib_element = new CIBlockElement();
   $result = $ib_element->Add($arFields);
   if($result>0)
      return Array("id"=>$result);

   return new CSOAPFault( 'Server Error', 'Error: '.$ib_element->LAST_ERROR );


}

Зарегистрируем новый метод в массиве $wsdesc->classes:

$wsdesc->classes = array(
   "CAddNewsWS"=> array(
      "AddNews" => array(
         "type"      => "public",
         "input"      => array(
            "NAME" => array("varType" => "string"),
            "DATE" => array("varType" => "string"),
            "PREVIEW_TEXT" => array("varType" => "string"),
            "DETAIL_TEXT" => array("varType" => "string"),
            "KEYWORDS" => array("varType" => "string"),
            "SOURCE" => array("varType" => "string"),
            ),
         "output"   => array(
            "id" => array("varType" => "integer")
         ),
         "httpauth" => "Y"
      ),
   )
);

В массиве содержится название класса и названия методов, с описанием входных и выходных параметров.

Вот и все, теперь если обновить страницу, на которой расположен компонент, то мы сможем увидеть, что появился новый метод и более того, можем протестировать его работу непосредственно из браузера:



Рис. 2.6 Метод веб-сервиса

Глава III.Создание приложения


Теперь можно приступать к завершающему этапу - созданию в Visual Studio простого Windows-приложения. Для этого можно скачать и установить одну из бесплатных Express версий, например для C#.

Запустив Visual Studio, выполняем следующие шаги:


Шаг 1. Создание проекта


Создаем новый проект (Рис. 3 .7):

Рис. 3.7 Создание нового проекта


Шаг 2. Добавление Web Reference


На вкладке Solution Explorer создаем новую Web Reference (Рис. 3 .8):

Рис. 3.8 Добавление Web Reference

В открывшейся форме указываем ссылку на страницу с размещенным компонентом и нажимаем кнопку Go (Рис. 3 .9).

Рис. 3.9 Указание ссылки на страницу с компонентом

В результате в окне открывается уже знакомая нам страница с описанием сервиса (Рис. 3 .10).

Рис. 3.10 Описание сервиса

В окне нажимаем ссылку Описание службы. Visual Studio считывает доступные методы и предлагает нам создать для них прокси-классы (Рис. 3 .11).

Рис. 3.11 Доступные методы

Переименовываем название нашей Web Reference в myws.addnews и нажимаем кнопку Add Reference (Рис. 3 .12).


Рис. 3.12 Создание Web Reference


Шаг 3. Создание формы приложения


Теперь приступаем к созданию непосредственно самого окна ввода новости, для этого разместим на форме необходимые поля и кнопку Отправить (Рис. 3 .13):

Рис. 3.13 Форма ввода новости

Двойным кликом по кнопке открываем обработчик события нажатия на кнопку и размещаем код сохраняющий новость на сайте:

private void button1_Click(object sender, EventArgs e)


{
   bitrixwebserviceaddnews news = new bitrixwebserviceaddnews();
   news.Credentials = new NetworkCredential("admin", "password");
   try
   {
      string result = news.AddNews(NAME.Text, DATE.Text, PREVIEW_TEXT.Text, DETAIL_TEXT.Text, KEYWORDS.Text, SOURCE.Text);
      MessageBox.Show("Новость №"+result+" успешно добавлена.");
   }
   catch (System.Web.Services.Protocols.SoapHeaderException exception)
   {
      MessageBox.Show("Ошибка добавления новости [" + exception.Message + "]");
   }
}

  • Примечание: в описании используемых пространств имен необходимо добавить:

using System.Net;

using WindowsApplication2.myws.addnews;



Шаг 4. Компиляция и запуск


Компилируем приложение, затем его запускаем и заполняем поля формы (Рис. 3 .14):

Рис. 3.14 Форма приложения добавления новости

Нажимаем кнопку Отправить. Отображается сообщение следующего вида (Рис. 3 .15):

Рис. 3.15 Сообщение об успешном добавлении новости

Убедимся, что новость действительно попала к нам на сайт (Рис. 3 .16):

Рис. 3.16 Добавленная новость



Заключение


В данном руководстве показан очень простой пример, чтобы не усложнять первое восприятие. Конечно, данный веб-сервис можно дорабатывать, например, чтобы в параметрах компонента можно было управлять в какой инфоблок, какую информацию добавлять, поддержку произвольных свойств и т.п. В свою очередь, Windows-приложение также можно доработать, например, чтобы оно выгружало сразу несколько новостей на сайт, содержало больше полей и настроек.

Например, можно сделать приложение, с помощью которого можно добавлять новости с картинкой. Для этого придется на стороне Windows-приложения читать файл, конвертировать его при помощи System.Convert.ToBase64String в BASE64, а на стороне компонента конвертировать назад функцией base64_decode, сохранять его во временный файл и передавать на вход методу CIBlockElement:Add(), как одно из полей. Помимо этого, нам необходимо знать на сервере как минимум расширение (тип) файла, поэтому вместе с содержимым будем передавать оригинальное имя файла.


Таким образом, вот так будет выглядеть наш класс веб-сервиса в компоненте:

class CAddNewsWS extends IWebService


{
    function AddNews($NAME, $DATE, $PREVIEW_TEXT, $DETAIL_TEXT, $KEYWORDS, $SOURCE, $IMAGE_NAME, $IMAGE_CONTENT)
    {
        $iblock_permission = CIBlock::GetPermission(33);
        if ($iblock_permission < "W")
        {
            $GLOBALS["USER"]->RequiredHTTPAuthBasic();
            return new CSOAPFault('Server Error', 'Unable to authorize user.');
        }
        
        $arFields = Array(
                "IBLOCK_ID"=>3, // инфоблок "Новости магазина"
                "NAME"=>$NAME,
                "DATE_ACTIVE_FROM"=>$DATE,
                "PREVIEW_TEXT"=>$PREVIEW_TEXT,
                "DETAIL_TEXT"=>$DETAIL_TEXT,
                "PROPERTY_VALUES" => Array(
                    "KEYWORDS"=>$KEYWORDS,
                    "SOURCE"=>$SOURCE,
                    )
            );
        if(strlen($IMAGE_NAME)>0 && strlen($IMAGE_CONTENT)>0)
        {
            $IMAGE_CONTENT = base64_decode($IMAGE_CONTENT);
            if(strlen($IMAGE_CONTENT)>0)
            {
                $tmp_name = $_SERVER['DOCUMENT_ROOT'].'/bitrix/tmp/'.md5(uniqid(rand(), true)).".tmp";
                CheckDirPath($tmp_name);
                $f = fopen($tmp_name, "wb");
                fwrite($f, $IMAGE_CONTENT);
                fclose($f);
                $arFields["DETAIL_PICTURE"] = Array("name"=>$IMAGE_NAME, "tmp_name"=>$tmp_name, "size"=>strlen($IMAGE_CONTENT), "type"=>"image/jpeg");
            }
        }
        $ib_element = new CIBlockElement();
        $result = $ib_element->Add($arFields);
        if($tmp_name)
            @unlink($tmp_name);
        if($result>0)
            return Array("id"=>$result);

        return new CSOAPFault( 'Server Error', 'Error: '.$ib_element->LAST_ERROR );


    }

    // метод GetWebServiceDesc возвращает описание сервиса и его методов


    function GetWebServiceDesc()
    {
        $wsdesc = new CWebServiceDesc();
        $wsdesc->wsname = "bitrix.webservice.addnews";
        $wsdesc->wsclassname = "CAddNewsWS";
        $wsdesc->wsdlauto = true;
        $wsdesc->wsendpoint = CWebService::GetDefaultEndpoint();
        $wsdesc->wstargetns = CWebService::GetDefaultTargetNS();

        $wsdesc->classTypes = array();


        $wsdesc->structTypes = Array();

        $wsdesc->classes = array(


            "CAddNewsWS"=> array(
                "AddNews" => array(
                    "type"        => "public",
                    "input"        => array(
                        "NAME" => array("varType" => "string"),
                        "DATE" => array("varType" => "string"),
                        "PREVIEW_TEXT" => array("varType" => "string"),
                        "DETAIL_TEXT" => array("varType" => "string"),
                        "KEYWORDS" => array("varType" => "string"),
                        "SOURCE" => array("varType" => "string"),
                        "IMAGE_NAME" => array("varType" => "string"),
                        "IMAGE_CONTENT" => array("varType" => "string"),
                        ),
                    "output"    => array(
                        "id" => array("varType" => "integer")
                    ),
                    "httpauth" => "Y"
                ),
            )
        );

        return $wsdesc;


    }
}

А вот так обработчик нажатия на кнопку в Windows-приложении (IMAGE - это новый элемент управления на форме, в нем должен быть путь к файлу на диске):

private void button1_Click(object sender, EventArgs e)
{
    Byte[] binaryData;
    string base64String = "";
    if(IMAGE.Text.Length>0)
    {
        try
        {
            System.IO.FileStream imageFile = new System.IO.FileStream(IMAGE.Text, System.IO.FileMode.Open,System.IO.FileAccess.Read);
            binaryData = new Byte[imageFile.Length];
            imageFile.Read(binaryData, 0, (int)imageFile.Length);
            imageFile.Close();
            base64String = System.Convert.ToBase64String(binaryData, 0, binaryData.Length);
        }
        catch (System.Exception exp)
        {
            MessageBox.Show("Ошибка чтения картинки [" + exp.Message + "]");
            return;
        }
    }

    bitrixwebserviceaddnews news = new bitrixwebserviceaddnews();


    news.Credentials = new NetworkCredential("admin", "password");
    try
    {
        string result = news.AddNews(DATE.Text, DETAIL_TEXT.Text, base64String, IMAGE.Text, KEYWORDS.Text, NAME.Text, PREVIEW_TEXT.Text, SOURCE.Text);
        MessageBox.Show("Новость №"+result+" успешно добавлена.");
    }
    catch (System.Web.Services.Protocols.SoapHeaderException exception)
    {
        MessageBox.Show("Ошибка добавления новости [" + exception.Message + "]");
    }

}






Смотрите также:
3 Глава I. Создание информационного блока 4 Глава II. Создание компонента веб-сервиса для добавления новостей 5 Глава III. Создание приложения 12
87.66kb.
1 стр.
Книга Иисуса Навина 1 Глава 1 1 Глава 2 2 Глава 3 3 Глава 4 4 Глава 5 5 Глава 6 5 Глава 7 7 Глава 8 8
525.38kb.
10 стр.
Книга Притчи Соломона 1 Глава 1 2 Глава 2 2 Глава 3 3 Глава 4 4 Глава 5 5 Глава 6 5 Глава 7 6 Глава 8 7
474.69kb.
9 стр.
Роберта Орнштейиа Глава Проснитесь в своих снах! Глава Истоки и история осознанного сновидения Глава Новый мир осознанных сновидений Глава исследование
3156.37kb.
11 стр.
Создание веб-сайта обычно проходит в несколько этапов
21.67kb.
1 стр.
I §1 §2 Глава II §1 §2 §3 §4 Глава III §1 §2 §3
205.18kb.
1 стр.
I. Модель вариантов Глава II. Маятники Глава III. Волна удачи
194.06kb.
1 стр.
История эконометрики Глава Этимология слова «эконометрика»
152.11kb.
1 стр.
Название государствачлена мы, (Глава государства/Глава правительства/ Министр иностранных дел)
12.26kb.
1 стр.
3 Глава I 4 Глава II 5 Глава III 10
69.8kb.
1 стр.
Игры на свежем воздухе для детей и взрослых. Ковалева Елена. Введение Глава Игры для самых маленьких Глава Зимние игры Глава Игры и мероприятия в детском лагере
2192.37kb.
12 стр.
Техническое задание на создание сайта
276.18kb.
1 стр.