设置 http headers 并设置适当的状态代码的目的是什么?

What's the purpose of setting http headers and setting appropriate status codes?

我理解 headers 用于在客户端和服务器之间传递附加信息。我最近在node中开发了一个小web-app用于学习并且没有手动更新headers中的任何响应状态代码。

对于任何获取请求,我只需发回适当的响应文件,可以是 ejs 或 html 文件,而无需更新 headers。好吧,该应用程序运行良好,但现在我看到许多其他代码,其中 headers 在发送响应之前已更新。

例如,res.writeHead(200, {'Content-Type': 'text/html'});

它对谁有帮助?是为了调试吗?我缺少什么大图?

让我们从从 MDN:

借用的 http 响应示例开始
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html

<!DOCTYPE html... (here come the 29769 bytes of the requested web page)

在此 HTTP 响应中,包含三个部分。第一行为您提供协议和状态。下一行(直到空行)是 header。然后,跟随(可选)内容本身。

状态是 HTTP 响应的必需部分,因为它随每个响应一起发送,并通知接收者这是包含内容 (200) 的正常响应、重定向 (3xx) 还是错误(4xx 或 5xx) .在nodejs中,状态一般会默认为200,所以如果你不设置,它会自动设置为200。

Http headers 被收件人用于各种事情。它们的用途取决于您所谈论的header。这里有几个例子:

Content-Type - 告诉收件人响应的 body 中的内容类型。如果他们不知道内容的类型,那么他们必须猜测并尝试弄清楚,这远不如告诉他们内容是 text/plain 还是 application/jsontext/htmlimage/jpeg, 等等...

Content-Length - 告诉收件人内容的长度(以字节为单位)。当内容的格式本身不能告诉收件人响应的结尾在哪里时,这是必需的。

Transfer-Encoding - 告诉接收者如何对响应的 body 进行编码以进行传输(例如 gzip)。

Cache-Control - 向收件人提供有关此响应可以缓存多长时间的信息。

Set-Cookie - 向收件人发送一个 cookie 供客户端保存,并在以后的请求中发送回此来源。

Location - 带有 3xx 状态的 URI,指示客户端应重定向到的位置。

这些只是几个例子。可能有数千种可能的 header,每种都有自己的用途。

Whom does it help?

接收 http 响应的代码使用它来了解如何解释它。

Is it for debugging?

这不是它的主要目的,但在调试问题时,您可以查看详细的 header 以查看它们是否是您期望的那样。例如,如果 req.body 在 Express 中为空,而您希望它被填充,您将查看 content-type 以查看它是否符合您的预期并与您安装的中间件相匹配读取并解析并放入 req.body,因为如果 content-type 不是您所期望的,那么您接收此响应的代码将无法正确配置以处理它。

What's the big picture I am missing?

Headers 是元数据,用于描述响应中的内容并为收件人提供了解如何正确阅读响应所需的信息。