在用 Express 构建 Web 服务器时,大部分工作都是从请求对象开始,到响应对象终止。

url的组成:

协议
协议确定如何传输请求。我们主要是处理 http 和 https。其他常见的协议还有 file 和 ftp。
主机名
主机名标识服务器。运行在本地计算机(localhost)和本地网络的服务器可以简单地表示,比如用一个单词,或一个数字 IP 地址。在 Internet 环境下,主机名通常以一个顶级域名(TLD)结尾,比如 .com 或 .net。另外,也许还会有子域名作为主机名的前缀。请求和响应对象子域名可以是任何形式的,其中 www 最为常见。子域名通常是可选的。
端口
每一台服务器都有一系列端口号。一些端口号比较“特殊”,如 80 和 443 端口。如果省略端口值,那么默认 80 端口负责 HTTP 传输,443 端口负责 HTTPS 传输。如果不使用 80 和 443 端口,就需要一个大于 10231的端口号。通常使用容易记忆的端口号,如3000、8080 或 8088。
路径
URL 中影响应用程序的第一个组成部分通常是路径(在考虑协议、主机名和端口的基础上做决定很合理,但是不够好)。路径是应用中的页面或其他资源的唯一标识。
查询字符串
查询字符串是一种键值对集合,是可选的。它以问号(?)开头,键值对则以与号(&)分隔开。所有的名称和值都必须是 URL 编码的。对此,JavaScript 提供了一个嵌入式的函数 encodeURIComponent 来处理。例如,空格被加号(+)替换。其他特殊字符被数字型字符替换。
信息片段
信息片段(或散列)被严格限制在浏览器中使用,不会传递到服务器。用它控制单页应用或 AJAX 富应用越来越普遍。最初,信息片段只是用来让浏览器展现文档中通过锚点标记(<a id="chapter06">)指定的部分。

HTTP请求方法
HTTP 协议确定了客户端与服务器通信的请求方法集合(通常称为 HTTP verbs)。很显然,GET 和 POST 最为常见。在浏览器中键入一个 URL(或点击一个链接),服务器会接收到一个 HTTP GET 请求,其中的重要信息是 URL 路径和查询字符串。至于如何响应,则需要应用程序结合方法、路径和查询字符串来决定。对于一个网站来说,大部分页面都响应 GET 请求。POST 请求通常用来提交信息到服务器后台(例如表单处理)。服务器将请求中包含的所有信息(例如表单)处理完成之后,用以响应的 HTML 通常与相应的 GET 请求是一样的。与服务器通信时,浏览器只使用 GET 和POST 方法(如果没有使用 AJAX)。另一方面,网络服务通常会使用更多的创造性 HTTP 方法。例如,一个 HTTP 方法被命名注 1: 0~1023 端口为“知名端口”。为 DELETE,它就用来接受 API 指令执行删除功能。
使用 Node 和 Express,可以完全掌控响应方法(尽管一些更复杂的方法支持得不是很好)。在 Express 中,通常要针对特殊方法编写处理程序。

请求报头
我们浏览网页时,发送到服务器的并不只是 URL。当你访问一个网站时,浏览器会发送很多“隐形”信息。这里讨论的并不是个人信息泄露问题(浏览器被恶意软件侵染时会出现这个问题)。服务器会因此得知优先响应哪种语言的页面(例如,在西班牙下载 Chrome 浏览器,如果有西班牙语的版本,就会接收到一个西班牙语的访问页面)。它也会发送“用户代理”信息(浏览器、操作系统和硬件设备)和其他一些信息。所有能够确保你了解请求对象头文件属性的信息都将会作为请求报头发送。如果想查看浏览器发送的信息,可以创建一个非常简单的 Express 路由来展示一下:
app.get('/headers', function(req,res){
res.set('Content-Type','text/plain');
var s = '';
for(var name in req.headers) s += name + ': ' + req.headers[name] + '\n';
res.send(s);
});

响应报头
正如浏览器以请求报头的形式发送隐藏信息到服务器,当服务器响应时,同样会回传一些浏览器没必要渲染和显示的信息,通常是元数据和服务器信息。我们已经熟悉内容类型头信息,它告诉浏览器正在被传输的内容类型(网页、图片、样式表、客户端脚本等)。特别要注意的是,不管 URL 路径是什么,浏览器都根据内容类型报头处理信息。因此你可以通过一个叫作 /image.jpg 的路径提供网页,也可以通过一个叫作 /text.html 的路径提供图片。(这样做并不合情理,这里要讲的重点是路径是抽象的,浏览器只根据内容类型来决定内容该如何渲染。)除了内容类型之外,报头还会指出响应信息是否被压缩,以及使用的是哪种编码。响应报头还可以包含关于浏览器对资源缓存时长的提示。优化网站时需要着重考虑这一点。响应报头还经常会包含一些关于服务器的信息,一般会指出服务器的类型,有时甚至会包含操作系统的详细信息。返回服务器信息存在一个问题,那就是它会给黑客一个可乘之机,从而使站点陷入危险。非常重视安全的服务器经常忽略此信息,甚至提供虚假信息。禁用 Express 的 X-Powered-By 头信息很简单:
app.disable('x-powered-by');在浏览器的开发者工具中可以找到响应报头信息。例如,在 Chrome 浏览器中查看响应报
头信息的操作如下:
请求和响应对象 
(1) 打开控制台。
(2) 点击网络标签页。
(3) 重新载入页面。
(4) 在请求列表中选取网页(通常是第一个)。
(5) 点击报头标签页,你就可以看到所有响应报头信息了。

互联网媒体类型

内容类型报头信息极其重要,没有它,客户端很难判断如何渲染接收到的内容。内容类型报头就是一种互联网媒体类型,由一个类型、一个子类型以及可选的参数组成。例如,text/html;charset=UTF-8 说明类型是 text,子类型是 html,字符编码是 UTF-8。互联网编号分配机构维护了一个官方的互联网媒体类型清单http://www.iana.org/assignments/media-types/media-types.xhtml)。我们常见的 content type、Internet media type 和 MIME type 是可以互换的。MIME(多用途互联网邮件扩展)是互联网媒体类型的前身,它们大部分是相
同的。

请求体
除请求报头外,请求还有一个主体(就像作为实际内容返回的响应主体一样)。一般 GET请求没有主体内容,但 POST 请求是有的。POST 请求体最常见的媒体类型是 application/x-www-form-urlendcoded,是键值对集合的简单编码,用 & 分隔(基本上和查询字符串的格式一样)。如果 POST 请求需要支持文件上传,则媒体类型是 multipart/form-data,它是一种更为复杂的格式。最后是 AJAX 请求,它可以使用 application/json。

参数

“参数”这个词可以有很多种解释,它通常是困惑的源头。对于任何一个请求,参数可以来自查询字符串、会话、请求体或指定的路由参数。在 Node 应用中,请求对象的参数方法会重写所有的参数。因此我们最好不要深究。通常这会带来问题,一个参数在查询字符串中,另一个在 POST 请求体中或会话中,哪个会赢呢?这会产生让人抓狂的 bug。PHP 是产生这种混乱的主要原因:为了尽量“方便”,它将所有参数重新写入了一个称为 $_REQUEST 的变量,由于某种原因,人们曾认为这是个前所未有的好主意。我们将学习保存不同类型参数的专用属性,我认为这能够减少困惑。

请求对象
请求对象(通常传递到回调方法,这意味着你可以随意命名,通常命名为 req 或 request)的生命周期始于 Node 的一个核心对象 http.IncomingMessage 的实例。Express 添加了一些附加功能。我们来看看请求对象中最有用的属性和方法(除了来自 Node 的 req.headers 和req.url,所有这些方法都由 Express 添加)。
req.params
一个数组,包含命名过的路由参数。
req.param(name)
返回命名的路由参数,或者 GET 请求或 POST 请求参数。建议你忽略此方法。
req.query
一个对象,包含以键值对存放的查询字符串参数(通常称为 GET 请求参数)。
req.body
一个对象,包含 POST 请求参数。这样命名是因为 POST 请求参数在 REQUEST 正文中传递,而不像查询字符串在 URL 中传递。要使 req.body 可用,需要中间件能够解析请求正文内容类型
req.route
关于当前匹配路由的信息。主要用于路由调试。
req.cookies/req.singnedCookies•
一个对象,包含从客户端传递过来的 cookies 值。
从客户端接收到的请求报头。
req.accepts([types])
一个简便的方法,用来确定客户端是否接受一个或一组指定的类型(可选类型可以是单个的 MIME 类型,如 application/json、一个逗号分隔集合或是一个数组)。写公共API 的人对该方法很感兴趣。假定浏览器默认始终接受 HTML。
req.ip
客户端的 IP 地址。
req.path
请求路径(不包含协议、主机、端口或查询字符串)。
req.host
一个简便的方法,用来返回客户端所报告的主机名。这些信息可以伪造,所以不应该用于安全目的。
请求和响应对象 
req.xhr
一个简便属性,如果请求由 Ajax 发起将会返回 true。
req.protocol
用于标识请求的协议(http 或 https)

