Api перекладача bing

Давненько я збирався розібратися з протоколом SOAP, подивитися як з ним працювати, як використовувати і т.д. але то через брак великої кількості вільного часу, то через звичайного небажання морочитися над чимось новим все ніяк не міг дістатися до написання якогось додатка з використанням SOAP. Зазвичай, коли я розбирався з будь-яким API Web-сервісу у якого на вибір було два протоколи - чистий HTTP або з SOAP я вибирався перший і, власне сьогодні зрозумів, що дарма :).

Виявилося, що розробити невеликий клієнт з SOAP в Delphi елементарно і на порядок простіше, ніж використовувати окремо бібліотеку для роботи з HTTP (Synapse. WinInet, Indy і т.д.) в зв'язці з бібліотеками типу MSXML, NativeXML (для роботи з XML) або SuperObject (для JSON).

Як приклад я вирішив написати невеликий клієнт для роботи з Bing Translator API (перекладач Google вже був - тепер вирішив подивитися, що там навигадували в Microsoft).

Для початку кілька вступних слів по тому, що з себе представляє протокол SOAP.

SOAP (від англ. S imple O bject A ccess P rotocol - простий протокол доступу до об'єктів) - протокол обміну структурованими повідомленнями в розподіленої обчислювальної середовищі. Спочатку SOAP призначався в основному для реалізації віддаленого виклику процедур (RPC). Зараз протокол використовується для обміну довільними повідомленнями в форматі XML, а не тільки для виклику процедур.

На тій же сторінці Wiki можна дізнатися і про брак SOAP - збільшення обсягу даних, що пересилаються. Але нам сьогодні це не так важливо, нам би просто розібратися з роботою.

Примітка: Якщо ж для вас дуже важливий об'єм даних, що пересилаються, то можна навести таку класифікацію обміну даними в різних форматах (за винятком Plain Text) і з використанням різних протоколів (з тих, що мені зараз більш менш відомі):

  1. HTTP + SOAP - найбільший обсяг;
  2. HTTP + XML - середній обсяг;
  3. HTTP + JSON - найменший обсяг;

Всі типи даних, операції, способи доставки повідомлень від сервера до клієнта і назад розташовані на стороні сервера у вигляді WSDL-документа. Все, що від нас потрібно - це імпортувати будь-яким чином цей документ і представити його у вигляді вже відомих нам типів, класів і об'єктів Delphi.

Так як WSDL - це стандартна мова опису web-сервісів, то, відповідно, в Delphi передбачений зручний імпорт таких документів і подання їх в необхідній нам формі, тобто у вигляді окремого юніта Delphi.

Тепер перейдемо безпосередньо до розгляду прикладу роботи з Bing API через SOAP.

Перш, ніж ми запустимо Delphi і почнемо розробляти наш міні-перекладач нам необхідно зареєструватися в Bing і на сторінці для розробників отримати ключ доступу (AppID) до API. Реєструємося, отримуємо і запам'ятовуємо наш AppID.

Тепер запускаємо Delphi (у мене стоїть Delphi XE) і вибираємо в меню File -> New -> Other. У вікні вибираємо WebServices -> WSDLImporter.

Api перекладача bing

Шлях до WSDL-документа Bing Translator API вказано на першій сторінці документації і виглядає наступним чином:

"Згодовують" його майстру і тиснемо "Next":

Api перекладача bing

Майстер просить нас вибрати версію SOAP, яку ми будемо використовувати. Ми залишаємо значення за замовчуванням і тиснемо "Next":

Api перекладача bing

Тут майстер нас запитає які опції WSDL нам необхідно імпортувати. В принципі того, що вибрано за замовчуванням нам цілком достатньо, тому зі спокійною душею тиснемо "Finish" і майстер створює нам цілком зрозумілий юніт з назвою soap.pas. На цьому робота з WSDLImporter закінчується і приступаємо до реалізації функцій перекладача.

Створюємо звичайна програма (VCL Forms Application) і підключаємо в uses щойно створений модуль soap.pas.

Кидаємо також на форму компоненти TButton, TListBox і компонент THTTPRIO зі сторінки (WebServices).

Тепер відкриваємо документацію по SOAP Bing API і спробуємо реалізувати кілька різних функцій. Почнемо з функцій, які повертають рядки, наприклад, скористаємося методом Microsoft.Translator.Detect. Дивимося його опис в модулі SOAP.pas:

Викликати такий метод для нас набагато простіше і легше, ніж скажімо, використовувати зв'язку HTTP + XML - спочатку сформувати URL, потім виконати запит і отримати відповідь, потім парсити XML і виводити результат. Але залишається одне питання: як власне відправити цей самий запит? Саме для цього ми і поклали на форму компонент THTTPRIO. Залишається тільки його налаштувати наступним чином:

В поле WSDLLocation записуємо той же URL, що і при імпорті WSDL-документа (див. Вище) і в полях Port і Service вибираємо єдині доступні значення. Має вийти як показано на малюнку:

Api перекладача bing

І тепер найцікавіше - якщо ви подивіться список методів компонента HTTPRIO, то не знайдете в ньому таких звичних при роботі з HTTP методів як POST, GET і ін. Вони нам власне і не потрібні - у нас є інтерфейс LanguageService за допомогою якого ми і отримаємо необхідні нам дані.

Створюємо обробник OnClick кнопки і пишемо:

Запускаємо програму, тиснемо кнопку і бачимо повідомлення:

Запит відправлений, відповідь отримана. Без парсинга XML і JSON і інших звичайних операцій при роботі з HTTP. Правда ж досить просто і зручно. ). Зі складними типами даних так само просто працювати, тому що їх опис міститься в модулі. Наприклад, можна скористатися методом Microsoft.Translator.GetLanguageNames, який повертає нам масив рядків - назв мов на мові користувача. Дивимося опис методу в soap.pas:

Єдиний тип даних, який може бути нам незрозумілий - це ArrayOfString. Дивимося його опис в модулі:

Пишемо обробник кнопки. Наприклад, так:

Запускаємо програму, тиснемо кнопку і бачимо результат в ListBox:

Api перекладача bing

Якщо в масиві LangNames міститиметься "незрозуміла" сервера рядок, то помилки не виникне, а результат роботи методу буде містити на 1 елемент менше.

І, на закінчення цієї невеликої статті, спробуємо перевести який-небудь текст. Для цього скористаємося методом Microsoft.Translator.GetTranslations, який повертає нам всі можливі переклади тексту. Напишемо такий обробник у кнопки:

Результат виконання програми буде наступним:

Api перекладача bing

Ось, мабуть і все. Думаю, що в якості невеликої шпаргалки по роботі з Bing API через SOAP в Delphi цей пост згодиться. Можете попрбовать попрацювати з API перекладача від Microsoft.

Схожі статті