JavaRush /Java блог /Random UA /Частина 3. Протоколи HTTP/HTTPS
Professor Hans Noodles
41 рівень

Частина 3. Протоколи HTTP/HTTPS

Стаття з групи Random UA
Цей матеріал - частина циклу "Введення в Enterprise-розробку". Попередні статті: Вітання! Сьогодні ми розбиратимемося в протоколах HTTP і HTTPS. Але для початку давай прояснимо один момент: йдеться про протоколи передачі даних по мережі на прикладному рівні моделі OSI. З моделлю OSI, як ти пам'ятаєш, ми розбиралися в одній із попередніх статей. А якщо не пам'ятаєш - ось вона . Частина 3. Протоколи HTTP/HTTPS - 1

Що таке протокол передачі даних

Так називають загальноприйняту угоду, завдяки якій розробники різних сервісів надсилають інформацію в єдиному вигляді. Наприклад, використовуючи Google Chrome, ти можеш отримати інформацію з Facebook і Twitter, тому що розробники передають її за допомогою стандартного протоколу HTTP, а твій браузер вміє його обробляти. Єдині правила дуже зручні і самим розробникам серверних частин: існує дуже багато бібліотек, які можуть за тебе перетворити інформацію та надіслати за необхідним протоколом. Спочатку HTTP замислювався як протокол передачі HTML-сторінок. Довгий час так і було, але зараз програмісти часто передають по ньому і рядки, і медіафайли. Загалом цей протокол універсальний і гнучкий, і використовувати його дійсно просто. А як це робити – зараз розберемося.

Структура HTTP

Відразу варто зазначити, що протокол HTTP складається тільки з тексту. А нас найбільше цікавить структура, в якій розташований цей текст. Кожне повідомлення складається із трьох частин:
  1. Стартовий рядок (Starting line) – визначає службові дані.
  2. Заголовки (Headers) – опис параметрів повідомлення.
  3. Тіло повідомлення (Body) – дані повідомлення. Повинні відокремлюватися від заголовків порожнім рядком.
За HTTP-протоколом можна надіслати запит на сервер (request) та отримати відповідь від сервера (response). Запити та відповіді дещо відрізняються параметрами.

Як виглядає простий HTTP-запит

GET / HTTP/1.1
Host: codegym.cc
User-Agent: firefox/5.0 (Linux; Debian 5.0.8; en-US; rv:1.8.1.7)
У стартовому рядку вказано:
  • GET – метод запиту;
  • / - Шлях запиту (path);
  • HTTP/1.1 - версія протоколу передачі даних.
Потім слідують заголовки:
  • Host - хост, якому адресаовано запит;
  • User-Agent – ​​клієнт, який надсилає запит.
Тіло повідомлення відсутнє. У HTTP-запиті обов'язкові тільки стартовий рядок та заголовок Host. Тепер розберемо все по черзі. HTTP-запит має містити якийсь метод. Усього їх дев'ять: GET, POST, PUT, OPTIONS, HEAD, PATCH, DELETE, TRACE, CONNECT. Найпоширеніші - GET та POST. Цих двох методів спочатку буде достатньо. GET – запитує контент із сервера. Тому запити з методом GET не мають тіла повідомлення. Але при необхідності можна відправити параметри через path у такому форматі: https://cdn.javarush.com/images/article/155cea79-acfd-4968-9361-ad585e939b82/original.pngsend?name1=value1&name2=value2 Тут: javaru - хост, / send - шлях запиту, ?— роздільник, що позначає, що далі йдуть параметри запиту. Наприкінці перераховуються параметри у форматі ключ = значення, розділені амперсандом. POST – публікує інформацію на сервері. POST-запит може передавати різну інформацію: параметри у форматі ключ = значення, JSON, HTML-код або навіть файли. Вся інформація передається у тілі повідомлення. Наприклад:
POST /user/create/json HTTP/1.1
Accept: application/json
Content-Type: application/json
Content-Length: 28
Host: codegym.cc

{
  "Id": 12345,
  "User": "John"
}
Запит надсилається на адресау codegym.cc/user/create/json, версія протоколу - HTTP/1.1. Accept вказує, який формат відповіді клієнт очікує отримати, Content-Type - у якому форматі надсилається тіло повідомлення. Content-Length – кількість символів у тілі. HTTP-запит може містити багато різних заголовків. Докладніше з ними можна ознайомитись у специфікації протоколу .

