1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Стартап Работа с web API и Http соединениями 1.

Тема в разделе "Разработка плагинов для новичков", создана пользователем ifxandy, 9 апр 2020.

?

Делать ли мне статью про уровни соединений

  1. Да

    2 голосов
    100,0%
  2. Нет

    0 голосов
    0,0%
  1. Автор темы
    ifxandy

    ifxandy Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    witwar
    Здравствуйте, программисты. Хотел бы вас поприветствовать в статье(теме) специально написаной для другой моей темы с полезными ссылками. Как то раз я писал уже туториал, но мне сказали, что лучше бы я объяснил более интересные финтифлюшки про которые мало инфы в интернете. Поэтому я пишу эту статью.

    глава 1, глава 2
    Когда я занимался своим плагином наподобие PlugMan'а, который помогал бы управлять плагинами прямо из игры по типу отключения/включения/скачивания последней версии и т.п. мне написали по поводу последнего(на тот момент у меня ещё не было команды /latest для скачивания последних версий). @Saharo4ek написал, что если уж это плагин помогающий управлять другими плагинами, то он должен уметь и обновлять их. Я задумался и ответил ему. Но только я незнал как организовать обновление, ведь для него нужен был ID проекта на spigotmc, какую бы утилиту я для этого не использовал, всё требовало ID. С самого spigot скачивать было не очень, так как не было URL'а под api, чтобы скачивать последнюю версию плагина. Последняя версия как я понял обозначалась каждый раз своим числом. В поисках способа скачки и действия с плагинами я начал читать код других и наткнулся на 1 плагин, который использовал API сайта Spiget. Этот сервис предоставлял полное и удобное с очень большими возможностями API. Можно было скачивать со spigot'а любые ресурсы, получать по ним информацию и прочее. В этой статье я хотел бы рассказать как использовать такие API как раз таки на примере Spiget'а.

    Содержание
    1 Глава. Основы Http и web
    1. Подготовка среды
    2. Концепция, теория
    3. Практика и первое соединение
    2 Глава. Request - Response
    1. Что такое Request?
    2. Что такое Response?
    3. Коды состояний Http
    4. Работа с сокетами
    Подготовка среды

    Первым делом нам понадобится любое удобное IDE. Я предложу вам 3 варианта. Вы же можете выбрать любой или даже взять свой.
    1. Eclipse(используется чаще всего, так же мной, лично мой выбор, самоучитель pdf)
    2. NetBeans(полностью на русском)
    3. IntelIjIdea(просто хорошее IDE, лично я им просто никогда не пользовался поэтому не могу сказать точно)
    4. Консолька Linux :lol: (в ней тоже реально это сделать. Самый родной для меня вариант.)
    Внимание в этой статье всё будет показано на примере с Eclipse по причине использования автором этой среды разработки. Это не является оскорблением/побуждением на хейт или не использование других сред разработки.

    Первым делом нам конечно же потребуется создать проект, если вы зашли с уже готовым проектом и желанием встроить необходимый код и понять его вам во 2 части этой главы. Для начала нам надо открыть меню File. Там у нас будет множество разных действий. Но нам понадобится пока, что только первый пункт New. Он отвечает за создание новых файлов/проектов и всего прочего. Нам же нужен Java Project так как мы будем работать на Java. Нас просят ввести необходимую информацию. После того как мы ввели имя проекта и выбрали JavaSE нам необходимо нажать Finish, в отличии от создания проекта для разработки плагинов под Spigot/Bukkit нам не понадобится ничего кроме стандартной библиотеки JavaSE. Вот мы и создали проект. Далее нам необходимо открыть его и в папке src создать пакет. Для этого жмём ПКМ по src и выбираем.
    New->Package
    Вводим имя пакета. Обычно его называют по такому формату (домен например ru/net/org/su).(автор).(название проекта). Нажимаем Finish. Наш пакет создан. Мы уже можем работать над кодом.

    Концепция, теория

    Так как это поучающая статья, я постараюсь рассказать всё наглядно и на примерах. Сперва хочу дать вам полезную ссылку. Нам потребуется только прикладной уровень. В отдельной сноске или даже статье я возможно напишу о интересных вещах связанных с сетевой моделью OSI. А теперь я приведу небольшой пример о работе сервера и клиента. Мы и наше java приложение это клиент. А наш друг, Bukkit - сервер. Как только мы хотим к нему подключится мы отправляем ему пакет(ы)(сокетное соединение, транспортный уровень), количество пакетов зависит от обьёма данных для отправки. Пакет(чаще всего 1) с нашей и управляющей информацией идёт к серверу. Bukkit принимает этот пакет и дешифрует его получая информацию. Потом он обрабатывает эту информацию(например в случае бана информация будет проверяться на то, не забанен ли игрок) и если она не соответствует чему то(например игрок забанен), соединение сбрасывается и игроку вылетает ошибка. За частую соединение сбрасывается не просто так, а с переданным сообщением по типу "Вы забанены на сервере навсегда оператором...". Если же данные всему соответствуют то Bukkit отсылает ответный пакет о успешном подключении у между клиентом и сервером появляеться стабильное сокетное соединение. Когда клиент, что то делает это сначало записывается локально на его компьютер, а именно в буфер. Буфер обычно имеет скудный размер и когда он переполняется, информация из буфера делится на пакеты и отправляется на сервер. Сервер же принимает пакеты, обрабатывает их по типу изменения мира(если игрок сломал блок он отсылает пакет на сервер об этом и сервер уже в общем мире ломает этот блок). На этом построена логика Bukkit/Spigot API. Сервер при обработке допустим ломания блока, при отмене Event'а может отправить клиенту информацию, для прогрузке где блок всё равно не сломан.

    Практика и первое соединение

    Я обещал устроить практику на примере Spiget'а. Перейдя по вот этой ссылке вы можете увидеть страницу API этого сервиса. Для начала создадим в пакете, который мы создали в начале класс. Назовём его допустим TestConnecter. Для подключения в классе TestConnecter нам надо отправить запрос на URI API, после чего, нам отдадут JSON ответ. Это респонс о нём мы поговорим во 2 главе. Для этого напишем такой код.
    Код:
    try {
            URL url = new URL("api.spiget.org/v2/resources/2/author"); // Вместо того, что в скобках                можно вставить любой свой URL.
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.addRequestProperty("User-Agent", "любое название тут");
    } catch(IOException e) {}
    Этот код будет пытаться подключиться и если не получается он не будет делать ничего. Теперь давайте разберу его. Мы определяем URL адрес на который будет адресовывать подключение. Дальше создаём подключение при помощи преобразование подключения полученого при помощи метода openConnection унаследованого от класса URL. Дальше соединению мы ОБЯЗАТЕЛЬНО выставляем соединению параметр User-Agent. Этот параметр отвечает за то "из какого браузера мы подключаемся". Стандартный user-agent Jav'ы обычно заблокирован на сервере поэтому если мы попытаемся подключиться без кастомного User-Agent'а мы получим ошибку. Для этого мы как бы устанавливаем свой User-Agent обманывая сервер, и сервер будет думать, что мы сидим из браузера, User-Agent которого мы указали. Даже если такого браузера и вовсе не существует. Мы подключились, а что дальше? Нам надо как то считать всё, что нам отдал сервер. Для этого воспользуемся этим кодом.
    Код:
    try {
            URL url = new URL("api.spiget.org/v2/resources/2/author"); // Вместо того, что в скобках                можно вставить любой свой URL.
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.addRequestProperty("User-Agent", "любое название тут");
            InputStream inputStream = connection.getInputStream();
            InputStreamReader reader = new InputStreamReader(inputStream);
     
            JsonElement element = new JsonParser().parse(reader);
     
            if (element.isJsonArray()) {
                 // Json список
            } else if (element.isJsonObject()) {
                 // Json объект
            System.out.println(element);
    } catch(Exception e) {
         e.printStackTrace();
    }
    Этот код будет выводить ошибку при любой неудачной попытке подключения и будет выводить полученное значение при удачной попытке. Так же хочу его разобрать. После создания соединения мы получили входной поток. То что нам отдаёт сервер. Потом создали экземпляр класса InputStreamReader, который читает этот входной поток, ведь в аргументах мы указали, переменную с входным потоком. Дальше мы создали переменную с типом JsonElement, которая являлась элементом Json'а и проверяли объект Json это или же список. Потом мы просто выводили этот элемент.
    Это была 1 часть статьи посвещённой работе с Web через java.
     
    Последнее редактирование: 9 апр 2020

Поделиться этой страницей