文章目录
- 前提
- 创建一个最基本的http服务器
- req有哪些值得关注的信息
- res常用的api
- http.request(options[, callback])
- server事件监听
- checkContinue
- checkExpectation
- close
- connect
前提
如果你觉得nodejs官方文档给的api太多,不知道哪些重要,请看下去,否则请前往https://nodejs.org/dist/latest-v10.x/docs/api/http.html
如果你认为官方文档全是英文,不太容易学,并且不在乎nodejs中文网站版本过低的问题,请前往
https://www.nodeapp.cn/http.html
创建一个最基本的http服务器
const http = require("http");
const server = http.createServer();
// 启动服务器,服务器端口在80
server.listen(80, "127.0.0.1", () => {
console.log("服务器启动了");
});
// 对客户端的请求进行监听
server.on("request", (req, res) => {
console.log("客户端请求了");
console.log(req);
res.write('请求结果')
res.end()
});
req有哪些值得关注的信息
req是用来获取客户端请求信息的对象。
key | 作用 |
---|---|
url | 请求的路由 |
method | 请求的方式 |
headers | 请求头 |
httpVersion | http的版本 |
res常用的api
res是用来返回给客户端的数据的设置
key | 作用 |
---|---|
statusCode | 设置响应码 比如 res.statusCode = 404 |
end | 结束当前的请求 该方法会通知服务器,所有响应头和响应主体都已被发送 res.end() 每次响应都必须调用 |
setHeader | 设置响应头 |
statusMessage | 设置响应码对应的响应信息 res.statusMessage = ‘not found it’ |
write | 该方法会发送一块响应主体。 它可被多次调用,以便提供连续的响应主体片段 res.write(‘结果’,‘utf-8’) |
setTimeout | 设置超时的时间 res.setTimeout(msecs [, callback]) |
const http = require("http");
const server = http.createServer();
// 启动服务器,服务器端口在80
server.listen(80, "127.0.0.1", () => {
console.log("服务器启动了");
});
// 对客户端的请求进行监听
server.on("request", (req, res) => {
console.log("客户端请求了");
// charset=utf-8 防止中文乱码
res.setHeader('Content-Type', 'text/html;charset=utf-8');
res.statusCode = 404
res.statusMessage = 'not found it'
res.write('请求结果','utf-8')
res.end()
});
http.request(options[, callback])
在实际开发中,我们常常将nodejs作为一个中转站,nodejs去请求目标服务器的数据,经过处理后,再通过nodejs的接口,将数据提供给客户端。
http 能够用来创建一个接口,开启一整个服务器以供客户端请求,当然也可以请求其它的接口。
http的request的方法,就用来请求接口,第一个参数options必填,主要是请求的一些基本参数。
options <Object> | <string> | <URL>
protocol <string> 使用的协议。默认为 http:。
host <string> 请求发送至的服务器的域名或 IP 地址。默认为 localhost。
hostname <string> host 的别名。为了支持 url.parse(),hostname 优先于 host。
family <number> 当解析 host 和 hostname 时使用的 IP 地址族。 有效值是 4 或 6。当未指定时,则同时使用 IP v4 和 v6。
port <number> 远程服务器的端口。默认为 80。
localAddress <string> 为网络连接绑定的本地接口。
socketPath <string> Unix 域 Socket(使用 host:port 或 socketPath)。
method <string> 指定 HTTP 请求方法的字符串。默认为 'GET'。
path <string> 请求的路径。默认为 '/'。 应包括查询字符串(如有的话)。如 '/index.html?page=12'。 当请求的路径中包含非法字符时,会抛出异常。 目前只有空字符会被拒绝,但未来可能会变化。
headers <Object> 包含请求头的对象。
auth <string> 基本身份验证,如 'user:password' 用来计算 Authorization 请求头。
agent <http.Agent> | <boolean> 控制 Agent 的行为。 可能的值有:
undefined (默认): 对该主机和端口使用 http.globalAgent。
Agent 对象:显式地使用传入的 Agent。
false: 创建一个新的使用默认值的 Agent。
createConnection <Function> 当不使用 agent 选项时,为请求创建一个 socket 或流。 这可以用于避免仅仅创建一个自定义的 Agent 类来覆盖默认的 createConnection 函数。详见 agent.createConnection()。 Any Duplex stream is a valid return value.
timeout <number>: 指定 socket 超时的毫秒数。 它设置了 socket 等待连接的超时时间。
第二个参数是回调函数,可以在回调函数中获取响应头和响应体,状态码等信息
const http = require("http");
const server = http.createServer();
// 启动服务器,服务器端口在80
server.listen(80, "127.0.0.1", () => {
console.log("服务器启动了");
});
// 对客户端的请求进行监听
server.on("request", (req, res) => {
console.log("客户端请求了");
// charset=utf-8 防止中文乱码
res.setHeader('Content-Type', 'text/html;charset=utf-8');
res.statusCode = 404
res.statusMessage = 'not found it'
res.write('请求结果','utf-8')
res.end()
});
// 请求刚刚创建的服务器
const options = {
hostname: '127.0.0.1',
port: 80,
path: '/',
method: 'get',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
}
};
const req = http.request(options, (res) => {
console.log(`状态码: ${res.statusCode}`);
console.log(`响应头: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`响应主体: ${chunk}`);
});
res.on('end', () => {
console.log('响应中已无数据。');
});
});
req.end();
注意,在例子中调用了 req.end()。 使用 http.request() 必须总是调用 req.end() 来表明请求的结束,即使没有数据被写入请求主体
如果请求过程中遇到任何错误(DNS 解析错误、TCP 级的错误、或实际的 HTTP 解析错误),则在返回的请求对象中会触发 ‘error’ 事件。 对于所有的 ‘error’ 事件,如果没有注册监听器,则抛出错误。
server事件监听
最常用的无疑就是上面代码所用的request,除了request外,还有checkContinue、checkExpectation、clientError、close、connect、connection、upgrade
checkContinue
客户端如果是post请求,可能会使用 Expect: 100-continue,即在请求头中加入 {“Expect”:”100-continue”}
服务端每当接收到一个带有 HTTP Expect: 100-continue 请求头的请求时触发。 如果该事件未被监听,则服务器会自动响应 100 Continue。即默认同意与客户端握手,客户端可以开始发送post请求。
checkExpectation
与checkContinue正好相反,服务端每当接收到一个带有 HTTP Expect 请求头(值不为 100-continue)的请求时触发。 如果该事件未被监听,则服务器会自动响应 417 Expectation Failed。
注意,当该事件被触发且处理后,‘request’ 事件不会被触发。
close
当关闭服务器时触发
connect
每当客户端发送 HTTP CONNECT 请求时触发。 如果该事件未被监听,则发送 CONNECT 请求的客户端会关闭连接。