req.secure
一个简便属性,如果连接是安全的,将返回 true。等同于 req.protocol==='https'。
req.url/req.originalUrl
有点用词不当,这些属性返回了路径和查询字符串(它们不包含协议、主机或端口)。
req.url 若是出于内部路由目的,则可以重写,但是 req.orginalUrl 旨在保留原始请求
和查询字符串。
req.acceptedLanguages
一个简便方法,用来返回客户端首选的一组(人类的)语言。这些信息是从请求报头中
解析而来的。

响应对象
响应对象(通常传递到回调方法,这意味着你可以随意命名它,通常命名为 res、resp 或response)的生命周期始于 Node 核心对象 http.ServerResponse 的实例。Express 添加了一些附加功能。我们来看看响应对象中最有用的属性和方法(所有这些方法都是由 Express添加的)。
res.status(code)
设置 HTTP 状态代码。Express 默认为 200(成功),所以你可以使用这个方法返回状态404(页面不存在)或 500(服务器内部错误),或任何一个其他的状态码。对于重定向(状态码 301、302、303 和 307),有一个更好的方法:redirect。
res.set(name,value)
设置响应头。这通常不需要手动设置。
res.cookie(name,vaue,[options]),res.clearCookie(name,[options])
设置或清除客户端 cookies 值。需要中间件支持
res.redirect([status],url)
重定向浏览器。默认重定向代码是 302(建立)。通常,你应尽量减少重定向,除非永久移动一个页面,这种情况应当使用代码 301(永久移动)。
res.send(body),res.send(status,body)
向客户端发送响应及可选的状态码。Express 的默认内容类型是 text/html。如果你想改为 text/plain,需要在 res.send 之前调用 res.set('Content-Type','text/plain\')。如果 body 是一个对象或一个数组,响应将会以 JSON 发送(内容类型需要被正确设置),不过既然你想发送 JSON,我推荐你调用 res.json。
res.json(json),res.json(status,json)
向客户端发送 JSON 以及可选的状态码。
res.jsonp(json),req.jsonp(status,json)
向客户端发送 JSONP 及可选的状态码。
res.type(type)
一个简便的方法,用于设置 Content-Type 头信息。基本上相当于 res.set('Content-Type','type'),只是如果你提供了一个没有斜杠的字符串,它会试图把其当作文件的扩展名映射为一个互联网媒体类型。比如,res.type('txt') 会将 Content-Type 设为text/plain。此功能在有些领域可能会有用(例如自动提供不同的多媒体文件),但是通常应该避免使用它,以便明确设置正确的互联网媒体类型。
res.format(object)
这个方法允许你根据接收请求报头发送不同的内容。这是它在 API 中的主要用途,我们将会在第 15 章详细讨论。这里有一个非常简单的例子:res.format({'text/plain':'hithere','text/html':'<b>hi there</b>'})。
res.attachment([filename]),res.download(path,[filename],[callback])
这两种方法会将响应报头 Content-Disposition 设为 attachment,这样浏览器就会选择下载而不是展现内容。你可以指定 filename 给浏览器作为对用户的提示。用 res.download 可以指定要下载的文件,而 res.attachment 只是设置报头。另外,你还要将内容发送到客户端。
res.sendFile(path,[option],[callback])
这个方法可根据路径读取指定文件并将内容发送到客户端。使用该方法很方便。使用静态中间件,并将发送到客户端的文件放在公共目录下,这很容易。然而,如果你想根据条件在相同的 URL 下提供不同的资源,这个方法可以派上用场。
res.links(links)
设置链接响应报头。这是一个专用的报头,在大多数应用程序中几乎没有用处。
res.locals,res.render(view,[locals],callback)
res.locals 是一个对象,包含用于渲染视图的默认上下文。res.render 使用配置的模
请求和响应对象 
板引擎渲染视图(不能把 res.render 的 locals 参数与 res.locals 混为一谈,上下文
在 res.locals 中会被重写,但在没有被重写的情况下仍然可用)。res.render 的默认响
应代码为 200,使用 res.status 可以指定一个不同的代码。
---------------------
作者:Seven_Cld
来源:CSDN
原文:https://blog.csdn.net/christine95/article/details/50500171
版权声明:本文为博主原创文章,转载请附上博文链接!

Node+Express中请求和响应对象的更多相关文章

  1. 【Express】请求和响应对象

    浏览器发送的信息 app.get('/headers', function(req, res){ res.set('Content-Type', 'text/plain'); var s = ''; ...

  2. CakePHP之请求与响应对象

    请求与响应对象 请求与响应对象在 CakePHP 2.0 是新增加的.在之前的版本中,这两个对象是由数组表示的,而相关的方法是分散在RequestHandlerComponent,Router,Dis ...

  3. express-7 请求和响应对象(2)

    获取更多信息 如果正在寻找某些功能,首先要查看Express的API文档 如果需要的信息没在文档中,有时就不得不深入研究Express源码; 下面是Express源码的路径说明 lib/applica ...

  4. express-6 请求和响应对象(1)

    URL的组成部分 协议: 协议确定如何传输请求.我们主要是处理http和https.其他常见的协议还有file和ftp. 主机名: 主机名标识服务器.运行在本地计算机(localhost)和本地网络的 ...

  5. node.js中允许的app对象声明方式

    伪对象形式 app = function () { console.log("我是一个初始化的app对象"); }; app.get=function () { console.l ...

  6. Python Requests-学习笔记(11)-请求与响应对象

    任何时候调用requests.*()你都在做两件主要的事情.其一,你在构建一个 Request 对象, 该对象将被发送到某个服务器请求或查询一些资源.其二,一旦 requests 得到一个从 服务器返 ...

  7. wrk 压测中请求无法响应问题解决过程

    ================= 遇到问题 =================$ 直连压测 wrk -c10000 -t100 -d100m http://localhost:9981/order/ ...

  8. node express中使用static的错误

    使用express中的static可以设置文件存储路径,比如js存在于public/js//demo.js这个时候可以将js文件夹设置为专门存储js的路径,代码如下: app.use('/javasc ...

  9. SSM-SpringMVC-19:SpringMVC中请求和响应的乱码解决

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 配置一道拦截器即可解决乱码 配置方式如下: 在web.xml中: <!--过滤器处理乱码--> ...

随机推荐

  1. ASP.NET给前端动态添加修改 CSS样式JS 标题 关键字(转载)

    原文地址:http://www.cnblogs.com/xbhp/p/6392225.html 有很多网站读者能换自己喜欢的样式,还有一些网站想多站点共享后端代码而只动前段样式,可以采用动态替换CSS ...

  2. Python基础 — Pandas

    Pandas -- 简介 Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.        Pandas ...

  3. bzoj 1709: [Usaco2007 Oct]Super Paintball超级弹珠【枚举】

    k是1e5范围的,吗? 注意到n只有100,这意味着k去重之后之后n^2,也就是1e4! 然后就可以愉快的n^4枚举了,枚举每个格子,再枚举每个敌人,如果当前格子射不到敌人则退出,否则满足所有敌人则a ...

  4. jenkins手把手教你从入门到放弃02-jenkins在Windows系统安装与配置(详解)

    简介 上一篇对jenkins有了大致了解之后,那么我们就开始来安装一下jenkins. Jenkins安装 一.安装Java环境 1.你需要做的第一件事情就是在你的机器上安装Java环境.Jenkin ...

  5. 乐搏讲自动化测试- Python自动化测试前景怎么样(4)

    Python言语还能够写爬虫,但仅仅只是爬虫的入门罢了.通过Python入门爬虫比较简略易学,不需要在一开始把握太多太根底太底层的常识就能够很快上手,而且很快能够做出成果,十分合适小白一开始想做出点看 ...

  6. taro.js & dva 脚手架搭建及常见问题

    ## taro.js & dva 脚手架 ### 启动 npm install -g @tarojs/cli // 全局安装taro-cli npm i npm run dev:weapp / ...

  7. 洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)

    题面 传送门 题解 日常敲板子.jpg //minamoto #include<bits/stdc++.h> #define R register #define inline __inl ...

  8. Asp.Net 开发实战技术

    1.什么是WMI技术 WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问.配置.管理和监视几乎所有的Windows资源,比如用户可以在远程计算机器上启动一个进程:设 ...

  9. Windows 7上安装Microsoft Loopback Adapter(微软环回网卡)

    Oracle 安装过程中,先决条件检查遇到如下错误: 正在检查网络配置要求...  检查完成.此次检查的总体结果为: 失败 <<<<  问题: 安装检测到系统的主 IP 地址是 ...

  10. mysql中数据库的设计

      软件开发流程(CMMI): 1):项目启动; 2):项目计划: 3):需求分析; 需要得到的结果是什么? 4):系统设计;         该怎么做? 5):系统开发; 6):系统测试; 7):系 ...