В сим топике я хочу рассмотреть все три метода API, которые также хорошо документированы на сайте Yandex Translate API (тут).
Используя язык C# и части System.Net, System.XML и System.IO я покажу одну из вариаций работы с ним. Я думаю, что этот топик найдут полезным те, кто начинает свою работу с языком C#, либо с Yandex API.
Метод detect
При обращении к методу detect мы получаем в ответ XML (либо JSON, но тут рассмотрен только XML) следующего формата:
<?xml version="1.0" encoding="utf-8"?> <DetectedLang code="200" lang="en"/>
Мы можем написать функцию, которая отправит запрос к API. Реализация может быть разной, вот одна из них:
string Detect(string text) { WebRequest request = WebRequest.Create("http://translate.yandex.net/api/v1/tr/detect?text=" + text); WebResponse response = request.GetResponse(); using (StreamReader sr = new StreamReader(response.GetResponseStream())) { var fetchedXml = sr.ReadToEnd(); XmlDocument d = new XmlDocument(); d.LoadXml(fetchedXml); XmlNodeList langNodes = d.GetElementsByTagName("DetectedLang"); XmlNode node = langNodes.Item(0); return node.Attributes[1].Value; } }
Эта функция принимает аргумент text, который будет параметром text, отправляемым к API. После этого мы разберем XML-ответ с помощью System.Xml и вернем значение атрибута lang элемента DetectedLang.
Метод getLangs
Данный метод вернет список направлений перевода, которые поддерживает Яндекс. Формат ответа:
<?xml version="1.0" encoding="utf-8"?> <Langs> <dirs> <string>ru-en</string> <string>ru-pl</string> <string>ru-uk</string> <string>ru-de</string> <string>ru-tr</string> <string>en-ru</string> <string>pl-ru</string> <string>uk-ru</string> <string>de-ru</string> <string>tr-ru</string> </dirs> </Langs>
Напишем функцию, которая отправит запрос к API для получения списка возможных направлений:
static void GetLangs() { WebRequest request = WebRequest.Create("http://translate.yandex.net/api/v1/tr/getLangs"); WebResponse response = request.GetResponse(); using (StreamReader sr = new StreamReader(response.GetResponseStream())) { var fetchedXml = sr.ReadToEnd(); XmlDocument d = new XmlDocument(); d.LoadXml(fetchedXml); XmlNodeList trDirectionNodes = d.GetElementsByTagName("string"); foreach (XmlNode trDirectionNode in trDirectionNodes) Console.WriteLine("Dir: {0}", trDirectionNode.InnerText); } }
Данная функция обратится к API за списком возможных направлений, затем XML-ответ будет распарсен с помощью System.Xml, а полученные значения выведены на консоль. Можно реализовать добавление полученных данных в список, изменив соответствующий фрагмент кода так:
List<string> Langs = new List<string>(); // ... code code code ... foreach (XmlNode trDirectionNode in trDirectionNodes) Langs.Add(trDirectionNode.InnerText);
Метод translate
Данный метод принимает два параметра: lang и text. Параметр lang передает направление перевода, параметр text же передает переводимый текст. Формат ответа:
<?xml version="1.0" encoding="utf-8"?> <Translation code="200" lang="en-ru"> <text>Быть или не быть?</text> <text>Вот в чем вопрос.</text> </Translation>
Функция, обращающаяся к методу:
static XmlNodeList Translate(string lang, string text) { WebRequest request = WebRequest.Create("http://translate.yandex.net/api/v1/tr/translate?lang=" + lang + "&text=" + text); WebResponse response = request.GetResponse(); using (StreamReader sr = new StreamReader(response.GetResponseStream())) { var fetchedXml = sr.ReadToEnd(); XmlDocument d = new XmlDocument(); d.LoadXml(fetchedXml); XmlNodeList textNodes = d.GetElementsByTagName("text"); return textNodes; } }
Данная функция, после обращения к API и парсинга ответа, вернет нам объект XmlNodeList, который мы можем перебрать с помощью цикла foreach:
foreach (XmlNode textNode in Translate("ru-en", "тест")) Console.WriteLine("Text: {0}", textNode.InnerText);
Коды, возвращаемые API
Вы, должно быть, заметили, что каждый ответ API имеет атрибут code, который обозначает код операции. Таблица кодов:
На этом, думаю, все. Для получения более подробных сведений обратитесь к документации API. Спасибо за внимание.
ссылка на оригинал статьи http://habrahabr.ru/post/168101/
Добавить комментарий