Технологии для Web-сервисов

Алексей Федоров

Ключевые технологии для Web-сервисов

   Язык XML

   SOAP

   WSDL

   UDDI

Дополнительные стандарты и технологии для Web-сервисов

   ebXML

   XML Digital Signatures (XML-DSIG)

   Security Assertions Markup Language (SAML)

   Extensible Key Management Specification (XKMS)

   Web Services Flow Language (WSFL)

Заключение

 

В этом обзоре мы рассмотрим основные технологии, на которых базируются Web-сервисы, а также различные дополнения, предлагаемые ведущими производителями и соответствующими органами стандартизации. Мы рассмотрим такие технологии, как eXtensible Markup Language (XML), Simple Object Access Protocol (SOAP), Web Services Description Language (WSDL) и Universal Description, Discovery and Integration (UDDI), а также такие спецификации, как ebXML, XML Digital Signatures, Security Assertions Markup Language, Extensible Key Management Specification, Web Services Flow Language, WS-Inspection, WS-Security, WS-License, WS-Routing и WS-Referral.

Ключевые технологии для Web-сервисов

Web-сервисы базируются на четырех ключевых технологиях: eXtensible Markup Language (XML), Simple Object Access Protocol (SOAP), Web Services Description Language (WSDL) и Universal Description, Discovery and Integration (UDDI). Эти технологии используются для обеспечения функционирования Web-сервисов и связаны между собой так, как показано на следующем рисунке.

Обсуждение ключевых технологий для Web-сервисов мы начнем с протокольного уровня, показанного в нижней части диаграммы. Протокольный уровень содержит стандартные Internet-протоколы, используемые для вызова Web-сервисов по сети. Изначально Web-сервисы базируются на протоколе HTTP/1.1 (или HTTP), но ничто не мешает использовать и другие транспортные протоколы, например SMTP или FTP. Протокол HTTP/1.1 — это текстовый протокол в стиле «запрос-ответ», подразумевающий следующую последовательность действий: клиент открывает соединение с сервером и посылает запрос в специфичном для протокола формате. Сервер отвечает на данный запрос и при необходимости оставляет соединение открытым.

В начало В начало

Язык XML

Язык XML играет важную роль в Web-сервисах — он является основой для таких технологий, как SOAP и WSDL, а также определяет формат данных, используемый для обмена информацией между потребителем сервиса и самим сервисом. XML не является языком как таковым — это синтаксис для описания структур данных, мета-язык, позволяющий осуществлять кросс-платформенный обмен данными с помощью стандартных методов для кодирования и форматирования информации. В отличие от HTML, XML позволяет не только описывать структуру информации, но и ее контекст. Посредством XML структуру документа, ее содержимое и способы ее отображения можно представить в виде трех различных компонентов. Таким образом, один и тот же документ может быть отображен различными способами, например в зависимости от типа клиента или от типа запрашиваемого документа. Следует отметить, что все средства создания и потребления Web-сервисов содержат библиотеки для обработки XML-документов. Это могут быть библиотеки, поддерживающие XML Document Object Model (DOM), SAX или, как в случае с .NET Framework, — «pull»-модель для извлечения и обработки информации из XML-документов.

В начало В начало

SOAP

