http

http

  • http.METHODS 解析器支持的 HTTP 方法列表
http.METHODS // [ 'ACL', 'BIND', 'CHECKOUT', 'CONNECT', 'COPY', 'DELETE', 'GET', 'HEAD',...]
  • http.STATUS_CODES 所有标准 HTTP 响应状态代码的集合
http.STATUS_CODES // { '100': 'Continue', '101': 'Switching Protocols', '102': 'Processing', '103': 'Early Hints', '200': 'OK', ...}
  • http.createServer([options][, requestListener]) 创建服务

以下两种代码等价:

const http = require('http');
// 创建本地服务器来从其接收数据
const server = http.createServer((req, res) => {});
server.listen(8000);
const http = require('http');
// 创建本地服务器来从其接收数据
const server = http.createServer();
// 监听请求事件
server.on('request', (request, res) => {});
server.listen(8000);
  • http.get(url[, options][, callback]) 服务器请求 其他服务器资源
http.get('http://www.baidu.com',(res)=>{
    var html = ""
    res.on("data", data =>  html+=data )
    res.on("end",() => console.log(html))
}).on("error",(e)=>{
    console.log(`获取数据失败: ${e.message}`)
})
  • http.request(url[, options][, callback]) 服务器向 其他服务器资源 提交数据
// 1. 创建连接
const req = http.request({
  hostname: 'www.baidu.com',
  port: 80,
  path: '/upload',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  }
}, (res) => {
  // 4. 收到返回数据
  console.log(`STATUS: ${res.statusCode}`);
  console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
  res.setEncoding('utf8');
  res.on('data', chunk => console.log(`BODY: ${chunk}`);
  res.on('end', () => console.log('No more data in response.'));
});

req.on('error', (e) => {
  console.error(`problem with request: ${e.message}`);
});

// 2. 将数据写入请求正文
req.write(JSON.stringify({
  'msg': 'Hello World!'
}));
// 3. 发送数据
req.end();

http服务实例

  • 'close' 事件
server.on('close', () => console.log('close')); // 服务器关闭时触发
  • 'connection' 事件
server.on('connection', () => console.log('connection')); // 建立新的 TCP 流时会触发此事件
  • 'request' 事件
server.on('request', (request, res) => {}); // 每次浏览器来请求服务器,都会出发
  • server.close([callback]) 停止服务器
  • server.listening

<boolean> 指示服务器是否正在监听连接。

  • server.maxHeadersCount
server.maxHeadersCount = 3000 // 限制最大传入标头计数。 如果设置为 0,则不会应用任何限制。(默认值: 2000)
  • server.requestTimeout
server.requestTimeout = 60 * 1000; // 设置从客户端接收整个请求的超时值(以毫秒为单位)(默认值:0)

response

res.writeHead(200, {
  'Content-Type': 'application/json; urf-8',
  'Cache-Control': 'no-cache'
})
res.setHeader('Content-Type', 'application/json; urf-8')
res.setHeader('Cache-Control', 'no-cache')
  • response.end([data[, encoding]][, callback])
res.end('data'); // 给浏览器发送数据
  • response.getHeader(name)
response.setHeader('Content-Type', 'text/html');
response.getHeader('content-type') // contentType 是 'text/html'; 读取已排队但未发送到客户端的标头
  • response.getHeaderNames()
response.setHeader('Foo', 'bar');
response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);
response.getHeaderNames(); // ['foo', 'set-cookie']
  • response.getHeaders()
response.getHeaders(); // { foo: 'bar', 'set-cookie': ['foo=bar', 'bar=baz'] }
  • response.hasHeader(name)

返回 Boolean,相应头是否有name字段

  • response.removeHeader(name)

相应头,移除name字段

  • response.statusCode
response.statusCode = 404; // 设置响应 状态码
  • response.statusMessage
response.statusMessage = 'Not found'; // 设置响应 状态信息
  • response.writeHead(statusCode[, statusMessage][, headers])
  • 其他见官方文档

request

  • request.setHeader(name, value)
request.setHeader('Content-Type', 'application/json');  // 设置请求头
  • request.removeHeader(name)
request.removeHeader('Content-Type'); // 删除请求头中的 指定 字段
  • request.getHeader(name)
request.setHeader('content-type', 'text/html'); // 设置请求头
  • request.getRawHeaderNames()
// 获取请求头 字段
request.getRawHeaderNames(); // ['Foo', 'Set-Cookie'] 
  • request.path 请求的路径
  • request.method 请求的方法
  • request.host 请求的主机
  • request.protocol 请求的协议
  • 其他见官方文档

创建静态资源服务

image.png
const http = require('http')
const fs = require('fs')
const path = require('path')

const server = http.createServer(async(req, res) => {
  let fPath = '',
      baseUrl = path.resolve('www');
  if (req.url === '/') {
    fPath = path.join(baseUrl, 'index.html')
  } else {
    fPath = path.join(baseUrl, req.url)
  }

  const str = await fs.readFileSync(fPath, 'utf-8')
  res.end(str)
})

server.listen(3000, () => {
  console.log('run')
})
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容