[记]Node与Express开发之Express请求和响应对象


在用 Express 构建 Web 服务器时,大部分工作都是从请求对象开始,到响应对象终止。这 两个对象起源于 Node,Express 对其进行了扩展。在深入探讨这两个对象之前,我们先了 解一点背景知识,看看客户端(通常是浏览器)是如何向服务器请求一个页面,以及页面 是如何返回的。
URL的组成部分
1. 协议
协议确定如何传输请求。我们主要是处理 http 和 https。其他常见的协议还有 file 和 ftp。
2. 主机名
主机名标识服务器。运行在本地计算机(localhost)和本地网络的服务器可以简单地表 示,比如用一个单词,或一个数字 IP 地址。在 Internet 环境下,主机名通常以一个顶 级域名(TLD)结尾,比如 .com 或 .net。另外,也许还会有子域名作为主机名的前缀。子域名可以是任何形式的,其中 www 最为常见。子域名通常是可选的。
3. 端口
每一台服务器都有一系列端口号。一些端口号比较“特殊”,如 80 和 443 端口。如果 省略端口值,那么默认 80 端口负责 HTTP 传输,443 端口负责 HTTPS 传输。如果不使 用 80 和 443 端口,就需要一个大于 10231 的端口号。通常使用容易记忆的端口号,如 3000、8080 或 8088。
4. 路径
URL 中影响应用程序的第一个组成部分通常是路径(在考虑协议、主机名和端口的基础上做决定很合理,但是不够好)。路径是应用中的页面或其他资源的唯一标识。
5. 查询字符串
查询字符串是一种键值对集合,是可选的。它以问号(?)开头,键值对则以与号(&) 分隔开。所有的名称和值都必须是 URL 编码的。对此,JavaScript 提供了一个嵌入式的 函数 encodeURIComponent 来处理。例如,空格被加号(+)替换。其他特殊字符被数字 型字符替换。
6. 信息片段
信息片段(或散列)被严格限制在浏览器中使用,不会传递到服务器。用它控制单页应 用或 AJAX 富应用越来越普遍。最初,信息片段只是用来让浏览器展现文档中通过锚点 标记(<a id="chapter06">)指定的部分。
HTTP请求方法
HTTP 协议确定了客户端与服务器通信的请求方法集合(通常称为 HTTP verbs)。很显然,GET 和 POST 最为常见。(更多参见: HTTP请求方法详解 )
在这里简单说下GET方法和POST方法的区别:
1. GET方法用于信息获取,它是安全的(安全:指非修改信息,如数据库方面的信息),而POST方法是用于修改服务器上资源的请求;
2. GET请求的数据会附在URL之后,而POST方法提交的数据则放置在HTTP报文实体的主体里,所以POST方法的安全性比GET方法要高;
3. GET方法传输的数据量一般限制在2KB,其原因在于:GET是通过URL提交数据,而URL本身对于数据没有限制,但是不同的浏览器对于URL是有限制的,比如IE浏览器对于URL的限制为2KB,而Chrome,FireFox浏览器理论上对于URL是没有限制的,它真正的限制取决于操作系统本身;POST方法对于数据大小是无限制的,真正影响到数据大小的是服务器处理程序的能力。
4. GET请求能够被缓存,会保存在浏览器的浏览记录中,且以GET请求的URL能够保存为浏览器书签,POST与之相反。
对于一个网站来说,大部分页面都响应 GET 请求。POST 请求通常用来提交信息到服务器后 台(例如表单处理)。服务器将请求中包含的所有信息(例如表单)处理完成之后,用以 响应的 HTML 通常与相应的 GET 请求是一样的。与服务器通信时,浏览器只使用 GET 和 POST 方法(如果没有使用 AJAX)。
另一方面,网络服务通常会使用更多的创造性 HTTP 方法。例如,一个 HTTP 方法被命名 为 DELETE,它就用来接受 API 指令执行删除功能。
使用 Node 和 Express,可以完全掌控响应方法(尽管一些更复杂的方法支持得不是很好)。在 Express 中,通常要针对特殊方法编写处理程序。
请求对象
请求对象的生命周期始于 Node 的一个核心对象 http.IncomingMessage 的实例。Express 添加了一些 附加功能。我们来看看请求对象中最有用的属性和方法(除了来自 Node 的 req.headers(从客户端接收到的请求报头) 和 req.url(请求的地址),所有这些方法都由 Express 添加)。
req.params
params方法用于从express路由器获取参数,示例如下:
app.get('/find/:id', function(req,res){
console.log(req.params.id);
res.send(req.params.id);
})
然后在浏览器访问 http:// localhost:3000/find/1 ,即可以看到控制台输出了1,同时界面上也显示1.
如果有多个参数,可以这样设置:
/find/:group/:name
,示例:
app.get('/find/:group/:name', function(req, res) {
console.log(req.params.group+" "+req.params.name);
res.send(req.params.group+" "+req.params.name);
})
在浏览器访问: http:// localhost:3000/find/a/b
req.query
一个对象,包含以键值对存放的查询字符串参数,即获取 ? 后的查询参数,示例如下:
app.get('/search', function(req, res){
console.log(req.query.id); // 1
console.log(req.query); // { id: '1', name: 'a' }