SOAP (Simple Object Access Protocol, хотя более актуальным следует считать название Services-Oriented Architecture Protocol) — это основанный на языке XML стандарт для взаимодействия между сервисами и их потребителями. Версия SOAP 1.0 была разработана рядом компаний, таких как Userland, Microsoft и Developmentor, и содержала элементы, специфичные для COM и HTTP, — протокол SOAP обязан своим рождением прототипу XML-RPC, использовавшемуся для реализации удаленных вызовов процедур через XML (http://www.xmlrpc.com/spec/). Предложенная в апреле 2000 года версия SOAP 1.1 (http://www.w3.org/TR/SOAP/) пополнилась вкладом от таких фирм, как IBM и Lotus, и содержала следующие изменения:

  • нейтральность к транспортному уровню (возможно использование не только протокола HTTP);
  • нейтральность к языку программирования и платформе (Java);
  • нейтральность к кодировке данных;
  • полная независимость от компаний;
  • полная независимость от объектных моделей и операционных систем.

В настоящее время развитием протокола SOAP занимается комитет World Wide Web Consortium — в сентябре 2000 года была создана рабочая группа под названием XML Protocol (XMLP), задачей которой является разработка протокола, нейтрального ко всему (транспортному уровню, языку программирования, объектной модели, операционной системе и т.п.), кроме языка XML, используемого для представления данных. Более подробно о деятельности этой группы можно узнать по адресу: http://www.w3.org/2000/xp/Group/. Протокол SOAP 1.2 является текущим рабочим документом комитета W3C (SOAP Version 1.2 Working Draft: 9 July 2001) и в скором времени должен стать рекомендацией. Отметим, что данный протокол будет называться именно SOAP 1.2, а не XML Protocol 1.0.

На сегодняшний день в различной степени готовности находятся стандарты:

Протокол SOAP базируется на сообщениях, которые разделяются на два типа: запросы (вызов метода удаленного объекта) и ответы (результат работы удаленного метода). SOAP поддерживает два механизма доступа — SOAP RPC и SOAP Message. SOAP RPC представляет собой простой протокол «запрос-ответ» и базируется на объекте Call. Этот объект (и некоторые низкоуровневые методы для создания и отсылки сообщений) используется для синхронного удаленного вызова методов Web-сервисов.

SOAP Message — это протокол для отсылки и обработки SOAP-сообщений, который может использоваться для асинхронных коммуникаций и подразумевает немедленный или отложенный ответ на запрос. Протокол SOAP Message базируется на объекте Message. Разработчики могут использовать низкоуровневые интерфейсы SOAP API для создания и отсылки сообщений.

Протокол SOAP основан на понятии «конвертов», внутри которых и располагаются сообщения со специфичными для того или иного приложения данными. Ниже показан пример SOAP-запроса, посылаемого потребителем сервиса сервису.

<SOAP-ENV:Envelope      
 xmlns:SOAP-ENV="http://{soaporg}/envelope/"      
 SOAP-ENV:encodingStyle="http://{soaporg}/encoding/">      
       
 <SOAP-ENV:Body>      
       
  <m:GetLastTradePrice m:GetLastTradePrice       
   xmlns:m xmlns:m="my my-ns ns">      
     <symbol>      
       IBM      
     </symbol>      
  </m:GetLastTradePrice m:GetLastTradePrice>      
       
</SOAP-ENV:Body>      
       
</SOAP-ENV:Envelope>      

В ответ на данный запрос Web-сервис возвращает данные, также упакованные в SOAP-конверт:

<SOAP-ENV:Envelope      
 xmlns:SOAP-ENV="http://{soaporg}/envelope/"      
 SOAP-ENV:encodingStyle="http://{soaporg}/encoding/">      
       
<SOAP-ENV:Body>      
       
<m:GetLastTradePriceResponse   m:GetLastTradePriceResponse      
 xmlns:m xmlns:m="my my-ns ns">      
  <price>      
   95.25      
  </price>      
</m:GetLastTradePriceResponse   m:GetLastTradePriceResponse>      
       
</SOAP-ENV:Body>      
       
</SOAP-ENV:Envelope>      

С точки зрения приложения при использовании SOAP для вызова методов Web-сервисов требуется генерация запроса и обработка XML-документа, содержащего ответ. Мы можем использовать XSLT, SAX, DOM или JDOM для преобразования XML-документа в вид, более подходящий для конкретного приложения. По мере увеличения числа средств для создания и потребления Web-сервисов необходимость в непосредственной обработке XML-документов будет уменьшаться.

В начало В начало

WSDL

Интерфейс для доступа к Web-сервису описывается на основанном на языке XML языке Web Services Description Language (WSDL) и содержит всю информацию, необходимую для доступа к данному сервису, — WSDL-документы можно сравнить с описаниями интерфейсов на языке IDL, только в первом случае используется язык XML. WSDL появился как результат объединения двух технологий: Network Accessible Service Specification Language (NASSL) фирмы IBM и Service Description Language (SDL) фирмы Microsoft. Спецификация WSDL 1.1 находится по адресу: http://www.w3.org/TR/wsdl/.

Существующие средства для создания и потребления Web-сервисов выполняют всю рутинную работу по генерации и обработке WSDL-документов, поэтому создание и обработка таких документов вручную требуется в крайне редких случаях.

WSDL-документ состоит из ряда элементов, описывающих Web-сервис:

  • типы — контейнеры для описания типов данных, базирующиеся на XML Schema;
  • сообщения — абстрактное, типизованное описание способов обмена данными;
  • операции — абстрактное описание действий, поддерживаемых данным Web-сервисом;
  • «порты» — абстрактный набор операций, поддерживаемых одной или более конечными точками;
  • связки — спецификация конкретных протоколов и форматов данных для той или иной конечной точки;
  • сервис — коллекция связанных точек.

С точки зрения WSDL-документа Web-сервис представляет собой коллекцию портов, которые, в свою очередь, являются коллекцией абстрактных операций и сообщений. Абстракция операций и сообщений позволяет связывать их с различными протоколами и форматами данных типа SOAP, HTTP GET/POST или MIME.

Ниже показан пример WSDL-документа для Web-сервиса, предоставляющего всего один метод.

<?xml version="1.0" encoding="utf-8"?>  
 <definitions 
xmlns:s="http://www.w3.org/2001/XMLSchema"
 xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
 xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
 xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
 xmlns:s0="http://www.abc.com" targetNamespace="http://www.abc.com"    xmlns="http://schemas.xmlsoap.org/wsdl/"> 
   
  <types>  
    <s:schema attributeFormDefault="qualified"     
     elementFormDefault="qualified"   
     targetNamespace="http://www.abc.com">  
      <s:element name="GreetUser">  
        <s:complexType>  
          <s:sequence>  
            <s:element minOccurs="1" maxOccurs="1" name="Name"   
             nillable="true" type="s:string" />  
          </s:sequence>  
        </s:complexType>  
      </s:element>  
      <s:element name="GreetUserResponse">  
        <s:complexType>  
          <s:sequence>  
            <s:element minOccurs="1" maxOccurs="1"   
             name="GreetUserResult" nillable="true"   
             type="s:string" />  
          </s:sequence>  
        </s:complexType>  
      </s:element>  
      <s:element name="string" nillable="true" type="s:string" />  
    </s:schema>  
  </types>  
   
  <message name="GreetUserSoapIn">  
    <part name="parameters" element="s0:GreetUser" />  
  </message>  
  <message name="GreetUserSoapOut">  
    <part name="parameters" element="s0:GreetUserResponse" />  
  </message>  
   
  <message name="GreetUserHttpGetIn">  
    <part name="Name" type="s:string" />  
  </message>  
  <message name="GreetUserHttpGetOut">  
    <part name="Body" element="s0:string" />  
  </message>  
   
  <message name="GreetUserHttpPostIn">  
    <part name="Name" type="s:string" />  
  </message>  
  <message name="GreetUserHttpPostOut">  
    <part name="Body" element="s0:string" />  
  </message>  
   
  <portType name="Greeting ServiceSoap">  
    <operation name="SayHello">  
      <documentation>Greets the user</documentation>  
      <input name="GreetUser" message="s0:GreetUserSoapIn" />  
      <output name="GreetUser" message="s0:GreetUserSoapOut" />  
    </operation>  
  </portType>  
   
  <portType name="Greeting ServiceHttpGet">  
    <operation name="SayHello">  
      <documentation>Greets the user</documentation>  
      <input name="GreetUser" message="s0:GreetUserHttpGetIn" />  
      <output name="GreetUser" message="s0:GreetUserHttpGetOut" />  
    </operation>  
  </portType>  
   
  <portType name="Greeting ServiceHttpPost">  
    <operation name="SayHello">  
      <documentation>Greets the user</documentation>  
      <input name="GreetUser" message="s0:GreetUserHttpPostIn" />  
      <output name="GreetUser" message="s0:GreetUserHttpPostOut" />  
    </operation>  
  </portType>  
   
  <binding name="Greeting ServiceSoap" type="s0:Greeting ServiceSoap">  
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"   
     style="document" />  
    <operation name="SayHello">  
      <soap:operation soapAction="http://www.abc.com/GreetUser"   
       style="document" />  
      <input name="GreetUser">  
        <soap:body use="literal" />  
      </input>  
      <output name="GreetUser">  
        <soap:body use="literal" />  
      </output>  
    </operation>  
  </binding>  
   
  <binding name="Greeting ServiceHttpGet" type="s0:Greeting ServiceHttpGet">  
    <http:binding verb="GET" />  
    <operation name="SayHello">  
      <http:operation location="/GreetUser" />  
      <input name="GreetUser">  
        <http:urlEncoded />  
      </input>  
      <output name="GreetUser">  
        <mime:mimeXml part="Body" />  
      </output>  
    </operation>  
  </binding>  
   
  <binding name="Greeting ServiceHttpPost" type="s0:Greeting ServiceHttpPost">  
    <http:binding verb="POST" />  
    <operation name="SayHello">  
      <http:operation location="/GreetUser" />  
      <input name="GreetUser">  
        <mime:content type="application/x-www-form-urlencoded" />  
      </input>  
      <output name="GreetUser">  
        <mime:mimeXml part="Body" />  
      </output>  
    </operation>  
  </binding>  
   
  <service name="Greeting Service">  
    <documentation>Basic Web Service Example</documentation>  
    <port name="Greeting ServiceSoap"   
     binding="s0:Greeting ServiceSoap">  
      <soap:address   
       location="http://localhost/WebServices/wsdemo.asmx" />  
    </port>  
    <port name="Greeting ServiceHttpGet"   
       binding="s0:Greeting ServiceHttpGet">  
      <http:address   
       location="http://localhost/WebServices/wsdemo.asmx" />  
    </port>  
    <port name="Greeting ServiceHttpPost"   
     binding="s0:Greeting ServiceHttpPost">  
      <http:address location="http://localhost/WebServices/wsdemo.asmx" />  
    </port>  
  </service>  
</definitions>   

 

Корневым элементом WSDL-документа является элемент <definitions>, который содержит следующие вложенные элементы:

  • Types — контейнер для описания типов данных, которые представлены в виде описаний XML Schema (XSD);
  • Message — формат для индивидуальной передачи. Каждый метод имеет два типа сообщений — входное и выходное сообщение. Входное сообщение описывает параметры метода, а выходное — возвращаемые методом данные. Средства генерации WSDL-документов фирмы Microsoft, входящие в состав Microsoft .NET, используют следующее соглашение о наименовании сообщений: Имя метода + Протокол + In/Out — например GreetUserSoapIn указывает входное сообщение для протокола SOAP для метода GreetUser;
  • PortType — группа сообщений в виде одной логической операции. Для каждого поддерживаемого Web-сервисом протокола существует отдельный элемент PortType. Все операции определяются элементами <operation>, вложенными в элемент PortType;
  • Operation — описание одного действия, поддерживаемого Web-сервисом;
  • Binding — ассоциация элемента PortType с реализацией. Для каждого поддерживаемого Web-сервисом протокола существует отдельный элемент Binding;
  • Service — описание физического местонахождения конечной точки. Для каждого поддерживаемого Web-сервисом протокола существует отдельный элемент Port;
  • Port — описание протокола и формата данных для одной конечной точки;
  • Data Schema — низкоуровневая типизация параметров сообщения.

WSDL-документы активно используются средствами разработки для генерации прокси-кода, который может выполнять роль переходника между высокоуровневым кодом потребителя Web-сервиса и низкоуровневой реализацией отсылки SOAP-сообщений для вызова методов Web-сервиса и получения результатов работы этих методов.

В начало В начало

UDDI

И наконец, четвертой технологией, связанной с Web-сервисами, является спецификация Universal Description, Discovery and Integration (UDDI). Задача UDDI — предоставить механизм для публикации информации о Web-сервисах, а также обеспечить поддержку поиска доступных Web-сервисов. В целом UDDI — это регистрационная система, куда входят набор XML-файлов и ассоциированные схемы, которые содержат описания предоставляемых Web-сервисами услуг. В ближайшее время будут доступны различные UDDI-реестры, способные реплицировать данные между собой.

В качестве примера UDDI-реестров можно привести следующие:

Версия UDDI 1 была завершена в сентябре 2000 года — в ее разработке принимало участие около 50 компаний, включая IBM, Microsoft Corp, Ariba, Inc., American Express Co и Merrill Lynch & Co, Inc. Стандарт UDDI разделен на три секции, которые облегчают нахождение информации о Web-сервисах:

  • секция «белые страницы» описывает компании и предоставляет контактную информацию и идентификаторы компаний. Поддерживаются такие классификаторы, как North American Industry Classification System (NAICS) и the Standard Industrial Classification (SIC);
  • секция «желтые страницы» содержит список бизнес-категорий, к которым относятся компании, включая разделение по географическим признакам, секторам индустрии и продуктам;
  • секция «зеленые страницы» содержит информацию о том, как выполняются бизнес-транзакции с каждой компанией, включая информацию о бизнес-процессах и форматах данных.

В июне 2001 года UDDI Project, включающий уже более 200 компаний, завершил работу над UDDI 2 — в спецификации этой версии поддерживались следующие расширения:

  • возможность описания комплексных организаций, включая описание структур организаций, подразделений, департаментов, отделов и т.п.;
  • улучшенная поддержка международных организаций, в том числе мультиязычная поддержка описаний продуктов и сервисов;
  • добавлены дополнительные категории и идентификационные схемы. Корпорации могут использовать специфичные для сегментов рынка категории и идентификаторы для описания продуктов и сервисов;
  • более надежные средства поиска, поддержка большего числа параметров поиска, комбинаций критериев поиска;
  • более удобные средства моделирования бизнес-процессов;
  • помимо этого в UDDI 2 расширена возможность репликации глобальных реестров, и компании HP, IBM и Microsoft объявили о реализации полной поддержки этих возможностей к середине текущего года.

Версия UDDI 3 должна расширить функциональность UDDI 2 — ожидается появление функций для поддержки биржевой информации, а также для более надежной защиты, хранящейся в реестрах информации.

Спецификация UDDI содержит описание программных интерфейсов, позволяющих разработчикам регистрировать Web-сервисы и/или использовать реестр для поиска специфических сервисов. После того как необходимый Web-сервис найден, реестр предоставляет указатель на местонахождение WSDL-документа. Этот процесс показан на следующей иллюстрации.

Отметим, что использование UDDI-реестров является опциональным. Компании, которые желают ограничить доступ к собственным Web-сервисам, могут не публиковать их во внешних реестрах, использовать внутрикорпоративные реестры или вообще отказаться от UDDI-реестров.

Возвращаясь к программным интерфейсам, отметим, что они разделяются на две категории — запрос (inquiry) и публикация (publishing). Обращение к реестрам происходит в виде SOAP-сообщений, посылаемых специфичному Web-сервису. Примерами адресов, где расположены такие Web-сервисы, могут быть:

В следующей таблице показаны основные методы, доступные в программных интерфейсах UDDI.

Для вызова функций API мы посылаем SOAP-сообщения с определенным содержимым параметров. Например, для поиска компании ABC Supply мы должны послать следующее SOAP-сообщение:

<find_business generic='1.0' xmlns='urn:uddi-org:api'>
     <name>ABC Supply</name>
</find_business>

SOAP-ответ от UDDI-реестра содержит все компании, соответствующие критерию запроса, а также реализуемые ими сервисы. Эта информация возвращается в виде XML-структуры, называемой businessInfos. Помимо этой структуры UDDI API использует и другие структуры данных — наиболее важные из них показаны выше.

Структура businessEntity представляет данные о компании и содержит набор структур businessService, описывающих сервисы, предоставляемые данной компанией. Каждый сервис может быть доступен различными способами. Например, это может быть Web-сервис, управляемый SOAP-сообщениями, Web-форма или просто телефонный номер. Для того чтобы описать способы доступа к сервису, используется структура bindingTemplate, которая связана со структурой tModel.

Более подробно о протоколе UDDI и поддерживаемых им API и структурах данных можно узнать по адресу: http://www.uddi.org/.

В начало В начало

Дополнительные стандарты и технологии для Web-сервисов

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

ebXML

ebXML (Electronic Business using eXtensible Markup Language) — это совместный проект UN-CEFACT и OASIS, представляющий собой описание открытой, основанной на XML инфраструктуры для обеспечения возможностей глобального использования электронной бизнес-информации.

Более подробно о ebXML см. http://www.oasis-open.org/ или http://www.ebxml.org/.

В начало В начало

XML Digital Signatures (XML-DSIG)

XML-DSIG — это совместный проект W3C и IETF, в котором описаны правила и синтаксис для создания цифровых подписей в XML-документах.

Дополнительная информация доступна по адресу: http://www.w3.org/TR/xmldsig-core/.

В начало В начало

Security Assertions Markup Language (SAML)

SAML — это спецификация, описывающая ряд XML-элементов, позволяющих подтвердить, что именно автор подписал данный XML-документ, что пользователь имеет доступ к базе данных и т.п.

Дополнительная информация доступна по адресу: http://www.oasis-open.org/committees/security/index.shtml.

В начало В начало

Extensible Key Management Specification (XKMS)

XKMS устанавливает протоколы для определения и регистрации ключей и использования их в составе XML-документов.

Дополнительная информация доступна по адресу: http://www.w3.org/TR/xkms/.

В начало В начало

Web Services Flow Language (WSFL)

WSFL — это язык, позволяющий указать, каким образом Web-сервисы могут быть объединены для описания бизнес-процессов.

Дополнительная информация доступна по адресу: http://www-4.ibm.com/software/solutions/webservices/pdf/WSFL.pdf.

Помимо этого следует упомянуть архитектуру Global XML Web Services Architecture (http://msdn.microsoft.com/webservices/), предлагаемую Microsoft и IBM и базирующуюся на спецификациях:

  • WS-Inspection — XML-формат для поиска доступных сервисов на том или ином узле.

    Дополнительная информация доступна по адресу: http://msdn.microsoft.com/ws/2001/10/Inspection/;

  • WS-Security — расширение SOAP, описывающее, как в состав SOAP-сообщений должны интегрироваться цифровые подписи и как должна обеспечиваться поддержка ключей и криптографии. Эта спецификация была разработана Microsoft, IBM и VeriSign, Inc., и ее первая версия была опубликована в апреле нынешнего года.

    Дополнительная информация доступна по адресу: http://msdn.microsoft.com/library/en-us/dnglobspec/html/ws-security.asp;

  • WS-License — описывает, как можно использовать стандартные форматы лицензий (сертификаты X.509, Kerberos и т.п) совместно с WS-Security.

    Дополнительная информация доступна по адресу: http://msdn.microsoft.com/library/en-us/dnglobspec/html/ws-license.asp;

  • WS-Routing — расширение SOAP для посылки асинхронных сообщений по протоколам TCP, UDP, HTTP.

    Дополнительная информация доступна по адресу: http://msdn.microsoft.com/library/en-us/dnglobspec/html/ws-routing.asp;

  • WS-Referral — расширение SOAP для перенаправления сообщений с динамической конфигурацией. Это расширение позволяет, например, эффективно переложить часть или всю обработку запроса на другие сервисы.

    Дополнительная информация доступна по адресу: http://msdn.microsoft.com/library/en-us/dnglobspec/html/ws-referral.asp.

В начало В начало

Заключение

В этом обзоре мы рассмотрели ключевые технологии для Web-сервисов — eXtensible Markup Language (XML), Simple Object Access Protocol (SOAP), Web Services Description Language (WSDL) и Universal Description, Discovery and Integration (UDDI), познакомились с их назначением и получили представление об их роли в жизнеобеспечении Web-сервисов. Мы также рассказали о дополнительных стандартах и технологиях, связанных с Web-сервисами, и привели их краткие описания.

Web-сервисы — это развивающаяся технология, и многие стандарты, которые мы здесь обсудили, будут со временем меняться. Тем не менее успешное внедрение и использование первого поколения Web-сервисов как для создания «приложений как сервисов», так и для решения корпоративных задач показывает, что базовые технологии, лежащие в основе Web-сервисов, выбраны и разработаны с учетом необходимых требований. Также важно отметить, что ни одна технология для обеспечения Web-сервисов не должна быть монополизирована какой-либо одной компанией — только в этом случае можно гарантировать успех Web-сервисов.

КомпьютерПресс 6'2002

Наш канал на Youtube

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует