http
Node.js 标准库提供了 http 模块,其中封装了一个高效的 HTTP 服务器和一个简易的HTTP 客户端。http.Server 是一个基于事件的 HTTP 服务器,它的核心由 Node.js 下层 C++部分实现,而接口由 JavaScript 封装,兼顾了高性能与简易性。http.request 则是一个HTTP 客户端工具,用于向 HTTP 服务器发起请求。
引用模块,并创建一个服务
const http = require('http');
const server = http.createServer((req,res) =>{
res.writeHead(200,{"Content-Type":"text/plain;charset=utf-8");
res.end("Hello World")
});
server.listen(8080);
启动起来后在浏览器内输入localhost://8080
即可在访问,内容显示为Hello World
;
如果我们需要把一个页面展示到浏览器里面,可以这样实现。
const http = require('http');
const fs = require('fs');
const server = http.createServer((req,res) => {
res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});
fs.readFile("./index.html", function (err, data) {
if (err) {
res.end("连接服务器错误");
throw err;
} else {
res.end(data);
}
});
})
server.listen(9696);
访问该地址后我们就能看的指定的页面。
get
我们可以用一个简单的get
请求扒取网络数据:
const http = require('http');
http.get('http://baidu.com',function (req,res) {
let html = '';
req.on('data',function (data) {
html += data;
});
req.on('end',function () {
console.log(html);
})
});
得到数据为:
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
我们知道,get
发送请求时,如果有数据会把数据以参数形式绑定到url
上,然后传递给后端。
const http = require('http');
const url = require('url');
const util = require('util');
http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain;charset=utf-8'});
// 解析 url 参数
const params = url.parse(req.url, true).query;
res.write("网站名:" + params.name);
res.write("\n");
res.write("网站 URL:" + params.url);
res.end();
}).listen(3000);
然后在浏览器里输入http://localhost:3000/user?name=gallon&url=www.sina.com
,即可输出:
网站名:gallon
网站 URL:www.sina.com
当get
发起请求时,我们可以解析url而获得我们想要的参数。
post
POST请求的内容全部都在请求体重,http.ServerRequest
并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。所以node.js
默认不会解析请求体,当你需要时,需要手动来做。
const http = require('http');
const querystring = require('querystring');
const postHTML =
'<html><head><meta charset="utf-8"><title>Node.js 实例</title></head>' +
'<body>' +
'<form method="post">' +
'网站名: <input name="name"><br>' +
'网站 URL: <input name="url"><br>' +
'<input type="submit">' +
'</form>' +
'</body></html>';
http.createServer( (req, res) => {
let body = "";
req.on('data', (chunk) => {
body += chunk;
});
req.on('end', () => {
body = querystring.parse(body);
res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
if(body.name && body.url) {
res.write(`网站名:${body.name}`);
res.write("<br>");
res.write(`网站 URL:${body.url}`);
} else {
res.write(postHTML);
}
res.end();
});
}).listen(3000);
这样可以简单地处理post请求。
路由
当我们起一个node
服务时,如果不做任何处理,如下:
const http = require('http');
http.createServer( (req, res) => {
res.writeHead(200,
{"Content-Type":"text/html;charset='utf-8'"}
);
res.end("<h1>我是个小小鸟</h1>")
}).listen(3000);
我们在浏览器输入http://localhost:3000
访问到的是我们写进去的内容,当输入http://localhost:3000/gallon
或者http://localhost:3000/index.html
同样是刚写进去的内容,这个时候就需要区分req
中的url
已达到路由的效果。
const http = require('http');
http.createServer( (req, res) => {
if(req.url === '/gallon'){
res.writeHead(200,
{"Content-Type":"text/html;charset='utf-8'"}
);
res.end("<h1>我是个小小鸟</h1>")
}else if(req.url === '/index.html'){
res.writeHead(200,
{"Content-Type":"text/html;charset='utf-8'"}
);
res.end("<h1>这是首页</h1>")
}
}).listen(3000);
这样就实现了一个简单的路由效果。
express
Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。使用Express可以快速地搭建一个完整功能的网站。
Express 框架的核心特性:
1.可以设置中间件来响应 HTTP 请求。
2.定义了路由表用于执行不同的 HTTP 请求动作。
3.可以通过向模板传递参数来动态渲染 HTML 页面。
简单的express应用,由于express不是node
内置的工具,故需要安装。
const express = require('express');
const app = express();
app.get('/index.html',(req,res) =>{
res.send('Hello World');
}).listen(2000);
在浏览器中输入localhost:2000/index.html
即可访问到相应内容。通过express
可以很方便地实现post
和get
服务。
request和response的对象介绍:
Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:
req.app:当callback为外部文件时,用req.app访问express的实例
req.baseUrl:获取路由当前安装的URL路径
req.body / req.cookies:获得「请求主体」/ Cookies
req.fresh / req.stale:判断请求是否还「新鲜」
req.hostname / req.ip:获取主机名和IP地址
req.originalUrl:获取原始请求URL
req.params:获取路由的parameters
req.path:获取请求路径
req.protocol:获取协议类型
req.query:获取URL的查询参数串
req.route:获取当前匹配的路由
req.subdomains:获取子域名
req.accepts():检查可接受的请求的文档类型
req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一个可接受字符编码
req.get():获取指定的HTTP请求头
req.is():判断请求头Content-Type的MIME类型
Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:
res.app:同req.app一样
res.append():追加指定HTTP头
res.set()在res.append()后将重置之前设置的头
res.cookie(name,value [,option]):设置Cookie
opition: domain / expires / httpOnly / maxAge / path / secure / signed
res.clearCookie():清除Cookie
res.download():传送指定路径的文件
res.get():返回指定的HTTP头
res.json():传送JSON响应
res.jsonp():传送JSONP响应
res.location():只设置响应的Location HTTP头,不设置状态码或者close response
res.redirect():设置响应的Location HTTP头,并且设置状态码302
res.send():传送HTTP响应
res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
res.set():设置HTTP头,传入object可以一次设置多个头
res.status():设置HTTP状态码
res.type():设置Content-Type的MIME类型
静态文件托管:
当我们编写html时,需要用到静态资源,比如image
和css
时,直接通过./
引用会报错,因为它们没挂载到该服务下,即通过localhost:****/
你是访问不到该资源,前面我们可以通过fs读取文件内容后放在指定url下,但是这样很麻烦。express给我们提供了一个便捷的方法,即
const express = require('express');
const app = express();
app.use((express.static('public'));
public
为公共资源文件夹。
通常,express
与swig
结合可在html
中绑定变量。
express.js
const express = require('express');
const swig = require('swig');
const app = express();
app.engine('html',swig.renderFile);
app.set('views',__dirname + '/gallon');
app.set('view engine','html');
app.get('/index.html',(req,res) =>{
res.render('index.html',{content:"走一个"});
}).listen(2000);
index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>这是首页</h1>
<h2>{{content}}</h2>
</body>
</html>
在浏览器中访问localhost:2000/index.html
即可得到相应内容。