http是Node.js的核心模块之一,要使用http模块,需要:
const http = require('http')
创建一个服务器
使用到的api:
http.createServer([options][, requestListener])
-
options
<Object>-
IncomingMessage
<http.IncomingMessage> 指定要使用的IncomingMessage
类。用于扩展原始的IncomingMessage
。默认值:IncomingMessage
。 -
ServerResponse
<http.ServerResponse> 指定要使用的ServerResponse
类。用于扩展原始ServerResponse
。默认值:ServerResponse
。
-
-
requestListener
<Function> -
返回: <http.Server>
此方法返回一个新建的http.Server
实例。
http.Server
类,继承自net.Server
,net模块也是核心内置模块之一,用于创建基于流的 TCP 或 IPC 的服务器(net.createServer()
)与客户端(net.createConnection()
)。net.Server
类用于创建 TCP 或 IPC server
。
Server类的部分api:
- server.listen():启动 HTTP 服务器监听连接。 此方法与
net.Server
中的server.listen()
相同。- server.close([callback]):停止服务器接受新连接
const http = require('http')
const fs = require('fs')
const path = require('path')
http.createServer((req,res)=>{
const {url,method} = req;
console.log('来了一个请求');
if(url === '/' && method === 'GET'){
//读取首页
fs.readFile(path.resolve('./index.html'),(err,data)=>{
if(err){
res.statusCode = 500;//服务器内部错误
res.end('500 - Internal Sever Error')
return;
}
res.statusCode = 200;//请求成功
res.setHeader('Content-Type','text/html')
//end方法可以使用buffer,加不加toString都可以
res.end(data)
})
}
}).listen(3000);
以上的createServer方法传入一个函数作为参数,此函数有两个参数,第一个参数是一个对象,表示客户端的HTTP请求,第二个参数也是一个对象,表示服务端的HTTP回应。服务端的HTTP回应调用writeHead
方法写入HTTP回应的头信息,使用end
方法写入HTTP回应的具体内容,并关闭对话。listen方法传入数字作为端口,表示启动服务器实例,监听本机特定端口。
http.ClientRequest 类
这个类产生的实例表示正在进行的请求,由http.request()
内部创建并返回,createServer
方法的回调函数中第一个参数也是此类的实例。
修改请求头
- request.setHeader(name, value):为请求头对象设置单个请求头的值。
request.setHeader('Content-Type', 'application/json');
- request.getHeader(name):获取请求头,名称不区分大小写
request.setHeader('content-type', 'text/html');
request.setHeader('Content-Length', Buffer.byteLength(body));
request.setHeader('Cookie', ['type=ninja', 'language=javascript']);
const contentType = request.getHeader('Content-Type');
// contentType 是 'text/html'。
const contentLength = request.getHeader('Content-Length');
// contentLength 的类型为数值。
const cookie = request.getHeader('Cookie');
// cookie 的类型为字符串数组。
完成发送请求
request.end([data[, encoding]][, callback])
-
data
<string> | <Buffer>:指定了data
,则相当于调用request.write(data, encoding)
之后再调用request.end(callback)
。 -
encoding
<string> -
callback
<Function> - 返回: <this>
中止请求
request.abort()
将请求标记为中止。 调用此方法将导致响应中剩余的数据被丢弃并且套接字被销毁
发送数据到服务器
request.write(chunk[, encoding][, callback])
-
chunk
<string> | <Buffer> -
encoding
<string> -
callback
<Function> - 返回: <boolean>
发送一个请求主体的数据块。 通过多次调用此方法,可以将请求主体发送到服务器,在这种情况下,建议在创建请求时使用 ['Transfer-Encoding', 'chunked'] 请求头行。
encoding 参数是可选的,仅当 chunk 是字符串时才适用。 默认为 'utf8'。
callback 参数是可选的,当刷新此数据块时调用,但仅当数据块非空时才会调用。
http.ServerResponse 类
此类的实例由HTTP服务器在内部创建,不用用户创建,它作为createServer
第二个参数传给request
事件。
此实例可调用的常用api:
- response.end([data][, encoding][, callback]):向服务器发出信号,表明已发送所有响应头和主题,必须在每个响应上调用此方法,如果指定了
data
,则相当于调用response.write(data, encoding)
之后再调用response.end(callback)
- response.getHeader(name):读出已排队但未发送到客户端的响应头。 请注意,该名称不区分大小写。
- response.setHeader(name, value):为隐式响应头设置单个响应头的值。
// 返回 content-type = text/plain
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'text/html');
res.setHeader('X-Foo', 'bar');
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('ok');
});
- response.write(chunk[, encoding][, callback]):发送一块响应主体。
- response.writeHead(statusCode[, statusMessage][, headers]):向请求发送响应头
http.IncomingMessage 类
IncomingMessage
对象由 http.Server
或 http.ClientRequest
创建,并分别作为第一个参数传给 'request'
和 'response'
事件。 它可用于访问响应状态、消息头、以及数据。
网友评论