HTTP-відповіді

Після отримання запиту, сервер його обробляє та надсилає відповідь клієнту:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 98

<html>
  <head>
    <title>An Example Page</title>
  </head>
  <body>
    <p>Hello World</p>
  </body>
</html>
Стартовий рядок у респонсі містить версію протоколу (HTTP/1.1), Код статусу (200), Опис статусу (OK). У заголовках тип і довжина контенту. У тілі відповіді HTML-код, який браузер прорисує в HTML-сторінку.

Response Status Codes

З тілом повідомлення та заголовками все ясно, а про коди статусів варто сказати кілька слів. Response Status Codes завжди тризначні, і перша цифра коду вказує категорію відповіді:
  • 1xx – інформаційний. Запит отримано, сервер готовий до продовження;
  • 2xx – успішний. Запит отриманий, зрозумілий та оброблений;
  • 3xx - перенаправлення. Наступні дії слід виконати для обробки запиту;
  • 4xx – помилка клієнта. Запит містить помилки або не відповідає протоколу;
  • 5xx – помилка сервера. Сервер не зміг обробити запит, хоча був складений правильно;
Друга та третя цифри в коді деталізують відповідь. Наприклад:
  • 200 OK - реквест отримано та успішно оброблено;
  • 201 Created — реквест отримано та успішно опрацьовано, внаслідок чого створено новий ресурс або його екземпляр;
  • 301 Moved Permanently - запитуваний ресурс був переміщений назавжди, і наступні запити до нього мають відбуватися за новою адресаою;
  • 307 Temporary Redirect — ресурс тимчасово переміщений. Поки що до нього можна звертатися, використовуючи автоматичну переадресаацію;
  • 403 Forbidden - запит зрозумілий, але потрібна авторизація;
  • 404 Not Found - сервер не знайшов ресурс за цією адресаою;
  • 501 Not Implemented — сервер не підтримує функціональність для відповіді на запит;
  • 505 HTTP Version Not Supported — сервер не підтримує вказану версію протоколу HTTP.
До статусу-коду відповіді також надсилається опис статусу, завдяки якому інтуїтивно зрозуміло, що означає конкретний статус. HTTP-протокол дуже практичний: у ньому передбачено велику кількість хедерів, використовуючи які можна налаштувати гнучке спілкування між клієнтом та сервером. Усі хедери запитів та відповідей, методи запитів та статус-коди відповідей неможливо розглянути в одній статті. За потреби можеш почитати офіційну специфікацію протоколуяка описує всі нюанси. HTTP-протокол прийнято використовувати на порту 80, тому коли ти бачиш адресау, яка закінчується портом 80, можеш бути впевнений, що до нього потрібно звертатися за HTTP. З розвитком технологій та активним переміщенням персональних даних в інтернеті довелося задуматися про те, як забезпечити додатковий захист інформації, яку клієнт передає серверу. Внаслідок цього з'явився протокол HTTPS.

У чому різниця між HTTPS і HTTP

HTTPS синтаксично ідентичний протоколу HTTP, тобто використовує самі стартові рядки і заголовки. Єдині відмінності — додаткове шифрування та стандартний порт (443) . HTTPS шифрується між HTTP та TCP, тобто між прикладним та транспортним рівнями. Якщо забув, що це таке, заглянь до статті про модель OSI . Сучасний стандарт шифрування – за протоколом TLS. У цю тему ми надто поглиблюватися не будемо, але запам'ятай, що шифрування відбувається перед тим, як інформація потрапляє на транспортний рівень. У HTTPS шифрується абсолютно вся інформація, крім хоста та порту, куди надіслано запит. Для перекладу сервера на використання протоколу HTTPS замість HTTP, нам не потрібно змінювати код сервера. Увімкнення цієї фічі відбувається в контейнерах сервлетів, про які ми поговоримо в наступних статтях. А сьогодні все. Втім, постривай. Щоб помацати запити HTTP, відкрий Google Chrome, натисніть F12, виберіть вкладку Network. Тут будуть відображатися всі реквести та респонси, надіслані/отримані твоїм браузером. Частина 4. Основи Maven Частина 5. Сервлети. Пишемо просте веб-додаток Частина 6. Контейнери сервлетів Частина 7. Знайомство з патерном MVC (Model-View-Controller) Частина 8. Пишемо невелику програму на spring-boot
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