如何生成HTTP响应

时间:2017-03-11 21:48:52

标签: node.js http express

我对编程很新,这个问题是关于确保我正确地获得HTTP协议。我的问题是,当我阅读有关HTTP请求/响应时,它看起来需要采用非常特定的格式,其中包含状态代码,HTTP版本号,标题,空格后跟正文。

然而,在用nodejs / express创建一个web应用程序后,我从来没有必要实际编写以这种格式发出HTTP响应的代码(我假设,虽然我不确定其他框架如ruby在rails或python / Django上是一样的)。在快递应用程序中,我只是设置路由处理程序,以便在向该路由发出请求时呈现相应的页面。

这是因为express实际上是在幕后将响应放在正确的HTTP格式中吗?换句话说,如果我查看expressJS代码,那么该代码中是否会出现以HTTP格式实际生成HTTP响应的内容?

我的困惑在于,似乎HTTP请求/响应格式非常重要,但不知怎的,我从来没有为节点/快速应用程序编写处理它的任何代码。也许这就是像express这样的框架的全部内容......去掉细节,以便开发人员可以处理业务逻辑。如果这是正确的,那么有没有人在没有框架的情况下编写Web应用程序来执行此操作。那么您是否有责任编写将服务器响应置于确切HTTP格式的代码?

2 个答案:

答案 0 :(得分:0)

  

这是因为快递实际上是把响应放在了   幕后正确的HTTP格式?

是的,确切地说,HTTP无处不在,几乎所有编程语言/框架都在后台处理HTTP的实际编写和解析。

  

有没有人在没有框架的情况下编写Web应用程序来执行此操作。将   然后你负责编写放置服务器的代码   回复到确切的HTTP格式?

从不(除非您编写的代码需要对HTTP代码进行非常低级别的调整)

答案 1 :(得分:0)

  

我对编程很新,这个问题是关于确保我正确地获得HTTP协议。我的问题是,当我阅读有关HTTP请求/响应时,看起来它需要采用非常特定的格式,其中包含状态代码,HTTP版本号,标题,空格后跟正文。

只是为了给你一个想法,可能有数百个规范与HTTP协议有关。它们不仅处理协议本身,还处理您发送的所有内容的数据格式/编码,包括标题和您可以发送的所有各种内容类型,身份验证方案,缓存,状态代码,URL解码等等。通过查看此处可以看到一些涉及的规范:https://www.w3.org/Protocols/

现在一个简单的请求和一个简单的文本响应只能知道其中一些规范,但生活并不总是那么简单。

  

这是因为express实际上是在幕后将响应放在正确的HTTP格式中吗?换句话说,如果我查看了expressJS代码,该代码中是否会出现以HTTP格式实际生成HTTP响应的内容?

是的,会的。 Express和内置于node.js中的HTTP library的组合可以为您处理规范的所有细节。这是使用库/框架的优势。他们甚至处理不同版本的协议,来自数千名其他开发人员的反馈帮助他们清理边缘案例错误。一个好的库/框架允许您仍然控制有关响应的任何细节(标题,内容类型,状态代码等),而不必让您完成实际创建确切响应的详细工作。这是一件好事。它可以让你更快地编写代码,让你骑在已经找出与你的应用逻辑无关的细节细节的其他人的肩膀上。

事实上,人们可以对HTTP协议下的TCP协议说同样的话。没有常规应用程序开发人员想要编写自己的TCP堆栈。相反,您只需要一个可以使用的工作TCP堆栈,它已经为您调整和调试过。

  

然而,在用nodejs / express创建一个web应用程序后,我从来没有必要实际编写以这种格式发出HTTP响应的代码(我假设,虽然我不确定其他框架如ruby在rails或python / Django上是一样的)。在快递应用程序中,我只是设置了路径处理程序,以便在向该路径发出请求时呈现相应的页面。

是的,这是件好事。该框架为您完成了详细的工作。您只需致电res.setHeader()res.status()res.cookie()res.send()res.json()等等,Express就会为您做出全部回复。

  

如果这是正确的,那么有没有人在没有框架的情况下编写Web应用程序来执行此操作。那么您是否有责任编写将服务器响应置于确切HTTP格式的代码?

如果您没有使用任何类型的框架或库并且在原始TCP级别进行编程,那么您将负责HTTP协议的所有细节。但是,除了图书馆开发人员以外,几乎没有任何人这样做,因为坦白说这只是浪费时间。每个平台都至少有一个开源库,即使你正在开发一个全新的平台,你也可以获得一个开源的代码体,并将它移植到你的平台上,比写下这一切要快得多。你自己。

请记住,node.js的巨大优势之一就是有大量的开源代码(主要是在NPM和Github中)已经预先打包以与node.js一起使用。并且,因为node.js是服务器端,代码内存通常不紧,代码只是来自服务器初始化时的本地硬盘,所以抓住一个可以满足你需要的工作和测试包的方法有点不利,即使您只使用包中5%的功能。或者,最糟糕的情况是,克隆现有存储库并对其进行修改以完全满足您的需求。