Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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. Работа с сокетами
Что такое Request?
Слово Request с английского переводится как запрос. Имя говорит само за себя. Request это запрос к серверу от клиента или к клиенту от сервера. Обычно за реквестом следует респонс в виде json'а, ошибки, кода состояния http протокола. Как мы понимаем когда мы отправляем реквест как описывалось в 1 статье отправляется пакет и устанавливается сокетное соединение. Читайте внимательно ведь в конце статьи нам доведётся работать с реквестом и респонсом.

Что такое Response?
Response - ответ от сервера или клиента в зависимости от подключения. Респонсом может быть ответ сервера содержащий любую информацию как например отдача API Spiget'а в 1 статье. Также респонсом может быть ошибка, код состояния Http. Ниже будут представлены коды состояний Http.

Коды состояний HTTP
Вы наверно не мало раз в своей жизни встречали эти странные циферки, текст и надпись nginx. Так вот. Эти циферки - коды состояний HTTP. Они обозначают состояние. Например если код 200 - означает, что всё прошло успешно. А вот nginx - web сервер. Вы наверное сейчас скажете, "Ты наверное сейчас с ума сошёл? Для чего нам в работе с API нужны какие то web штучки? Пусть web дизайнеры и верстальщики оставляют их себе!", но я жевам отвечу. Так как мы работаем с API через HTTP соединение, если что-то вдруг случится на сервере или нам выдаст ошибку то этот код останется таким же как и в браузере. Поэтому я хочу представить вам все коды ответа.

1xx информационные
  1. 100 Continue
  2. 101 Switching Protocols
  3. 102 Processing
2xx успех
  1. 200 OK
  2. 201 Created
  3. 202 Accepted
  4. 203 Non-Authoritative Information
  5. 204 No Content
  6. 205 Reset Content
  7. 206 Partial Content
  8. 207 Multi-Status
  9. 208 Already Reported
  10. 209 IM Used
3xx редирект
  1. 300 Multiple Choices
  2. 301 Moved Permanently
  3. 302 Moved Temporarily
  4. 303 Found
  5. 304 See Other
  6. 305 Not Modified
  7. 306 Use Proxy
  8. 308 Temporary Redirect
  9. 309 Permanent Redirect
4xx ошибка клиента
  1. 403 Forbidden
  2. 404 Not Found
Вот в общем то и все самые нужные коды. Теперь приступим к написание практической части.

Работа с сокетами

Помните я много раз упоминал сокеты и сокетное соединение? Теперь мы научимся его устанавливать.
Сокет - программный интерфейс для обеспечения обмена данными между процессами.
P.S. сноска из википедии.
Чтобы установить сокетное соединение нам надо будет немного понять, что это за соединение такое. Вообще имеется 2 основных протокола TCP(Transmission Control Protocol) и UDP(User Datagram Protocol). Их различие в том, что TCP устанавливает надёжное соединение, а UDP устанавливает быстрое, но не такое надёжное как TCP соединение. TCP соединение проводит проверки и запрашивает неполученные/повреждённые пакеты в случае если они есть. UDP же без разницы на то, что какие то пакеты не дошли. Он не запрашивает их. Теперь начнём писать код. Для этого нам понадобится создать 2 класса. 1 - сервер, а 2 - клиент.
В коде сервера нам надо будет прописать вот такой вот код.
Java:
ServerSocket listener = null;
       String line;
       BufferedReader is;
       BufferedWriter os;
       Socket socketOfServer = null;

       try {
           listener = new ServerSocket(9999);
       } catch (IOException e) {
           System.out.println(e);
           System.exit(1);
       }

       try {
           System.out.println("Server is waiting to accept user...");
 
           socketOfServer = listener.accept();
           System.out.println("Accept a client!");

           is = new BufferedReader(new InputStreamReader(socketOfServer.getInputStream()));
           os = new BufferedWriter(new OutputStreamWriter(socketOfServer.getOutputStream()));


           while (true) {
               line = is.readLine();

               os.write(">> " + line);
               os.newLine();
               os.flush();

               if (line.equals("QUIT")) {
                   os.write(">> OK");
                   os.newLine();
                   os.flush();
                   break;
               }
           }

       } catch (IOException e) {
           System.out.println(e);
           e.printStackTrace();
       }
       System.out.println("Sever stopped!");
   }
}
И код клиента, который выглядит вот так.
Java:
final String serverHost = "localhost";

       Socket socketOfClient = null;
       BufferedWriter os = null;
       BufferedReader is = null;

       try {
 
           socketOfClient = new Socket(serverHost, 9999);

           os = new BufferedWriter(new OutputStreamWriter(socketOfClient.getOutputStream()));
           is = new BufferedReader(new InputStreamReader(socketOfClient.getInputStream()));

       } catch (UnknownHostException e) {
           System.err.println("Don't know about host " + serverHost);
           return;
       } catch (IOException e) {
           System.err.println("Couldn't get I/O for the connection to " + serverHost);
           return;
       }

       try {

           os.write("HELLO");
 
           os.newLine();
  
           os.flush();
           os.write("I am Tom Cat");
           os.newLine();
           os.flush();
           os.write("QUIT");
           os.newLine();
           os.flush();

           String responseLine;
           while ((responseLine = is.readLine()) != null) {
               System.out.println("Server: " + responseLine);
               if (responseLine.indexOf("OK") != -1) {
                   break;
               }
           }

           os.close();
           is.close();
           socketOfClient.close();
       } catch (UnknownHostException e) {
           System.err.println("Trying to connect to unknown host: " + e);
       } catch (IOException e) {
           System.err.println("IOException:  " + e);
       }
Этот код даст нам сервер и клиент, когда мы будем писать сообщения, они будут посылаться на сервер. Сервер это дело будет принимать и отвечать. Если мы установим адрес подключения на несуществующий то нам выдаст ошибку о том, что такого адреса нет. Мы создали 3 переменные. Это сокет, буферезированный печатник и буферизированный читальщик. Дальше подключились к указанному хосту на порт 9999(на котором у нас поднят сервер в файле сокета для сервера), отловили все ошибки подключения и принились за часть в которой осуществляеться Request и Response.
Вот и подошла к концу 2 часть.
 

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

Назад
Верх