- Баллы
- 76
- Имя в Minecraft
- witwar
Здравствуйте, программисты. Хотел бы вас поприветствовать в статье(теме) специально написаной для другой моей темы с полезными ссылками. Как то раз я писал уже туториал, но мне сказали, что лучше бы я объяснил более интересные финтифлюшки про которые мало инфы в интернете. Поэтому я пишу эту статью.
Содержание
1 Глава. Основы Http и web
Слово Request с английского переводится как запрос. Имя говорит само за себя. Request это запрос к серверу от клиента или к клиенту от сервера. Обычно за реквестом следует респонс в виде json'а, ошибки, кода состояния http протокола. Как мы понимаем когда мы отправляем реквест как описывалось в 1 статье отправляется пакет и устанавливается сокетное соединение. Читайте внимательно ведь в конце статьи нам доведётся работать с реквестом и респонсом.
Что такое Response?
Response - ответ от сервера или клиента в зависимости от подключения. Респонсом может быть ответ сервера содержащий любую информацию как например отдача API Spiget'а в 1 статье. Также респонсом может быть ошибка, код состояния Http. Ниже будут представлены коды состояний Http.
Коды состояний HTTP
Вы наверно не мало раз в своей жизни встречали эти странные циферки, текст и надпись nginx. Так вот. Эти циферки - коды состояний HTTP. Они обозначают состояние. Например если код 200 - означает, что всё прошло успешно. А вот nginx - web сервер. Вы наверное сейчас скажете, "Ты наверное сейчас с ума сошёл? Для чего нам в работе с API нужны какие то web штучки? Пусть web дизайнеры и верстальщики оставляют их себе!", но я жевам отвечу. Так как мы работаем с API через HTTP соединение, если что-то вдруг случится на сервере или нам выдаст ошибку то этот код останется таким же как и в браузере. Поэтому я хочу представить вам все коды ответа.
1xx информационные
Работа с сокетами
Помните я много раз упоминал сокеты и сокетное соединение? Теперь мы научимся его устанавливать.
Сокет - программный интерфейс для обеспечения обмена данными между процессами.
P.S. сноска из википедии.
Чтобы установить сокетное соединение нам надо будет немного понять, что это за соединение такое. Вообще имеется 2 основных протокола TCP(Transmission Control Protocol) и UDP(User Datagram Protocol). Их различие в том, что TCP устанавливает надёжное соединение, а UDP устанавливает быстрое, но не такое надёжное как TCP соединение. TCP соединение проводит проверки и запрашивает неполученные/повреждённые пакеты в случае если они есть. UDP же без разницы на то, что какие то пакеты не дошли. Он не запрашивает их. Теперь начнём писать код. Для этого нам понадобится создать 2 класса. 1 - сервер, а 2 - клиент.
В коде сервера нам надо будет прописать вот такой вот код.
И код клиента, который выглядит вот так.
Этот код даст нам сервер и клиент, когда мы будем писать сообщения, они будут посылаться на сервер. Сервер это дело будет принимать и отвечать. Если мы установим адрес подключения на несуществующий то нам выдаст ошибку о том, что такого адреса нет. Мы создали 3 переменные. Это сокет, буферезированный печатник и буферизированный читальщик. Дальше подключились к указанному хосту на порт 9999(на котором у нас поднят сервер в файле сокета для сервера), отловили все ошибки подключения и принились за часть в которой осуществляеться Request и Response.
Вот и подошла к концу 2 часть.
глава 1, глава 2
Когда я занимался своим плагином наподобие PlugMan'а, который помогал бы управлять плагинами прямо из игры по типу отключения/включения/скачивания последней версии и т.п. мне написали по поводу последнего(на тот момент у меня ещё не было команды /latest для скачивания последних версий). @Saharo4ek написал, что если уж это плагин помогающий управлять другими плагинами, то он должен уметь и обновлять их. Я задумался и ответил ему. Но только я незнал как организовать обновление, ведь для него нужен был ID проекта на spigotmc, какую бы утилиту я для этого не использовал, всё требовало ID. С самого spigot скачивать было не очень, так как не было URL'а под api, чтобы скачивать последнюю версию плагина. Последняя версия как я понял обозначалась каждый раз своим числом. В поисках способа скачки и действия с плагинами я начал читать код других и наткнулся на 1 плагин, который использовал API сайта Spiget. Этот сервис предоставлял полное и удобное с очень большими возможностями API. Можно было скачивать со spigot'а любые ресурсы, получать по ним информацию и прочее. В этой статье я хотел бы рассказать как использовать такие API как раз таки на примере Spiget'а.
Содержание
1 Глава. Основы Http и web
- Подготовка среды
- Концепция, теория
- Практика и первое соединение
- Что такое Request?
- Что такое Response?
- Коды состояний Http
- Работа с сокетами
Слово Request с английского переводится как запрос. Имя говорит само за себя. Request это запрос к серверу от клиента или к клиенту от сервера. Обычно за реквестом следует респонс в виде json'а, ошибки, кода состояния http протокола. Как мы понимаем когда мы отправляем реквест как описывалось в 1 статье отправляется пакет и устанавливается сокетное соединение. Читайте внимательно ведь в конце статьи нам доведётся работать с реквестом и респонсом.
Что такое Response?
Response - ответ от сервера или клиента в зависимости от подключения. Респонсом может быть ответ сервера содержащий любую информацию как например отдача API Spiget'а в 1 статье. Также респонсом может быть ошибка, код состояния Http. Ниже будут представлены коды состояний Http.
Коды состояний HTTP
Вы наверно не мало раз в своей жизни встречали эти странные циферки, текст и надпись nginx. Так вот. Эти циферки - коды состояний HTTP. Они обозначают состояние. Например если код 200 - означает, что всё прошло успешно. А вот nginx - web сервер. Вы наверное сейчас скажете, "Ты наверное сейчас с ума сошёл? Для чего нам в работе с API нужны какие то web штучки? Пусть web дизайнеры и верстальщики оставляют их себе!", но я жевам отвечу. Так как мы работаем с API через HTTP соединение, если что-то вдруг случится на сервере или нам выдаст ошибку то этот код останется таким же как и в браузере. Поэтому я хочу представить вам все коды ответа.
1xx информационные
- 100 Continue
- 101 Switching Protocols
- 102 Processing
- 200 OK
- 201 Created
- 202 Accepted
- 203 Non-Authoritative Information
- 204 No Content
- 205 Reset Content
- 206 Partial Content
- 207 Multi-Status
- 208 Already Reported
- 209 IM Used
- 300 Multiple Choices
- 301 Moved Permanently
- 302 Moved Temporarily
- 303 Found
- 304 See Other
- 305 Not Modified
- 306 Use Proxy
- 308 Temporary Redirect
- 309 Permanent Redirect
- 403 Forbidden
- 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);
}
Вот и подошла к концу 2 часть.