Автор оригинала: FreeCodeCamp Community Member.
Preethi Kasireddy
Мы пошли за базовую веб-архитектуру в Часть I И мы говорили о структуре веб-приложения в Часть II Отказ Теперь пришло время кататься на наших рукавах и принять участие в части III: ближе посмотрите на http и отдых.
Понимание HTTP имеет решающее значение для веб-разработчиков, потому что он облегчает поток информации в веб-приложениях – позволяя улучшать взаимодействия пользователей и улучшению производительности сайта.
Что такое http?
В модели клиента-сервера клиентов и серверов обмениваются сообщениями в шаблоне обмена сообщениями «Запрос-ответ»: клиент отправляет запрос, и сервер возвращает ответ.
Отслеживание этих сообщений сложно, чем звучит, поэтому клиент и сервер придерживаются общего языка и набора правил, чтобы они знали, что ожидать. Этот язык или «протокол» называется http.
Протокол HTTP определяет синтаксис (формат данных и кодировку), семантика (смысл, связанный с синтаксисом) и синхронизацией (скорость и секвенирование). Каждый HTTP-запрос и ответ обменяются между клиентом и сервером, считается одним HTTP Transaction Отказ
Http: широкие удары
Есть несколько вещей, которые стоит отметить о HTTP, прежде чем мы погрузимся в детали.
Во-первых, HTTP находится в тексте, что означает, что сообщения, обмениваемые между клиентом и сервером, являются битами текста. Каждое сообщение содержит две части: заголовок и тело.
Во-вторых, HTTP – это протокол слоя приложений, что означает, что это просто слой абстракции, который стандартизирует, как проводятся хосты. HTTP сам не передает данные. Он по-прежнему зависит от базового протокола TCP/IP, чтобы получить запрос и ответ с одной машины в другую.
(В качестве напоминания TCP/IP представляет собой систему из двух частей, которая функционирует как фундаментальная «система контроля управления Интернетом». Для получения дополнительной информации о TCP/IP, проверьте Часть I )
Наконец, вы, возможно, увидели протокол «https» в адресной строке в вашем браузере и задавались вопросом, является ли http то же самое, что и http + “S”. Краткий ответ – это сорти, с небольшим разницей.
Обычный HTTP-запрос или ответ не зашифрован и уязвим к различным типам атак безопасности. HTTPS, с другой стороны, является более безопасным сообщением, которое использует шифрование для сохранения вещей. Он обозначает http через TLS/SSL.
SSL – это протокол безопасности, который позволяет клиенту и серверу взаимодействовать по сети безопасным способом – предотвратить подслушивание и вмешательство – в то время как сообщение проходит через сеть.
Клиент обычно указывает, требуется ли ему соединение TLS/SSL с помощью специального номера порта: 443. После того, как клиент и сервер согласны использовать TLS/SSL для связи, они договариваются о состоянии состояния, делая то, что называется «рукопожатие TLS». Затем клиент и сервер устанавливают секретные сессионные ключи, которые они могут использовать для шифрования и расшифровки сообщений, поскольку они разговаривают друг с другом.
Многие крупные веб-сайты, такие как Google и Facebook, используют HTTPS – в конце концов, это то, что сохраняет ваши пароли, личную информацию и детали кредитной карты на проволоке.
Http: точные удары
С этими основаниями с дороги давайте погрузимся немного глубже в структуру http.
Мы можем начать с посещения https://www.github.com общаться с сервером GitHub. Если вы используете Chrome или Firefox с установленным расширением Firebug FireBug, вы можете исследовать детали HTTP-запросов, перейдя на вкладку «Сеть». Если у вас есть этот открытый, потом посетите www.github.com Набирая его в вашу адресную панель, и вы должны увидеть что-то вроде этого:
Затем на левой панели нажмите на первый путь «GitHub.com». Теперь вы должны увидеть это:
HTTP Запрос заголовка
HTTP-заголовки обычно содержат метаданные (данные о данных). Метаданные включают в себя тип запроса (Get vs. Post vs. Put vs. Удалить), путь, код состояния, тип контента, пользовательский агент, cookie, Post Cody (иногда) и многое другое.
Давайте посмотрим на самые важные части заголовка, используя пример GitHub, начиная с раздела «Заголовки ответа»:
- URL-адрес запроса: https://github.com/
- URL-адрес, который мы просили
- Способ запроса: получить
- Тип используемого метода HTTP. В нашем случае наш браузер сказал: «Эй, сервер GitHub, забери меня на домашнюю страницу».
- Код состояния: 200 ОК
- Стандартизированный способ для сервера, чтобы сообщить клиенту о результате его запроса. Код статуса 200 означает, что сервер успешно нашел ресурс и отправляет его вам.
- Удаленный адрес: 192.30.252.129: 443
- IP-адрес и номер порта веб-сайта GitHub, который мы посетили. Обратите внимание, что это порт # 443 (что означает, что мы используем HTTPS вместо http).
- Кодировка контента: GZIP
- Кодирование ресурса мы получили обратно. В нашем случае сервер GitHub говорит нам, что контент, который он отправляет обратно, сжимается. GitHub, вероятно, сжимает файл, чтобы вы могли иметь более быстрое время загрузки.
- Тип содержимого: текст/HTML; -8
- Определяет представление данных в органе ответа, включая тип и подтип. Тип описывает тип данных, а подтип определяет определенный формат для этого типа данных. В нашем случае у нас есть отправляемый текст в виде HTML
- Вторая часть определяет кодировку символов для документа HTML. Чаще всего это будет UTF-8, как и в случае выше.
Также есть куча информации заголовка, которую клиент должен был отправить так, чтобы сервер мог знать, как ответить. Посмотрите в порцию «Запрос заголовков»:
- User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebkit/537.36 (KHTML, как Gecko) Chrome/47.0.2526.73 Safari/537.36
- Программное обеспечение, которое действует от имени пользователя. Иногда веб-сайт должен знать, как оно рассматривается. Таким образом, браузер отправляет эту строку пользователей-агента, которую сервер может использовать для определения того, что используется для доступа к веб-сайту
- Примите кодирование: gzip, deflate, sdch
- Указывает, какое содержание, кодирующее браузер, готов принять. Мы можем видеть, что GZIP перечислен, и поэтому сервер GitHub смог отправить нам содержимое в формате GZIP.
- Язык принимает: ru-us, en; q = 0,8
- Описывает язык, который мы хотим, чтобы веб-страница находиться в. В нашем случае «en» стоит на английском языке.
- Хост: github.com.
- Самосвязанный:)
- Cookie: _OCTO = GH1.1.491617779.1446477115 ;; – PEEKAY; _gh_sess = что-тоfake что-то фактовоее-тоfakethothingFakesomethingthingfakesomethingFakeSomethothingfakethothfake; что-тоfakehoththingfortfakeomethothefortfake;;% 2floS_ANGELES_
- Кусок текста, который веб-сервер может хранить на машине пользователя и позже получить. Информация хранится как пары имени значения. Одно из пар со значениями, которые GitHub хранится для моей просьбы, например, IS-SEEKAY, который информирует GitHub, что мой userId – IAM-SEEKAY.
TL; DR: Что случилось со всеми этими парами имени?
Короче говоря, мы остались с большим количеством пар названий. Но как создано эти пары имени значения?
В любое время ваш браузер посещает веб-сайт, он будет выглядеть на вашем компьютере для файла cookie, установленного на веб-сайте ранее.
Так что если я посещаю www.github.com, Мой браузер будет искать файл cookie, который GitHub сохранил на моем жестком диске. Если он найдет файл cookie, он отправит все пары имени на заголовке запроса.
Веб-сервер GitHub теперь может использовать данные файла cookie во многих различных способах, таких как контент рендеринга на основе моих сохраненных пользовательских предпочтений, подсчитывая количество времени, которое я посетил их сайт.
Если браузер не находит файл cookie – либо потому, что сайт никогда не посещал до или пользователь заблокирован или удалил его – браузер не отправляет никаких данных файлов cookie.
В этом случае сервер GitHub создает новый идентификатор в качестве пары значений имени, а также любые другие пары значений имени, которые он хочет, и отправляет его на мой компьютер через HTTP-заголовок – который My Complic затем хранит на своем жестком диске.
HTTP Body
Как вы видели выше, сервер содержит большую часть важных «метаданных» (данные о данных), которые ему необходимо общаться с клиентом.
Сейчас на тело.
Тело, как вы можете догадаться, это тело сообщения. В зависимости от типа запроса он может быть пустым.
В нашем случае вы можете увидеть тело на вкладке «Ответ». Так как мы сделали запрос на получение www.github.com, Корпус содержит содержимое HTML-страницы для www.github.com.
… Что, конечно, важно для отображения этой страницы.
Дополнительные упражнения
Я надеюсь, что это оставляет вас лучше понять структуру http. Для практики вы можете взглянуть на все другие активы, которые запрашиваются вашим браузером (изображениями, файлами JavaScript и т. Д.) При посещении www.github.com Отказ
С помощью этого, давайте посмотрим на различные типы методов HTTP, которые могут инициировать клиент.
HTTP-методы
HTTP глаголы или методы, скажите серверу, что делать с данными, идентифицированными по URL. URL всегда определяют определенный ресурс. Когда клиент использует URL в сочетании с http глагол, это сообщает серверу, какое действие должно произойти, на каком ресурсе.
Примеры URL включают в себя:
- Получить http://www.example.com/users (Получить всех пользователей)
- Пост http://www.example.com/users/a-unique-id . (Создайте новый пользователь)
- Поставить http://www.example.com/Comments/-unique-id (Обновите комментарий)
- Удалить http://www.example.com/Comments/-unique-id (Удалить комментарий)
Когда клиент делает запрос, он укажет тип запроса, используя один из этих глаголов. Самые важные из них получают, пост, поставить и удалить. Есть и другие методы, такие как голова и варианты, но они Rarer, поэтому мы пропустим тех для этого поста.
ПОЛУЧАТЬ
Получить наиболее часто используемый метод. Он используется для чтения информации для данного URL с сервера.
Получить запросы только для чтения, что означает, что данные никогда не должны быть изменены на сервере – сервер должен просто получить неизменные данные. Таким образом, запросы GET считаются безопасными операциями, потому что призыв его один раз или призвать его в 20 раз, будет иметь тот же эффект.
Кроме того, получить запросы idempotent Отказ Это означает, что подача нескольких запросов GET к одному и тому же URL должно привести к тому же эффекту, что и только один запрос на получение.
Получить запросы отвечать с кодом состояния 200 (ОК), если ресурс был успешно найден, и 404 (не найден), если ресурс не найден. (Следовательно, термин «404 страница» для сообщений об ошибках при посещении отставных или неправильно напечатанных URL-адресов.)
ПОЧТА
Почта используется для создания нового ресурса, такого как форма регистрации. Вы используете пост, когда вы хотите создать подчиненный ресурс (например, новый пользователь) к другому другому родительскому ресурсу (http://example.com/users). Ваш пост на этот родительский ресурс, идентифицированный по URL, и сервер обрабатывает новый ресурс и связывает его с родителем.
Пост не является ни безопасным, ни идемпотентным. Это связано с тем, что изготовление двух или более идентичных запросов на почту, вероятно, приведет к созданию двух новых идентичных ресурсов.
Post Запросы отвечают с кодом состояния 201 (создан) вместе с заголовком местоположения со ссылкой на вновь созданный ресурс.
СТАВИТЬ
PUT используется для обновления ресурса, идентифицированного URL-адресом, используя информацию в корпусе запроса. Положите также можно использовать для создания нового ресурса. Поставьте запросы не считаются безопасными операциями, потому что они изменяют состояние на сервере. Тем не менее, это IDEmpotent, потому что несколько идентичных запросов на обновление ресурса должны иметь тот же эффект, что и первый.
Поставьте запросы отвечают кодом состояния 200 (ОК), если ресурс был успешно обновлен, и 404 (не найден), если ресурс не найден.
УДАЛИТЬ
Удалить используется для удаления ресурса, идентифицированного по URL. Удалить запросы IDEMPotent, потому что если вы удалите ресурс, он удаляется и даже если вы делаете несколько идентичных запросов удаления, результат одинаковый: удаленный ресурс.
Скорее всего, вы просто получите сообщение об ошибке об ошибке 404, если вы отправите запрос на удаление более одного раза для одного и того же ресурса, поскольку сервер не сможет найти его, как только он будет удален.
Удалить запросы отвечают с кодом состояния 200 (OK), если он успешно удален или 404 (не найден), если ресурс будет удален, не найден.
Все вышеперечисленные запросы возвращают 500 (внутреннюю ошибку сервера), если обработка не удалась и ошибки сервера.
Что в конце концов?
У меня есть последний срок, чтобы покрыть, прежде чем мы назовем это день: отдых.
Вы, возможно, слышали термин «спокойное применение» раньше. Важно понимать, что это значит, потому что, если вы используете HTTP для связи между клиентом и сервером, это выгодно следовать инструкциям для отдыха. (Фактически, глаголы HTTP, которые мы определены выше, представляют собой большинство того, какой отдых есть.)
Отдых означает «репрезентативный государственный перевод». Это стиль архитектуры для проектирования приложений.
Основная идея состоит в том, что вы используете «беззаботный», «клиент-сервер», «кешируемый» протокол для совершения звонков между машинами – и чаще всего этот протокол является http. Это просто модный способ сказать, что остальные дают вам набор ограничений для разработки приложения. Эти ограничения помогают сделать систему более исполнительными, масштабируемыми, простыми, модифицируемыми, видимыми, портативными и надежными.
Полный список ограничений длиннее, и вы можете прочитать больше об этом здесь Отказ Ради этого поста я хотел бы дважды щелкнуть два самых важных:
- Универсный интерфейс : Это ограничение говорит вам, как определить интерфейс между клиентом и сервером таким образом, чтобы упростить и определить архитектуру. Это говорит:
- Ресурсы должны быть идентифицированы в запросе (например, с использованием идентификаторов ресурсов в URI). Ресурс (например, данные в базе данных) – это данные, которые определяют представление ресурса (например, json, html). Ресурсы и представления ресурсов являются отдельными вещами – клиент взаимодействует только с представлением ресурсов.
- Клиенту должен иметь достаточно информации для манипулирования ресурсами на сервере, используя представление ресурса.
- Каждое сообщение обменено между клиентом и сервером, должно быть самоописательным, с информацией о том, как обработать сообщение.
- Клиенты должны отправлять данные состояния, используя содержимое HTTP Cody, заголовки HTTP-запроса, параметры запроса и URL. Серверы должны отправлять данные состояния, используя содержимое HTTP Code, коды ответов и заголовки ответов.
- Примечание. Глаголы HTTP, которые мы описали выше, составляют основную часть этого «равномерного интерфейса», поскольку они представляют собой однородные действия, которые случаются на ресурсах.
2. Безопасность : Это ограничение говорит, что все данные состояния, необходимые для обработки запроса клиента, должны содержаться в самом запросе (URL, параметры запроса, параметры HTTP или заголовки HTTP), и сервер должен отправлять все данные состояния, необходимые обратно клиенту через сам ответ (заголовки HTTP, код состояния и тело отклика HTTP).
Боковая заметка : Государство – или состояние приложения – это данные, необходимые для сервера для выполнения запроса.
Это означает, что для каждого запроса мы отправляем информацию о состоянии взад и вперед, чтобы сервер не должен поддерживать, обновлять и отправить состояние.
Наличие такой системы бездействия делает приложения в целом гораздо более масштабируемым, потому что ни один сервер не должен беспокоиться о том, чтобы поддерживать одно и то же состояние сеанса на протяжении нескольких запросов. Все необходимое для получения данных состояния доступна в самом запросе и ответа.
Закрытие замечаний
Фу! Http далеко не просто. Но, как видите, это критический компонент отношений клиента-сервера.
Занятие спокойных приложений требуется, по крайней мере, основное понимание http. С этим контентом под вашим ремнем вы хорошо вы можете расшифровать загадки клиент-серверной связи в вашем следующем проекте кодирования.