Обратите внимание, что вопрос был изменен / уточнен с тех пор, как этот ответ был впервые написан. Дальнейший ответ на последнюю итерацию вопроса - после второго горизонтального правила
Зачем нужны такие методы, как GET и POST в протоколе HTTP?
Они, наряду с некоторыми другими вещами, такими как форматы заголовков, правила разделения заголовков и тел, составляют основу протокола HTTP.
Разве мы не можем реализовать протокол HTTP, используя только тело запроса и тело ответа?
Нет, потому что тогда все, что вы создали, не будет протоколом HTTP
Например, URL будет содержать запрос, который будет отображаться на функцию в зависимости от языка программирования на стороне сервера, скажем, сервлета, и в ответ будет отправлен ответ HTML и JavaScript.
Поздравляю, вы только что изобрели новый протокол! Теперь, если вы хотите создать стандартную организацию для управления и поддержки, разработки и т. Д., Он может обогнать HTTP однажды
Я ценю, что это немного ненормально, но нет ничего волшебного в Интернете, TCP / IP или связи между серверами и клиентами. Вы открываете соединение и отправляете несколько слов по проводам, образуя разговор. Разговор действительно должен придерживаться некоторой утвержденной спецификации на обоих концах, если запросы должны быть поняты и разумные ответы доставлены. Это ничем не отличается от любого диалога в мире. Вы говорите по-английски, ваш сосед говорит по-китайски. Надеюсь, что ваших махов, указаний и дрожания кулака будет достаточно, чтобы передать ваше сообщение о том, что вы не хотите, чтобы он парковал свою машину перед вашим домом.
Вернитесь в Интернет, если вы откроете сокет для веб-сервера, совместимого с HTTP, и отправите следующее:
EHLO
AUTH LOGIN
(Начало передачи электронной почты SMTP), тогда вы не получите разумного ответа. Вы можете создать самый совершенный SMTP-совместимый клиент, но ваш веб-сервер не будет разговаривать с ним, потому что этот разговор посвящен общему протоколу - никакого общего протокола, никакой радости.
Вот почему вы не можете реализовать протокол HTTP без реализации протокола HTTP; если то, что вы пишете, не соответствует протоколу, то это просто не протокол - это что-то другое, и оно не будет работать так, как указано в протоколе
Если мы поработаем с вашим примером на мгновение; где клиент подключается и просто сообщает что-то, похожее на URL-адрес .. И сервер понимает это и просто отправляет что-то, похожее на HTML / JS (веб-страницу), тогда, конечно, это может сработать. Что ты сохранил, хотя? Пару байтов, не говоря GET? Еще немного о том, чтобы избавиться от этих надоедливых заголовков. Сервер тоже кое-что сохранил - но что, если вы не можете понять, что он вам послал? Что делать, если вы запросили URL-адрес, оканчивающийся на JPEG, и он отправил вам несколько байтов, которые составляют изображение, но оно в формате PNG? Неполный PNG в этом. Если бы у нас был заголовок, в котором говорилось, сколько это было байтов собираетсячтобы отправить, тогда мы бы знали, было ли количество байтов, которые мы получили, на самом деле весь файл или нет. Что, если сервер сжал ответ, чтобы сэкономить пропускную способность, но не сказал вам? Вы собираетесь потратить значительные вычислительные мощности, пытаясь понять, что он послал.
В конце концов, нам нужна метаинформация - информация об информации; нам нужны заголовки; нам нужны файлы с именами, расширениями, датами создания. Нам нужны люди, чтобы у нас были дни рождения, чтобы сказать «пожалуйста», «спасибо» и т. Д. - мир полон протоколов и битов информации о контексте, поэтому нам не нужно все время работать с нуля. Это стоит немного места для хранения, но оно того стоит
Реализация различных методов HTTP действительно необходима?
Можно утверждать, что не нужно реализовывать весь указанный протокол, и это обычно верно для чего-либо. Я не знаю каждое слово на английском языке; мой китайский сосед также является разработчиком программного обеспечения, но в другой отрасли, и он даже не знает китайского языка для некоторых терминов, используемых в моей отрасли, не говоря уже об английском языке. Хорошая вещь заключается в том, что мы можем забрать документ о реализации HTTP, он может написать сервер, а я могу написать клиент на разных языках программирования на разных архитектурах, и они все еще работают, потому что придерживаются протокола
Вполне может случиться так, что ни один из ваших пользователей никогда не выдаст ничего, кроме запроса GET, не будет использовать постоянные соединения, отправлять что-либо, кроме JSON в качестве основного текста, или будет нуждаться в принятии чего-либо, кроме text / plain, чтобы вы могли написать действительно урезанный веб-сервер, который отвечает только очень ограниченным требованиям клиентского браузера. Но вы не могли просто произвольно решить покончить с основными правилами, которые делают «некоторый текст, передаваемый по сокету», что такое HTTP; Вы не можете отказаться от базового представления о том, что запрос будет выглядеть следующим образом:
VERB URL VERSION
header: value
maybe_body
И ответ будет иметь версию, код состояния и, возможно, заголовки. Если вы измените что-либо из этого - это больше не HTTP - это что-то другое, и будет работать только с тем, что предназначено для его понимания. По этим определениям HTTP является тем, чем он является, поэтому, если вы хотите реализовать его, вы должны следовать определениям
Обновить
Ваш вопрос немного развился, вот несколько ответов на то, что вы спрашиваете:
Почему протокол HTTP имеет понятие методов?
Исторически сложилось так, что вы должны понимать, что вещи были гораздо более негибкими в своем дизайне и реализации, даже в том случае, если не было сценариев и даже идея, что страницы могут быть динамическими, генерироваться на лету в памяти и вместо этого выталкивать сокет. быть статическим файлом на диске, который был запрошен клиентом, прочитан и помещен в сокет, не существует. Так как очень ранняя сеть была основана на понятии статических страниц, содержащих ссылки на другие страницы, все страницы на диске существовали, и навигация выполнялась бы терминалом, который в основном делал запросы GET для страниц по URL-адресам, сервер мог бы отображать URL-адрес файла на диске и отправить его. Было также мнение, что сеть документов, которые связаны друг с другом и прочим в другом месте, должна развиваться,
Это дает некоторый исторический контекст для методов - когда-то URL был негибким битом и упрощенно ссылался на страницы на диске, поэтому метод был полезен, потому что он позволял клиенту описывать, какое намерение он имел для файла, и сервер будет обработать метод каким-то другим способом. На самом деле не было понятия, что URL-адреса являются виртуальными или используются для переключения или отображения в первоначальном видении гипертекстовой (и на самом деле это был только текст) сети.
Я не собираюсь, чтобы этот ответ представлял собой документацию исторического отчета с датами и цитируемыми ссылками того, когда именно вещи начали меняться - для этого вы, вероятно, можете прочитать Википедию - но достаточно сказать, что со временем желание Сеть будет более набирающей обороты, и на каждом конце соединения сервер-клиент расширяются возможности для создания богатого мультимедийного опыта. Браузеры поддерживали огромное количество тегов для форматирования контента, каждый из которых боролся за реализацию необходимых мультимедийных функций и новых способов придания вещам привлекательного вида.
На стороне клиента появились сценарии, плагины и расширения для браузера, и все они были нацелены на то, чтобы превратить браузер в мощный инструмент всего. На стороне сервера активная генерация контента на основе алгоритмов или данных базы данных была большим толчком, и она продолжает развиваться до такой степени, что на диске, вероятно, больше нет файлов - конечно, мы сохраняем файл изображения или сценария в виде файла на веб-сервер и браузер ПОЛУЧИТЕ его, но все чаще изображения, которые показывает браузер, и скрипты, которые он запускает, - это не файлы, которые вы можете открыть в проводнике, это генерируемый контент, который является результатом некоторого процесса компиляции, выполняемого по требованию , SVG, который описывает, как рисовать пиксели, а не растровый массив пикселей, или JavaScript, созданный из сценариев более высокого уровня, таких как TypeScript
При создании современных мульти-мегабайтных страниц, вероятно, только часть из них теперь является фиксированным содержимым на диске; Данные базы данных отформатированы и преобразованы в html, который будет использовать браузер, и это делается сервером в ответ на несколько различных программных программ, на которые ссылается каким-либо образом URL
Я упомянул в комментариях к вопросу, что это немного похоже на полный круг. В те времена, когда компьютеры стоили сотни тысяч заполненных комнат, было обычным делом разрешать нескольким пользователям использовать один сверхмощный центральный мэйнфрейм с помощью сотен тупых терминалов - клавиатуры и мыши, зеленого экрана, отправлять текст, получать некоторые текст Со временем, когда вычислительная мощность возросла, а цены упали, люди стали в конечном итоге иметь настольные компьютеры, более мощные, чем ранние мэйнфреймы, и возможность локально запускать мощные приложения, поэтому модель мэйнфреймов устарела. Однако он никогда не исчезал, потому что вещи просто эволюционировали, чтобы перейти в другую сторону и несколько вернуться к центральному серверу, обеспечивающему большую часть полезных функций приложения, и сотне клиентских компьютеров, которые делают очень мало, кроме рисования на экране, и отправлять и получать данные на / с сервера. Этот промежуточный период, когда ваш компьютер был достаточно умен, чтобы одновременно запускать собственную копию слова и мировоззрения, снова уступил место онлайн-офису, где ваш браузер - это устройство для рисования изображений на экране и редактирования документа / электронной почты, которую вы получаете ». Вы пишете как то, что живет на сервере, сохраняется там, отправляется и передается другим пользователям, как представление о том, что браузер - это просто оболочка, которая обеспечивает частичное представление в любой момент этой вещи, которая живет в другом месте.
Из ответов я получаю некоторое представление о том, почему существует понятие методов. Это приводит к другому связанному вопросу:
Например, в gmail compose link будут отправлены запрос PUT / POST и данные. Как браузер узнает, какой метод использовать?
Он использует GET по умолчанию, по соглашению / спецификации, так как это то, что указывается, должно произойти, когда вы набираете URL и нажимаете return
Включает ли страница gmail, отправляемая сервером, имя метода, используемого при вызове gmail, составляет запрос?
Это одна из ключевых вещей, на которые я намекаю в комментариях выше. В современном Интернете речь идет даже не о страницах. Когда страницы были файлами на диске, браузер получал их. Затем они стали страницами, которые в основном создавались динамически путем размещения данных в шаблоне. Но он все еще включал процесс «запросить новую страницу с сервера, получить страницу, показать страницу». Обмен страниц стал действительно гладким; вы не видели, как они загружали, изменяли размеры и дергали свой макет, чтобы он выглядел более плавным, но браузер по-прежнему заменял одну целую страницу или часть страницы другой
Современный способ сделать это с помощью одностраничного приложения; в браузере есть документ, который отображается в памяти определенным образом, он вызывает сценарии, обращаясь к thebservr, и возвращает некоторый кусок информации обратно, а также манипулирует документом, так что часть страницы изменяется визуально, отображая новую информацию - все работает без браузер всегда загружает другую новую страницу; это просто стало пользовательским интерфейсом, где его части обновляются как обычное клиентское приложение, такое как word или outlook. Новые элементы появляются поверх других элементов и могут перетаскиваться вокруг имитирующих диалоговых окон и т. Д. Все это - механизм сценариев браузера, отправляющий запросы с использованием любого http-метода, который хочет разработчик, получающий данные обратно и выскакивающий из документа, который рисует браузер. Вы можете представить, что современный браузер - это блестящее устройство, похожее на целую операционную систему или виртуальный компьютер; программируемое устройство, которое имеет довольно стандартизированный способ рисования объектов на экране, воспроизведения звука, захвата пользовательского ввода и отправки его на обработку. Все, что вам нужно сделать, чтобы нарисовать ваш пользовательский интерфейс, это предоставить ему html / css, который делает пользовательский интерфейс, а затем постоянно настраивать html, чтобы браузер изменил то, что рисует. Черт, люди так привыкли видеть изменение адресной строки / использовать ее как направление намерений, что одностраничное приложение будет программно изменять URL-адрес, даже если не выполняется навигация (запрашивающая новые страницы) Все, что вам нужно сделать, чтобы нарисовать ваш пользовательский интерфейс, это предоставить ему html / css, который делает пользовательский интерфейс, а затем постоянно настраивать html, чтобы браузер изменил то, что рисует. Черт, люди так привыкли видеть изменение адресной строки / использовать ее как направление намерений, что одностраничное приложение будет программно изменять URL-адрес, даже если не выполняется навигация (запрашивающая новые страницы) Все, что вам нужно сделать, чтобы нарисовать ваш пользовательский интерфейс, это предоставить ему html / css, который делает пользовательский интерфейс, а затем постоянно настраивать html, чтобы браузер изменил то, что рисует. Черт, люди так привыкли видеть изменение адресной строки / использовать ее как направление намерений, что одностраничное приложение будет программно изменять URL-адрес, даже если не выполняется навигация (запрашивающая новые страницы)
когда мы вызываем www.gmail.com, он должен использовать метод GET, как браузер узнает, что этот метод использовать?
Правда. Потому что это указано. Первый запрос, как это исторически всегда было - ПОЛУЧИТЕ какой-то начальный html, чтобы нарисовать пользовательский интерфейс, затем либо ткните и манипулируйте им навсегда, либо получите другую страницу с другим скриптом, который тыкает, манипулирует и создает отзывчивый реактивный пользовательский интерфейс.
Как говорят некоторые ответы, мы можем создавать новых пользователей с помощью метода DELETE, а затем возникает вопрос о том, что стоит за понятием методов в протоколе http, потому что в конечном итоге это полностью зависит от серверов, на какую функцию они хотят сопоставить URL-адрес. , Почему клиент должен указывать серверам, какие методы использовать для URL.
История. Наследие. Мы можем теоретически отказаться от всех методов http завтра - мы на уровне сложности программирования, где методы устарели, поскольку URL-адреса могут обрабатываться до такой степени, что они могут быть механизмом переключения, который указывает серверу, что вы хотите сохранить данные в тело как черновик электронной почты, или удалите черновик - на сервере нет файла / emails / draft / save / 1234 - сервер запрограммирован так, чтобы разделить этот URL и знать, что делать с данными тела - сохранить это как черновик письма под id 1234
Так что, безусловно, можно покончить с методами, за исключением огромного веса устаревшей совместимости, которая выросла вокруг них. Лучше просто использовать их для того, что вам нужно, но в значительной степени игнорировать их, а вместо этого использовать все, что вам нужно, чтобы ваша вещь работала. Нам все еще нужны методы как таковые, потому что вы должны помнить, что они что-то значат для браузера и сервера, на котором мы создавали наши приложения. Сценарий на стороне клиента хочет использовать базовый браузер для отправки данных, он должен использовать метод, который заставит браузер делать то, что он запрашивает - вероятно, POST, потому что GET упаковывает всю свою переменную информацию в URL и имеет ограничение по длине на многих серверах. Клиент хочет получить длинный ответ от сервера - не используйте HEAD, потому что у него вообще не должно быть тел ответа.