Домой Edit me on GitHub

2019-03-15

Каналы передачи данных | Сетевое программирование | Базы данных | Основы Веб-программирования

C#, обращение к REST API

Пример online-переводчика, который использует класс WebRequest для обращения к API Яндекс.Переводчика.

Для удобства в программе используется простой GUI интерфейс.

../_images/csharp_restapi.png

Введение

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

Описание

Для создания программы-переводчика использовалось приложение Visual Studio 2013, а также дополнительный фреймворк Json.NET.

Приложение написано на WindowsForms, на языке C#. Для создания дизайна приложения была использована программа Adobe Photoshop CS5.

С помощью данного приложения можно перевести текст на 9 различных языков: Английский, Русский, Иврит, Испанский, Итальянский, Китайский, Немецкий, Французский, Японский. Перевод осуществляется с помощью веб-запросов к API Яндекс.Переводчика.

Для перевода текста достаточно ввести исходный текст в первое окно, указать начальный язык, а также требуемый язык перевода во всплывающих боксах. Для быстрой смены выбранных языков между собой можно воспользоваться центральной кнопкой в виде двух стрелок. Как только Вы выбрали нужные языки и ввели необходимый текст, нажмите кнопку «Перевод». Переведенный текст отобразится во втором окне.

Получение OAuth ключа

Чтобы работать с API Яндекс Переводчика, потребовалось получить API-ключ(OAuth токен доступа).

OAuth-токен ― это специальный код, разрешающий доступ к данным конкретного пользователя. Для каждого пользователя (логина в Яндекс.Директе, от имени которого осуществляются запросы к API) необходимо получить отдельный токен, который следует указывать при вызове методов.

Ключ был получен на сайте Яндекс https://tech.yandex.ru/translate/

Разработка приложения

Расположение объектов приложения было произведено при помощи WindowsForms, а затем оформлено при помощи изображений, созданных в Adobe Photoshop CS5. Код приложения написан на языке программирования C#.

Приложение состоит из трех классов: Form1, Translate и Translation.

Form1

В классе Form1 описаны объекты приложения и действия над ними. Приложение состоит из двух кнопок, реализованных через pictureBox; Двух текстбоксов, а также трех комбобоксов (всплывающие списки). В двух комбобоксах пользователь осуществляет выбор необходимого языка для перевода. Еще один комбобокс не отображается на экране, а служит лишь для осуществления быстрой смены двух выбранных языков между собой.

При нажатии на кнопку «Перевод» (pictureBox1) происходит вызов функции TranslateText, которая посылает веб-запрос. Однако, при отправлении запроса, требуется указать коды языков для перевода, например(“ru-en” или “it-ru”). Для этого была написана структура switch-case, которая, исходя из выбранных языков в комбобоксах, составляет необходимую нам строку с кодами языков.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TranslatorForWeb
{
    public partial class Form1 : Form
    {
        ComboBox forSwap;//Для свапа выбранных языков
        Translate YandexAPI;
        public Form1()
        {
            InitializeComponent();
            //---Первоначальные языки в боксах---
            comboBox1.SelectedItem = "Английский";
            comboBox2.SelectedItem = "Русский";
            //---
            //---Для свапа выбранных языков---
            forSwap = new ComboBox();
            forSwap.Items.AddRange(new object[] {
            #region Бокс для свапа
            "Английский",
            "Иврит",
            "Испанский",
            "Итальянский",
            "Китайский",
            "Немецкий",
            "Русский",
            "Французский",
            "Японский"});
            #endregion
            //---
            YandexAPI = new Translate();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        //===================Кнопка свапа языков========================
        private void pictureBox2_Click(object sender, EventArgs e)
        {
            forSwap.SelectedItem = comboBox2.SelectedItem;
            comboBox2.SelectedItem = comboBox1.SelectedItem;
            comboBox1.SelectedItem = forSwap.SelectedItem;
        }
        //==============================================================

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            #region Преобразование языка в код
            string inputlang;//Начальный язык
            inputlang = (String)Convert.ChangeType(comboBox1.SelectedItem, typeof(String));//Значение из первого бокса
            string outputlang;//Язык перевода
            outputlang = (String)Convert.ChangeType(comboBox2.SelectedItem, typeof(String));//Значение из второго бокса
            //===Преобразование названия языка в его кодовое значение===
            //---Для начального языка
            switch (inputlang)
            {
                case "Английский": inputlang = "en"; break;
                case "Русский": inputlang = "ru"; break;
                case "Иврит": inputlang = "he"; break;
                case "Испанский": inputlang = "es"; break;
                case "Итальянский": inputlang = "it"; break;
                case "Китайский": inputlang = "zh"; break;
                case "Немецкий": inputlang = "de"; break;
                case "Французский": inputlang = "fr"; break;
                case "Японский": inputlang = "ja"; break;
            }
            //---
            //---Для языка перевода
            switch (outputlang)
            {
                case "Английский": outputlang = "en"; break;
                case "Русский": outputlang = "ru"; break;
                case "Иврит": outputlang = "he"; break;
                case "Испанский": outputlang = "es"; break;
                case "Итальянский": outputlang = "it"; break;
                case "Китайский": outputlang = "zh"; break;
                case "Немецкий": outputlang = "de"; break;
                case "Французский": outputlang = "fr"; break;
                case "Японский": outputlang = "ja"; break;
            }
            //---
            //==========================================================
            #endregion
            string language = string.Format("{0}-{1}", inputlang, outputlang);//Итоговая строка языков с кодами
            richTextBox2.Text = YandexAPI.TranslateText(richTextBox1.Text, language);
        }

    }
}

Translate

Класс Translate описывает веб-запрос к серверам Яндекс.Переводчика и десериализацию JSON полученного ответа. Запрос к API переводчика содержит ряд обязательных параметров – это:

key=<API-ключ>
& text=<переводимый текст>
& lang=<направление перевода>.

Необязательные параметры, такие как формат и опции перевода, в приложении не используются.

Так как ответ приходит в виде структуры данных JSON, требуется его распарсить. Для этого был установлен дополнительный фреймворк Json.NET и подключена библиотека Newtonsoft.Json.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;//Пакет JSON

namespace TranslatorForWeb
{
    class Translate
    {
        public string TranslateText(string s, string language)
        {
            if (s.Length > 0)//Проверка на непустую строку
            {
                //---Запрос---
                WebRequest request = WebRequest.Create("https://translate.yandex.net/api/v1.5/tr.json/translate?"
                    + "key=trnsl.1.1.20170125T084253Z.cc366274cc3474e9.68d49c802348b39b5d677c856e0805c433b7618c"//Ключ
                    + "&text=" + s//Текст
                    + "&lang=" + language);//Язык

                WebResponse response = request.GetResponse();
                //--------------------
                //---Распарсить JSON ответ. Я скачал фреймворк Json.NET
                using (StreamReader stream = new StreamReader(response.GetResponseStream()))
                {
                    string line;
                    if ((line = stream.ReadLine()) != null)
                    {
                        Translation translation = JsonConvert.DeserializeObject<Translation>(line);
                        s = "";
                        foreach (string str in translation.text)
                        {
                            s += str;
                        }
                    }
                }
                //------------------
                return s;
            }
            else
                return "";
        }
    }

    class Translation
    {
        public string code { get; set; }
        public string lang { get; set; }
        public string[] text { get; set; }
    }
}

Translation

Данных класс описывает структуру JSON-ответа на запрос к API переводчика.

Previous: node.js + WebKit Next: Закрепление материала «WSGI»