. Дневник программиста: Веб-сервис ера. Пример использования в Java.

Дневник программиста: Веб-сервис ера. Пример использования в Java.

Актуальная информация, аналитика и экспертные мнения — всё в одном месте. Достоверно, объективно, профессионально.

Позвонить: +7 (495) 987-65-43

Проверка орфографии из программы на Java с использованием веб-сервиса Яндекс.Спеллер

Написанию данного сообщения предшествовало два события. Во-первых, участвуя в одном проекте разработки документооборота, я занялся изучением работы с веб-сервисами из Java. Во-вторых, моя жена увлеклась отгадыванием слов в одной из игр, представленных в социальной сети одноклассников. Игра заключалась в том, что по ряду представленных фотографий необходимо было составить слово, которое могло бы явиться их обобщением. Под слово предлагался placeholder (извините, не удержался) из необходимого количества знакомест и касса из двадцати букв, часть из которых должна была составить искомое слово.

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

Как бы то не было, все это время я оставался программистом. И не просто программистом, а программистом изучающим разработку веб-сервисов и их клиентов на Java. Поэтому, я тут же нашел в Google страницу с описанием веб-сервиса Яндекс.Спеллер и написал класс, с помощью которого можно было бы отправить этому сервису набор букв и получить ответ о том, является ли этот набор букв словом из словаря Яндекс.Спеллера или нет. Таким образом, я рассчитывал написать на основе этого класса программу, которая бы перебирала из заданной кассы в 20 букв все возможные комбинации по заданному количеству букв, фильтровала бы их на основе простых фильтров (открытые буквы, мягкий знак в начале слова и т.д.) и спрашивала бы у Яндекс.Спеллера, принадлежит ли данное слово его словарю. Все получившиеся таким образом правильные слова я надеялся представить в виде списка из которого потом выбрать те, что могли бы подойти под содержание представленных фотографий.

Ублажая роботов поисковой системы Яндекса приведу ссылку на страницу, где я получил информацию об интересуемом меня веб-сервисе Яндекс.Спеллера: Яндекс API/Руководство разработчика/Web Service API/Метод checkText.

Забегая вперед скажу, что после запуска этой программы, Яндекс забанил меня примерно после двух десятков тысяч обращений к своему спеллеру и я уже сутки получаю в ответ на запросы к нему ответ "403 Forbidden", так что прикладная польза от этой затеи оказалась нулевая. Однако, программа была написана и соответствующая теория по работе с веб-сервисами была закреплена дополнительным практическим кодом. Вообще, вопрос об отказе обслуживания моих запросов остался. Почему? Разве не для программных обращений Яндекс выставил наружу свои публичные веб-сервисы? Что в моих запросах оказалось неправомерным с точки зрения его автоматов? Частота обращения? Простота запросов (по одному слову, вместо пакета, например, с сотней или тысячей слов)? Или огромное количество "слов" с ошибками? Ответа на этот вопрос я пока не знаю. Возможно, кто-то из читателей этих строк сможет грамотно прокомментировать ситуацию.

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

Обратите внимание. В коде используются возможности Java 7.

Представленный далее класс состоит из приватных полей внутренних данных, конструктора, акцепторов (интерфейс для получения некоторых внутренних данных) и, собственно, главного метода check(), который и выполняет синхронное обращение к веб-сервису Яндекса, получает ответ, разбирает его и сообщает о результате проверки.

Для работы с веб-сервисами, в моей реализации, используется библиотека Jersey. Это известная и популярная библиотека для работы с веб-сервисами поддерживающими архитектуру REST. Для тех, кто не знает смысла этой умной аббревиатуры, поясню. Такая архитектура подразумевает общение на уровне сообщений, где каждое сообщение несет в себе весь необходимый контекст запроса. Т.е. не нужно создавать сессии, в которых хранить и накапливать контекст таких диалогов. Как вариант, такая архитектура может строиться на основе HTTP. Этот протокол, в чистом виде, как раз является протоколом REST, например, в отличие от того же протокола SIP, который основан на HTTP, но уже в наборе своих заголовков несет информацию не только о номере сессии, но и о номере коннекта внутри сессии.

Следует обратить внимание, что библиотека Jersey несколько преобразилась начиная со второй версии. Насколько мне показалось, коды, использующие первую и вторую версию Jersey не совместимы ни в какую из сторон. Так как меня, на этот момент интересовала первая версия Jersey, то и приведенный код использования Jersey соответствует первой версии библиотеки. Конкретно, для компиляции этого кода я использовал в проектном файле системы сборки Maven указание на следующую зависимость.

Собственно, весь код использования Jarsey можно свести к следующему фрагменту.

Некоторые дополнительные подробности по работе с Jersey можно получить на странице Client API из документации по первой версии библиотеки.

Еще раз обратите внимание на синхронность операции получения ответа на запрос GET к веб-сервису. Обратите внимание, что на время получения этого ответа, исполнение этой программы приостановится. Если вас это не устраивает, то придется искать другой способ выполнения данной операции.

Дальнейший код связан с обработкой ответа полученного от веб-сервиса. Так как ответ приходит в виде строки JSON, необходимо выполнить парсинг данной строки. В данном коде используется простая библиотека от Google, с многоговорящим названием JSON-simple. Для включения этой библиотеки в зависимости проектного файла системы сборки Maven, я использую следующий код.

Схема использования JSON-siple проста. Создается объект парсера сообщения JSON - JSONParser. Объекту парсера отдается сообщение со строкой JSON. Результатом парсинга является объект базового класса, который мы потом пребразуем к ожидаемому типу данных. Так как мы ожидаем массив JSON, то следует воспользоваться типом JSONArray. Класс JSONArray реализует интерфейс List, поэтому мы сможем выполнить обход массива через объект итератора. Далее, извлекаем основные данные из ответа, в том числе и массив подсказок по вариантам исправления ошибочного слова.

📎📎📎📎📎📎📎📎📎📎

О проекте

Наш информационный портал — это площадка, где публикуются аналитические статьи, тематические обзоры и экспертные комментарии. Наша миссия — предоставлять качественные материалы, основанные на фактах и глубокой проработке темы. Мы не боимся сложных тем и всегда стремимся дать читателю объективную картину происходящего.

Наши услуги

Аналитика

Развернутые аналитические материалы по актуальным вопросам.

Обзоры

Еженедельные тематические обзоры по отраслям и регионам.

Экспертные мнения

Мнение специалистов и профессионалов из различных сфер.

Публикации

Доступ к архиву публикаций и уникальных материалов.

Контакты

📍 г. Москва, ул. Академика Королёва, д. 10, офис 402

☎ +7 (495) 987-65-43

📧 info@site.ru

🕓 Работаем: Пн–Пт, с 09:00 до 19:00

Размер шрифта: