Когда кто-то спрашивает вас о протоколе http, что вы хотите спросить?

внешний интерфейс сервер HTTP TCP/IP

Эта статья представляет собой резюме после прочтения «Иллюстрированного HTTP», которое может быть очень длинным. PS: Эта книга проста для понимания и подходит для чтения интерфейсными инженерами.Это очень хорошая вводная книга по HTTP.

Когда вы читаете эту статью, я предполагаю, что вы немного понимаете, что такое http (протокол передачи гипертекста), url (унифицированный указатель ресурсов), общие коды состояния и т. д. Конечно, это то, с чем мы сталкиваемся каждый день на работе.АЯКС/Интерфейс/APIЧто за этим стоит, так часто спрашивают во время интервьюЧто именно происходит, когда браузер вводит URL-адрес страницы, отображаемой пользователю? Вы знаете http?(Вопросы для интервью) Конечно, в Интернете есть много статей, знакомящих с http, и они более подробные и качественные, чем я, поэтому эта статья будет сочетатьnode httpМодуль в сочетании с описанием кода http для углубления впечатления.

http — это часть семейства протоколов TCP/IP, TCP/IP не буду вдаваться в подробности (в основном я не знаю), короче говоря, http — это часть прикладного уровня TCP/IP, который также включает в себя FTP, DNS протоколы и т. д., прочее Три части: транспортный уровень, сетевой уровень, канальный уровень выходят за рамки обсуждения http. Просто нужно знать, что запрос, отправленный клиентом, будет заключен в один уровень протокола HTTP, один уровень протокола TCP, один уровень протокола IP и один уровень Ethernet, что аналогично экспресс-отправке. называетсяупаковка, после того как пакет готов, он отправляется в путь (передается через физический уровень), а когда доходит до сервера, начинает распаковывать экспресс, снаружи внутрь. В этом процессе никто не может абсолютно понять, надежны ли данные, поэтому необходимо пройтиТрехстороннее рукопожатие TCP(вопросы интервью)

Флаг TCP (флаг) — SYN (синхронизировать) и ACK (подтверждение) используется в процессе рукопожатия. Отправитель сначала отправляет пакет данных с флагом SYN другой стороне. После того, как принимающая сторона получает его, она отправляет обратно пакет данных с флагом SYN/ACK для передачи подтверждающей информации. Наконец, отправитель отправляет обратно пакет данных с флагом ACK, что означает окончание «рукопожатия». Если на каком-то этапе процесс рукопожатия прерывается по необъяснимым причинам, протокол TCP снова отправит те же пакеты в том же порядке.

Подвести итог:

  • Клиент — отправить пакет с флагом SYN — одно рукопожатие — сервер
  • Сервер - Отправка пакета с флагом SYN/ACK - Двустороннее рукопожатие - Клиент
  • Клиент — отправить пакет с флагом ACK — трехстороннее рукопожатие — сервер

Без лишних слов, давайте использовать егоnode/v8.9.3Создайте сервер. Давайте пошагово, в этом процессе могут быть подводные камни, больше подходят поисковые системы и официальные документы.

// 引入 http 模块
const http = require('http')
class Server {
constructor() {
}

start() {
const serve = http.createServer((req, res) => {
res.end('我的第一个服务器')
})
serve.listen(3000, '127.0.0.1',() => {
console.log('我在 http://127.0.0.1:3000 启动了')
})
}
}
// 启动服务器
app = new Server()
app.start()

/** 两行代码版
* const http = require('http')
* http.createServer((req, res) => {
* res.end('我的第一个服务器')
* })
* .listen(3000)
*/

мы запускаем этот сервер

node server.js

Открытьhttp://127.0.0.1:3000С нетерпением жду этого, как только вы его откроете, fxxk! Китайцы перепутали! Если вы мудры, вы сразу же думаете о формате кодирования.nodeНе поддерживается изначальноGBKформат, но он поддерживаетсяUTF-8из. Конечно, давайте сначала поговорим об этой проблеме кодирования, и мы собираемся обсудить ее сейчас.http.createServerДва параметра полученной функции обратного вызоваrequest、response, объект запроса и объект ответа. В процессе отладки интерфейса наблюдаем консоль браузераnetworkДалее вы увидите общедоступные заголовки запроса, заголовки ответа и заголовки запроса. Заголовок запроса или заголовок запроса, браузер проделал за нас большую работу, он содержит важную информацию для запроса интерфейса, такую ​​как formData, query и т.д., аналогично нашему примеру:

GET / HTTP/1.1
Host: 127.0.0.1:3000
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: _ga=GA1.1.937303312.1517920872; hibext_instdsigdipv2=1; _gid=GA1.1.34943646.1521164839

Общедоступный заголовок предоставляется браузером для удобства просмотра.Как правило, это URL-адрес запроса, метод запроса, код состояния и другие сообщения, тогда как заголовок ответа или заголовок ответного сообщения будет иметь ряд важных полей заголовка. Общие из них следующие:

HTTP/1.1 200 OK
Content-Type: text/plain;charset=UTF-8
Date: Sat, 17 Mar 2018 02:48:41 GMT
Connection: keep-alive
Content-Length: 24

Сообщение заголовка ответа расскажет нам, какая версия протокола используется, статус и сообщение «ок», об этом говорить не нужно.

Давайте начнем сзаголовок ответаДля начала, это основная часть нашего интерфейса отладки. нашел полеContent-Type, вы сразу подумали, что это может решить проблему искажения нашего сервера. Используя наш текущий сервер напрямую, возвращаемый заголовок ответа:Нет типа содержимогоэтого поля. И наша функция обратного вызова получилаresponseЭтот объект означает, что мы можем напрямую изменить заголовок ответа, чтобы вернуть то, что мы хотим. мы вres.end()Добавьте такое поле ответа раньше.

res.setHeader('Content-Type', 'text/plain;charset=UTF-8')

Смысл этого поля в том, чтобы сообщить браузеру, как анализировать возвращаемый результат. Этот способ называетсяТип многоцелевых расширений почты Интернета (MIME).
Мы отправляем в почтовый запросdataтакже использоватьContent-Type. Например, при использовании axios загрузку данных с помощью post необходимо изменить в соответствии с внутренним интерфейсом.headersсерединаContent-Type.Формат данных axios по умолчанию:Request Payload, является объектом JSON; некоторые интерфейсы поддерживают толькоFormData, вам нужно изменить наContent-Type:application/x-www-form-urlencodedи используйте модуль qs для форматирования данныхqs.stringify(data), чтобы он стал форматом k1=v1&ke2=v2&k3=v3 formData; иногда при загрузке разных типов данных заголовок запросаContent-Type: multipart/form-data, то есть эффект традиционной отправки формы такой же.

Обычно используемые типы MIME:

mimeTypes = {
'css': 'text/css',
'gif': 'image/gif',
'html': 'text/html',
'ico': 'image/jpeg',
'jpeg': 'image/jpeg',
'jpg': 'image/jpeg',
'js': 'application/javascript;charset=UTF-8',
'pdf': 'application/pdf',
'png': 'image/png',
'svg': 'image/svg+xml',
'swf': 'application/x-shockwave-flash',
'tiff': 'image/tiff',
'txt': 'text/plain;charset=UTF-8',
'wav': 'audio/x-wav',
'wma': 'audio/x-ms-wma',
'wmv': 'video/x-ms-wmv',
'xml': 'text/xml'
}

Кстати говоря, давайте разберемся с содержанием статьи:

  • HTTP является частью семейства протоколов TCP/IP на его прикладном уровне и наиболее часто используемым протоколом передачи: трехстороннее рукопожатие TCP.
  • Наиболее важной частью http является сообщение запроса (запрос), ответное сообщение (ответ), заголовок сообщения заголовок ответа содержит много информации и имеет свои уникальные левые и правые.
  • MIME и Content-type.
  • Дополнительно: узел запускает сервер; axios, меры предосторожности при отправке запроса, изменение заголовка запросаContent-Type,qsФорматы модуля представляют данные.

HTTP правильно переводится как протокол передачи гипертекста; теперь его обычно называют протоколом передачи гипертекста.
HTML — это язык гипертекстовой разметки

продолжение следует

Добро пожаловать вGitHubОставьте мне сообщение, учитесь вместе и прогрессируйте вместе.