express-6 请求和响应对象(1)
URL的组成部分###

- 协议:
协议确定如何传输请求。我们主要是处理http和https。其他常见的协议还有file和ftp。 - 主机名:
主机名标识服务器。运行在本地计算机(localhost)和本地网络的服务器可以简单地表示,比如用一个单词,或一个数字IP地址。在Internet环境下,主机名通常以一个顶级域名(TLD)结尾,比如.com或.net。另外,也许还会有子域名作为主机名的前缀。子域名可以是任何形式的,其中www最为常见。子域名通常是可选的。 - 端口:
每一台服务器都有一系列端口号。一些端口号比较“特殊”,如80和443端口。如果省略端口值,那么默认80端口负责HTTP传输,443端口负责HTTPS传输。如果不使用80和443端口,就需要一个大于1023(0~1023端口为“知名端口”)的端口号。通常使用容易记忆的端口号,如3000、8080或8088。 - 路径:
查询字符串是一种键值对集合,是可选的。它以问号(?)开头,键值对则以与号(&)分隔开。所有的名称和值都必须是URL编码的。对此,JavaScript提供了一个嵌入式的函数encodeURIComponent来处理。例如,空格被加号(+)替换。其他特殊字符被数字型字符替换。 - 信息片段:
**信息片段(或散列)被严格限制在浏览器中使用,不会传递到服务器。用它控制单页应用或AJAX富应用越来越普遍。最初,信息片段只是用来让浏览器展现文档中通过锚点标记(<a id="chapter06">)指定的部分。
**
互联网媒体类型###
内容类型报头信息极其重要,没有它,客户端很难判断如何渲染接收到的内容。内容类型报头就是一种互联网媒体类型,由一个类型、一个子类型以及可选的参数组成。例如,text/html;charset=UTF-8说明类型是text,子类型是html,字符编码是UTF-8。
互联网编号分配机构维护了一个官方的互联网媒体类型清单
常见的content type、Internet media type和MIME type是可以互换的。MIME(多用途互联网邮件扩展)是互联网媒体类型的前身,它们大部分是相同的。
HTTP请求方法###
在浏览器中键入一个URL(或点击一个链接),服务器会接收到一个HTTP GET请求,其中的重要信息是URL路径和查询字符串。至于如何响应,则需要应用程序结合方法、路径和查询字符串来决定。
对于一个网站来说,大部分页面都响应GET请求。POST请求通常用来提交信息到服务器后台(例如表单处理)。
使用Node和Express,可以完全掌控响应方法。在Express中,通常要针对特殊方法编写处理程序。
请求报头###
我们浏览网页时,发送到服务器的并不只是URL。当你访问一个网站时,浏览器会发送很多“隐形”信息; 服务器会因此得知优先响应哪种语言的页面,也会发送“用户代理”信息(浏览器、操作系统和硬件设备)和其他一些信息。
app.get('/header', 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);
});
请求体###
除请求报头外,请求还有一个主体。一般GET请求没有主体内容,但POST请求是有的。POST请求体最常见的媒体类型是application/x-www-form-urlendcoded,是键值对集合的简单编码,用&分隔(基本上和查询字符串的格式一样)。如果POST请求需要支持文件上传,则媒体类型是multipart/form-data,它是一种更为复杂的格式。最后是AJAX请求,它可以使用application/json。
参数###
对于任何一个请求,参数可以来自查询字符串、会话(请求cookies)、请求体或指定的路由参数。
在Node应用中,请求对象的参数方法会重写所有的参数
请求对象###
请求对象(通常传递到回调方法,这意味着可以随意命名,通常命名为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.headers
从客户端接收到的请求报头。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
一个简便方法,用来返回客户端首选的一组(人类的)语言。这些信息是从请求报头中解析而来的。
响应报头###
当服务器响应时,同样会回传一些浏览器没必要渲染和显示的信息,通常是元数据和服务器信息; 包括内容类型,响应信息是否被压缩,以及使用的是哪种编码。响应报头还可以包含关于浏览器对资源缓存时长的提示。响应报头还经常会包含一些关于服务器的信息,一般会指出服务器的类型,有时甚至会包含操作系统的详细信息。返回服务器信息存在一个问题,那就是它会给黑客一个可乘之机,从而使站点陷入危险。非常重视安全的服务器经常忽略此信息,甚至提供虚假信息。禁用Express的X-Powered-By头信息(显示服务器信息)很简单:
app.disable('x-powered-by');
响应对象###
响应对象(通常传递到回调方法,这意味着你可以随意命名它,通常命名为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':'hi there','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可以指定一个不同的代码。
express-6 请求和响应对象(1)的更多相关文章
- Node+Express中请求和响应对象
在用 Express 构建 Web 服务器时,大部分工作都是从请求对象开始,到响应对象终止. url的组成: 协议协议确定如何传输请求.我们主要是处理 http 和 https.其他常见的协议还有 f ...
- 【Express】请求和响应对象
浏览器发送的信息 app.get('/headers', function(req, res){ res.set('Content-Type', 'text/plain'); var s = ''; ...
- CakePHP之请求与响应对象
请求与响应对象 请求与响应对象在 CakePHP 2.0 是新增加的.在之前的版本中,这两个对象是由数组表示的,而相关的方法是分散在RequestHandlerComponent,Router,Dis ...
- express-7 请求和响应对象(2)
获取更多信息 如果正在寻找某些功能,首先要查看Express的API文档 如果需要的信息没在文档中,有时就不得不深入研究Express源码; 下面是Express源码的路径说明 lib/applica ...
- Python Requests-学习笔记(11)-请求与响应对象
任何时候调用requests.*()你都在做两件主要的事情.其一,你在构建一个 Request 对象, 该对象将被发送到某个服务器请求或查询一些资源.其二,一旦 requests 得到一个从 服务器返 ...
- Django请求响应对象
请求与响应对象 HttpRequest HttpRequest存储了客户请求的相关参数和一些查询方法. path 请求页面的全路径,不包括域名-例如, "/hello/". met ...
- HeadFirst Jsp 04 (请求和响应作为servlet)
servlet 的存在就是为了客服服务, servlet的任务是得到一个客户的请求, 再发回一个响应. 由上图可知, web 容器会在启动后就加载所有的servlet类, 并为之创建实例和初始化 注意 ...
- Servlet请求和响应
在Java Web中Servlet.请求和响应是最基本的三个对象,在Web容器的管理下,这三者能够完成基本的HTTP请求处理. Servlet的作用是为客户提供服务.servlet的角色是接受一个客户 ...
- flask之请求与响应、闪现(阅后即焚)、请求扩展(before,after)、中间件、LOCAL对象、偏函数、
目录 1.flask请求与响应 2.闪现 3.请求扩展 4.中间件 5.LOCAL对象 6.偏函数 templates 1.flask请求与响应 from flask import Flask,req ...
随机推荐
- August 24th 2016 Week 35th Wednesday
Storms make trees take deeper roots. 暴风雨能使大树的根扎得更深. If the trees already have deep roots, then the s ...
- poj1456(贪心+并查集)
题目链接: http://poj.org/problem?id=1456 题意: 有n个商品, 已知每个商品的价格和销售截止日期, 每销售一件商品需要花费一天, 即一天只能销售一件商品, 问最多能买多 ...
- NYOJ题目273字母小游戏
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAswAAAIZCAIAAAA9QP7RAAAgAElEQVR4nO3dPXKjzBqG4bMJ5VqIU2
- hdu1014
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1014 //hdu1014 0ms #include<stdio.h> #include&l ...
- JavaScript基础——处理字符串
String对象是迄今为止在JavaScript中最常用的对象.在你定义一个字符串数据类型的变量的任何时候,JavaScript就自定为你创建一个String对象.例如: var myStr = &q ...
- Jmeter 中使用非GUI启动进行压力测试
使用非 GUI 模式,即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资源.使用命令jmeter -n -t <testplan filename> -l <list ...
- .NET开发工具之Excel导出公共类
来源:Pino晨 链接:cnblogs.com/chenxygx/p/5954870.html 说明 最近接了一个任务,就是做一个列表的Excel导出功能.并且有很多页面都会使用这个功能. 导出的Ex ...
- Windows 10 周年更新正式版下载 + win10 快捷键
Windows 10 周年更新正式版 360云资源总汇(施工中): https://yunpan.cn/c6Svi7Az52XBs (提取码:e5dd)今后提到周年更新版.1607版或RS1版,都是 ...
- Delphi面向对象编程
一.面向对象介绍 OOP是使用独立的对象(包含数据和代码)作为应用程序模块的范例.虽然OOP不能使得代码容易编写,但是它能够使得代码易于维护.将数据和代码结合在一起,能够使定位和修复错误的工作简单化, ...
- 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】
一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...